打开文件 ~/.config/apport/settings
修改为
[main]
unpackaged=true
进入 /var/crash
文件夹,可以看到很多后缀为 .crash
的文件。
apport-unpack [crash文件路径] [解压路径]
下面示范一下程序崩溃以后如何 debug
在 /tmp/hello
中创建一个文件
int cal() {
return 1/0;
}
int main() {
cal();
}
# 编译代码
gcc -o main -g main.cc
# 执行代码, 产生coredump文件
./main
进入 /var/crash
文件夹。如果你的文件是在 /tmp/hello
文件夹中运行的,那么生成的文件名称就为 _tmp_hello_main.1000.crash
# 把文件解压到 /tmp/hello/crash 文件夹
apport-unpack ./_tmp_hello_main.1000.crash /tmp/hello/crash
现在我们用 gcc 分析这个 coredump
cd /tmp/hello
gdb ./main ./crash/CoreDump
gdb 启动以后,很多人会不知所措,简单介绍一下如何使用 gdb
gdb 启动以后,输入 tui enable
打开 GDB 的命令行界面。
# 查看发生错误的调用栈
bt
# 选择最近的栈帧
frame 0
# 查看寄存器
layout regs
# 查看窗口列表
info win
# 聚焦到源码窗口
focus src
如果你觉得tui对你来说还是太晦涩,现在 vscode 也可以调用 gdb
{
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) Launch",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/build/main", // 设置程序路径
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"coreDumpPath": "${workspaceFolder}/crash/CoreDump" // 设置 coredump 路径
}
]
}
在 Debug Console 里输入 -exec [gdb command]
也可以执行gdb指令。
# 查看寄存器
-exec info registers