linux程序调试


使用objdump
$ objdump -DC1 ./program  >  file
$ dmesg                                                     找到最近发生段错误的输出信息
objdump -d ./program  >  ./filedump       此文件包含二进制文件的汇编代码

eg
filedump : test [33 20]:segfault at 80484e0 ip 0018506a
$ grep -n -A 10 -B 10 "80484e0"  filedump


试用场景:
1)  不需要 -g 参数编译 不需要core文件  需要能看懂汇编程序
2)  如果gcc使用了 -O1 -O2 -O3 那么生成的汇编指令被优化 相应的调试难度也会增加

使用catchsegv
待续。。。


使用gcc -g & gdb
gdb> bt
gdb> frame 3
gdb> print buf


使用core & gdb
core设置
$ echo "/tmp/%e_core_%p_%t"  >  /proc/sys/kernel/core_pattern        可以随时修改 但是重启后失效
永久修改
/sbin/sysctl -w kernel.core_pattern=/var/log/core_%e_%t

试用场景
1) 需要通过core文件调试
2) 程序很复杂时 core文件相当大时 该方法不可用


linux段错误调试
1) 借助dmesg
2) nm [可执行程序]        打印二进制文件中的符号表
3) ldd                查看二进制的共享链接库 包含库名称、起始地址等





09-05 01:42