GDB除錯常用技術

2021-10-03 12:14:32 字數 1980 閱讀 1997

linux可以通過如下命令開啟core dump功能:

ulimit -c unlimited

sudo sh -c 'echo "/tmp/core.%t" > /proc/sys/kernel/core_pattern'

開啟core dump之後,程序崩潰時會產生一系列/tmp/core*的檔案

android中應用程式崩潰時,產生一系列/data/tombstones/tombstone_0*檔案,該檔案包含呼叫資訊和暫存器資訊;

1.1.1linux程序除錯命令

gdb 要除錯的程式  崩潰的檔案

如:gdb stack7 /tmp/core.1500560146 

進入gdb後,看到如下內容:

[new lwp 16779]

core was generated by `./unlink'.

program terminated with signal 6, aborted.

#0 0xb7769428 in __kernel_vsyscall ()

(gdb) x/10s $esp

0xbf9330a4: "x8\223\277\006"

0xbf9330aa: ""

0xbf9330ab: ""

0xbf9330ac: "\213a"

0xbf9330af: ""

0xbf9330b0: "\037\216]\267\364/u\267\340\061\223\277e\304]\267\006"

0xbf9330c2: ""

0xbf9330c3: ""

0xbf9330c4: "`1\223\277"

0xbf9330c9:

黃色的是程式最後崩潰的地方,x/10s $esp指令是檢視崩潰時棧頂上的內容;

如果要檢視崩潰時呼叫過程,需要用bt指令:

(gdb) bt

#0 0xb7769428 in __kernel_vsyscall ()

#1 0xb75d8e1f in raise () from /lib/i386-linux-gnu/libc.so.6

#2 0xb75dc465 in abort () from /lib/i386-linux-gnu/libc.so.6

#3 0xb761548a in ?? () from /lib/i386-linux-gnu/libc.so.6

#4 0xb7620002 in ?? () from /lib/i386-linux-gnu/libc.so.6

#5 0xb76206e5 in ?? () from /lib/i386-linux-gnu/libc.so.6

#6 0x080486dd in handle_cmd ()

#7 0x080489b7 in main ()

另外 print指令可以檢視一系列的函式的記憶體位址,如system函式位址

(gdb) print free

$2 = {} 0xb75d13d0

(gdb) print system

$3 = {} 0xb75970b0

1.1.2除錯android應用崩潰時的檔案

tombstone檔案裡有崩潰時的記憶體資訊,如棧上,以及程序資訊,以及呼叫過程,只需要利用android自帶的工具,如addr2line、ndk-stack分析即可,具體可以執行搜尋。也可以參考如下文章:

linux程序除錯

除錯正在執行的程序,首先需要把程序執行起來,然後通過ps aux| grep "程序名"來檢視當前程序的id號,然後通過gdb -pid 程序id號來除錯程序,檢視記憶體資訊,下完斷點或者檢視完記憶體資訊之後,一定要退出gdb除錯,否則程式無法繼續執行。

android應用除錯

android無原始碼之gdb動態除錯

*0x2a001ff4=0x4007238d

2)檢視某陣列中的內容:p/x *陣列名@陣列長度,如p/x *notes@3

GDB除錯技術

gnu的偵錯程式稱為gdb,該程式是乙個互動式工具,工作在字元模式。在 x window 系統中,有乙個gdb的前端圖形工具,稱為xxgdb。gdb 是功能強大的除錯程式,可完成如下的除錯任務 設定斷點 監視程式變數的值 程式的單步執行 修改變數的值。在可以使用 gdb 除錯程式之前,必須使用 g ...

gdb除錯技術

1 使用gdb除錯 除錯程式 當程式出現執行錯誤 bug 時,我們需要除錯程 序,將錯誤找出並解決 debug 參考 單步除錯 vc下面的除錯程式的方法 除錯手段分為兩種 1 單步除錯 使用偵錯程式,結合斷點,觀察變 量和記憶體的值。2 列印除錯 將關鍵資訊用printf等函式輸出分析 gdb除錯 ...

GDB常用除錯命令

呼叫gdb編譯需要在cc後面加 g引數再加 o root redhat home gdb 除錯檔案 啟動gdb gdb l 字母l 從第一行開始列出原始碼 gdb break n 在第n行處設定斷點 gdb break func 在函式func 的入口處設定斷點 gdb info break 檢視斷...