記錄一些gdb的使用經驗
假裝現在要除錯的二進位制程式叫a.exe,原始檔叫pleasedebugme.c
直接輸入gdb a.exe
或者開啟gdb之後輸入file a.exe
首先用gcc/g++編譯c/c++程式時一定要加上-g選項,which means 加上除錯資訊,就像gcc -g pleasedebugme.c
然後用gdb載入之,新增了除錯資訊之後就很爽了,一般情況下對照原始檔直接按照行數下斷點就ok。比如要斷在原始檔中的45行,直接在gdb中b 45
即可。
如果拿到的程式沒有除錯資訊也沒有關係,比如現在拿到的二進位制檔案a.exe是沒有除錯資訊的。那麼可以直接先info functions
,檢視自己想調的函式叫什麼,這裡直接以main函式為例好了,可以直接b main
斷在main函式的開頭。如果需要精確地斷在某處,請輸入disas main
直接檢視彙編,大致看一下自己要斷的彙編語句的位址,比如位址在0x00401410,那麼就輸入b *0x00401410
,這樣就成功下了斷點了。
如果要檢視斷點情況,就info b
即可,刪除某個斷點如斷點2就直接delete 2
,刪除所有斷點就delete breakpoints
info命令很強大,可以info很多東西,除了前面提到的info b / info functions
之外,我常用的還有:
現在假設a.exe是個簡單遞迴程式。
假設現在在a.exe下了個斷點,相當於pleasedebugme.c的45行。輸入r(run),程式就跑起來了,直到遇到斷點。現在比如我想看第三次遞迴的情況,我就直接輸入多次c(continue),每次輸入c程式都會執行到斷點後停下來。
來到了想除錯的**附近之後,就可以開始慢慢除錯了。
除錯過程中注意之前提到的命令們 待續
除錯手記 2011 07 27
1 關於求模運算。在microblogcrawler的org.ir.search.mapuiu中,我在快取map頁的替換策略中設定隊首指標beginpt來實現佇列迴圈,於是在指標移動時就需要以佇列長度bufcount求模。在除錯中才發現 雖然 5 4 2 3,而事實上 5 4 1。所以在 array...
GDB除錯手冊
linux 包含了乙個叫gdb 的gnu 除錯程式。gdb 是乙個用來除錯c和c 程式的強力偵錯程式。它使你能在程式執行時觀察程式的內部結構和記憶體的使用情況。以下是 gdb 所提供的一些功能 它使你能監視你程式中變數的值 它使你能設定斷點以使程式在指定的 行上停止執行 它使你能一行行的執行你的 在...
gdb除錯手冊
gdb原理 利用作業系統提供的系統呼叫ptrace。詳情請看。gdb進行除錯的程序建議編譯引數新增 g 並去掉strip g3可在gdb列印巨集 儲存與恢復斷點 設定每步都列印的內容 gdb p ps ef grep worker grep v grep awk x a.txt 檔案內容 b rec...