程式在ld的時候會給so設乙個載入位址,可以通過」-ttext-segment=0x12345678」去指定該so的位址。
ldd exec、 gdb的info sharedlibrary可檢視其載入位址。
程式在執行過程中訪問非法記憶體時,會丟擲異常,段錯誤:program terminated with signal sigse**, segmentation fault.
原因:記憶體唯讀、或者被保護
訪問到null
(讀寫越界?)
程式在執行過程中,也可以自己丟擲異常
rte_panic() (intel dpdk library)
使用前提:
編譯時必須帶上-g引數!!!!
debug版本為了獲得更多的資訊-o0 -ggdb3,盡量不要指定優化等級-o2|-o3,會導致某些變數值獲取不到!!!!
現在啟動
(1) gdb exec
(2) gdb --args exec ar**
程式已經執行,gdb直接關聯到已執行的程式
(1) gdb -p pid
(2) gdb attach
分析生成的core,
(1) gdb exec core
嵌入式環境gdb方式
(1) 在目標板:
① crosscompile-gdbserver + 宿主機ip:port+ exec
(2) 在宿主機:
① crosscompile-gdb + exec
② target remote 目標板ip:port
設定lib路徑時可以替換striped->no striped,甚至重新編譯-g引數,前提是原始碼未改動!
用l或者list確認是否讀取到原始檔
set args
show args
path 設定程式的執行環境
show paths
set environment
show environment
cd pwd
s -- 執行下一步,並進入 (step)
n -- 執行下一步,不進入 (next)
c continue
r run --從頭開始執行
列印當前函式的呼叫棧資訊
backtrace n是乙個正整數,表示只列印棧頂上n層的棧資訊。
backtrace -n表乙個負整數,表示只列印棧底下n層的棧資訊。
frame 切換棧
up 表示向棧的上面移動n層,可以不打n,表示向上移動一層。
down 表示向棧的下面移動n層,可以不打n,表示向下移動一層。
info frame更詳細的棧層資訊
info args 列印出當前函式的引數名及其值。
info locals 列印出當前函式中所有區域性變數及其值。
info catch 列印出當前的函式中的異常處理資訊。
怎麼看frame - 棧?
左邊是frame號,f + 切換到對應frame號,
break 斷在下一條將要執行的指令
break 斷在函式
break 指定行號
break +/-offset 在當前行號的前後偏移行斷住
break filename:linenum 指定檔案和行數
bread *address 指定的記憶體位址
break … if 條件斷點:條件滿足時,程式斷住
info breakpoints [n] 檢視斷點,n表示斷點號
watch 為表示式設定觀察點,一旦值發生變化,馬上停住程式
rwatch [-l|-location] expression
awatch [-l|-location] expression
info watchpoints 列出觀察點
gdb可以捕捉程式的所有訊號
handle signal [actions]
可以以sig開頭或不以sig開頭,可以用定義乙個要處理訊號的範圍
一旦被除錯的程式接收到訊號,執行程式馬上會被gdb停住
actions: "stop", "nostop", "print", "noprint","pass", "nopass", "ignore", "noignore".
info signals,列出訊號資訊
info handles, 列出gdb對這些訊號的action
info threads --- 列出所有執行緒,可以看到執行緒在此時的狀態,尤其是執行緒間存在資源競爭時,例如死鎖時,可以看鎖當前的所有者
t ---- 轉到執行緒n
(為了方便除錯,最好為特殊的執行緒設定執行緒名,pthread_setname_np())
file 檢視檔案的arch、32/64、strip...
readelf (-h、-d)
objdump (-t...)
nmldd
addr2line
使用GDB命令列偵錯程式除錯C C 程式
沒有偵錯程式的情況下編寫程式時最糟糕的狀況是什麼?編譯時跪著祈禱不要出錯?用血祭召喚惡魔幫你執行程式?或者在每一行 間新增printf test 語句來定位錯誤點?如你所知,編寫程式時不使用偵錯程式的話是不方便的。幸好,linux下除錯還是很方便的。大多數人使用的ide都整合了偵錯程式,但 linu...
程式除錯gdb基礎
gcc 編譯器 gcc是linux平台下最重要的開發工具,它是gnu的c和c 編譯器,它總共提供的編譯選項超過100個,但只有少數幾個會被頻繁使用,收集如下。其基本用法為 gcc options filenames 最簡單的編譯方法是不指定任何編譯選項,會為目標程式生成預設的檔名a.out o 為將...
GDB除錯程式
gdb的三個功能 1 啟動被除錯的程式 2 設定斷點 3 設定斷點之後可以檢查程式的狀態 1.編譯生成可執行檔案 注意 g 除錯選項 gcc g tst.c o tst 2.啟動gdb gdb tst 3.在main函式處設定斷點 break main 4.執行程式 run5.利用 更加豐富的 gd...