gdb查看崩溃时的调用堆栈
使用gdb启动程序
1 | gdb <可执行文件名> |
启动后执行运行命令run
可以简写为r
程序就会从入口开始运行,也可以带上命令行参数运行run [参数1] [参数2] ...
参看当前函数调用堆栈
1 | backtrace |
可以简写为bt
,在程序崩溃后查看当前崩溃的位置和调用堆栈,这估计是gdb最常用的命令。
GDB常用的命令
1 | i b // info breakpoint |
配置core dump
如果程序不是通过gdb启动运行的我们也想查看它崩溃时的调用堆栈,则可以通过core dump文件,它会保留崩溃时的现场。首先我们确保运行的可执行文件无论是Debug版还是Release版应该携带了调试符号,即编译选项中加入了-g或-ggdb。然后通过下面的方式启用core dump文件生成:
确保apport
、systemd-coredump
两个服务存在
1 | dpkg -l | grep apport |
如果不存在则安装
1 | apt install apport |
如果存在则确保在运行
1 | systemctl status apport |
如果没有运行则启动
1 | systemctl start apport |
默认的core dump文件会生成在/var/lib/systemd/coredump/
目录下,为了方便调试我们修改到可执行文件同目录
运行程序前在shell窗口或者shell脚本内先执行
1 | ulimit -c unlimited |
之后运行的程序崩溃时就会在程序启动的“当前目录”生成core dump文件。文件名是core.<可执行文件名>.<进程ID>
使用core dump
所谓使用core dump,就是通过gdb和core dump文件恢复崩溃时的现场,以便查看崩溃时的函数调用堆栈或者变量值。
用法:
1 | gdb <可执行文件名> <core dump文件名> |
然后就可以使用
1 | bt |
查看崩溃现场的调用堆栈了。
主动生成运行中进程的core dump
这种需求主要发生在进程卡死,想知道卡在何处时。
1 | gcore -o <core dump文件名> <pid> |
可以主动生成core dump文件,这个操作不会杀死进程,如果有需要可手动杀死。
然后参照[使用core dump](#使用core dump)的步骤去查看调用堆栈就可以了