打开文件 ~/.config/apport/settings
    修改为

    1. [main]
    2. unpackaged=true

    进入 /var/crash文件夹,可以看到很多后缀为 .crash的文件。

    1. apport-unpack [crash文件路径] [解压路径]

    下面示范一下程序崩溃以后如何 debug
    /tmp/hello中创建一个文件

    1. int cal() {
    2. return 1/0;
    3. }
    4. int main() {
    5. cal();
    6. }
    1. # 编译代码
    2. gcc -o main -g main.cc
    3. # 执行代码, 产生coredump文件
    4. ./main

    进入 /var/crash文件夹。如果你的文件是在 /tmp/hello文件夹中运行的,那么生成的文件名称就为 _tmp_hello_main.1000.crash

    1. # 把文件解压到 /tmp/hello/crash 文件夹
    2. apport-unpack ./_tmp_hello_main.1000.crash /tmp/hello/crash

    image.png
    现在我们用 gcc 分析这个 coredump

    1. cd /tmp/hello
    2. gdb ./main ./crash/CoreDump

    gdb 启动以后,很多人会不知所措,简单介绍一下如何使用 gdb
    gdb 启动以后,输入 tui enable 打开 GDB 的命令行界面。
    image.png

    1. # 查看发生错误的调用栈
    2. bt
    3. # 选择最近的栈帧
    4. frame 0
    5. # 查看寄存器
    6. layout regs
    7. # 查看窗口列表
    8. info win
    9. # 聚焦到源码窗口
    10. 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 路径
            }
        ]
    }
    

    image.png
    在 Debug Console 里输入 -exec [gdb command]也可以执行gdb指令。

    # 查看寄存器
    -exec info registers