C C 程式除錯神器 GDB介紹

2021-10-14 02:12:50 字數 2982 閱讀 3711

程式在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...