我们要调试的程序是
#include<stdio.h>
int main(){
int *p = NULL;
printf("%p\n",p);
*p = 3;
printf("%d\n",*p);
return 0;
}
可以看到第6行会访问非法内存地址,segment fault。
#命令
gcc main.c -o prog && ./prog
#输出
(nil)
Segmentation fault (core dumped)
使用gdb运行此二进制文件,r 命令以后会给出报错地址
使用objdump -d 反汇编此二进制文件,命令 objdump -d prog > prog.binary,查看prog.binary,并搜索这个地址。报错就是在这一句代码。这份汇编代码符合C源码,%rax应该就是p指向的地址了。
返回gdb调试窗口,使用bt命令,查看函数调用堆栈,此次测试代码较为简单。
这对于大型程序调试很有用。
再补充几个常用命令
b file_name:line_cnt
b line_cnt
condition 1 if p == 3 #为断点1设置条件
i b #查看断点列表
dis 断点号 #屏蔽断点。若不加断点号,则全部屏蔽
env 断点号 #启用断点。
delete 断点号 #删除断点
p/x $reg #16进制查看寄存器内容
p/x 某个地址
display x/10i $pc-20 #每次si都运行x/10i $pc-20来查看反汇编代码,display命令很有用
display p/x $reg
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)