GDB調試常用技術

GDB在調試常用技術

1.調試崩潰時的應用或者進程

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調試命令

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 = {<text variable, no debug info>} 0xb75d13d0 <free>
(gdb) print system
$3 = {<text variable, no debug info>} 0xb75970b0 <system>

1.1.2調試Android應用崩潰時的文件

tombstone文件裏有崩潰時的內存信息,如棧上,以及進程信息,以及調用過程,只需要利用Android自帶的工具,如addr2line、ndk-stack分析即可,具體可以執行搜索。也可以參考如下文章:

http://www.cnblogs.com/CoderTian/p/5980426.html

2.調試正在運行時的進程

Linux進程調試

調試正在運行的進程,首先需要把進程運行起來,然後通過ps aux| grep "進程名"來查看當前進程的ID號,然後通過gdb -pid 進程ID號來調試進程,查看內存信息,下完斷點或者查看完內存信息之後,一定要退出gdb調試,否則程序無法繼續運行。

Android應用調試

Android無源碼之GDB動態調試

3.GDB常用命令

1)修改指定地址的值:set *0x2a001ff4=0x4007238d 

2)查看某數組中的內容:p/x *數組名@數組長度,如p/x *notes@3

3)x/s 0x81784750 以字符串查看該地址所存儲的內容、x/x 地址:以16進制方式查看該地址所存儲的內容;

4)查看某個變量的地址:p/x notes

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章