使用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 查看二进制的共享链接库 包含库名称、起始地址等