gdb调试记录
gdb 调试 core 文件
生成 core 文件
直接按照默认文件名生成不限制大小的 core 文件:
ulimit -c unlimited
生成文件名带 PID 的 core 文件:
echo "1" > /proc/sys/kernel/core_uses_pid
生成自定义路径的 core 文件:
echo "/dev/shm/core-%p" > /proc/sys/kernel/core_pattern
调试 core 文件
gdb -core core-xxx
设置模块搜索路径
gdb 命令行中运行:
set sysroot xxx
set solib-search-path xxx
多线程调试
info threads
打印当前所有线程;
thread n
切换线程。
远程多线程调试
远程运行 gdbserver 启动新的调试程序的模式可以直接调试多线程的程序。
gdbserver --attach
这种远程调试模式暂时不能直接支持多线程,只能 attach 到单个线程。
如果需要调试 CPU 占用率的问题:
- 首先确认 CPU 占用率较高的程序的 PID;
- 使用
top -H -p PID
命令查看 CPU 占用率较高的线程的轻量级进程(LWP)ID; - 接着就可以使用
gdbserver :7777 --attach LWPID
这种形式直接调试线程代码。
调试带参数的程序
如果直接运行 gdb ./A V1 V2 V3
肯定会报错,正确的做法是:
gdb --args ./A V1 V2 V3
;gdb ./A
,进入 gdb 命令行后运行:r V1 V2 V3
;gdb ./A
,进入 gdb 命令行后先设置参数set args V1 V2 V3
然后再直接r
运行。
通过这三种方法就可以调试带参数的程序。
忽略 SIGPIPE 信号
为防止 SIGPIPE 信号导致调试中断,可以在命令行中运行:
handle SIGPIPE nostop noprint