...
分类: LINUX
2024-07-02 16:22:24
查看core路径
$ cat /proc/sys/kernel/core_?
$ /sbin/sysctl kernel_core_pattern
设置ulimit
$ ulimit -c ulimited 或者在 .bash_profile 中永久修改
设置调试的源代码路径(调用dir,在进入gdb调试模式后,设置源代码的路径)
$gdb -q test
>dir [相对路径]
备注: dir只能设置相对路径,设置绝对路径时并没有任何意义
调试core程序
通过bt,或者where查看栈信息
$ gdb 可执行程序名 core文件
>bt
>where
$ objdump -DC1 ./program > file
$ dmesg //找到{BANNED}{BANNED}{BANNED}最佳佳佳近发生段错误的输出信息
$ 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
待续。。。
gdb> bt
gdb> frame 3
gdb> print buf
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文件相当大时 该方法不可用