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] |
---|
黃色的是程序最後崩潰的地方,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