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 占用率的问题:

  1. 首先确认 CPU 占用率较高的程序的 PID;
  2. 使用 top -H -p PID 命令查看 CPU 占用率较高的线程的轻量级进程(LWP)ID;
  3. 接着就可以使用 gdbserver :7777 --attach LWPID 这种形式直接调试线程代码。

调试带参数的程序

如果直接运行 gdb ./A V1 V2 V3 肯定会报错,正确的做法是:

  1. gdb --args ./A V1 V2 V3
  2. gdb ./A,进入 gdb 命令行后运行:r V1 V2 V3
  3. gdb ./A,进入 gdb 命令行后先设置参数 set args V1 V2 V3 然后再直接 r 运行。

通过这三种方法就可以调试带参数的程序。

忽略 SIGPIPE 信号

为防止 SIGPIPE 信号导致调试中断,可以在命令行中运行:

handle SIGPIPE nostop noprint