gdb调试的三种类型:
- 调试一个可执行文件
- 调试一个coredump文件
- 调试一个正在运行的进程
- gdb -nx /proc/pid/exe pid
- 参考查找c++进程cpu占满的原因
命令
gdb program core
show language, set language c++
bt, bt full
- f 可以跳转到某个栈中位置
- i locals 显示当前调用栈的所有变量
- i register 显示当前调用栈的寄存器值,主要是查看地址
thread apply all bt
- info threads 可以查看所有线程的信息
- thread 可以具体跳转到某个线程
- disassemble 显示指令
编译可执行文件的要求
gcc -DDEBUG -g -o debug debug.c
内核转储
启用
ulimint -a, ulimit -c, ulimit -c unlimited
路径与文件名
- 内核参数kernel.core_pattern
echo "core" > /proc/sys/kernel/core_pattern
- 在 可执行文件所在目录 生成文件名为core的内核转储文件???
- 在哪个目录启动可执行文件,core文件就生成在这个目录???
echo"/corefile/core-%e-%p-%t" >core_pattern
- 将core文件统一生成到/corefile目录下
- 产生的文件名为core-命令名-pid-时间戳
- 以下是参数列表:
- %p - insert pid into filename 添加pid
- %u - insert current uid into filename 添加当前uid
- %g - insert current gid into filename 添加当前gid
- %s - insert signal that caused the coredump into the filename 添加导致产生core的信号
- %t - insert UNIX time that the coredump occurred into filename 添加core文件生成时的unix时间
- %h - insert hostname where the coredump happened into filename 添加主机名
- %e - insert coredumping executable name into filename 添加命令名
- 内核参数kernel.core_uses_pid
- 表示是否在生成的内核转储文件后添加 进程号后缀
echo "1" >/proc/sys/kernel/core_uses_pid
- 修改/etc/sysctl.conf文件
kernel.core_pattern=/var/core/core.%p
kernel.core_uses_pid=0
遇到过的问题
signal SIGBUS 7, Bus error
- 怀疑是由于mmap之后,源文件被改变(内容变少),造成访问越界
signal SIGABRT 6, Aborted
- 怀疑是double free
- 使用boost::shared_ptr出现了问题
- 也怀疑是内存不足,分配失败
- 析构的时候有竞态问题?
参考资料
gdb调试之基础篇
gdb调试之实用技巧篇
Linux GDB core高级调试
善用GDB 调试一些函数栈被毁坏的问题
段错误调试神器 - Core Dump详解
由mmap引发的SIGBUS
排错经历:全局变量被多次析构