如何使用VSCode调试Linux核心转储?

时间:2019-04-17 21:29:07

标签: linux visual-studio-code coredump

我故意从使用VSCode编写的C ++应用程序生成核心转储。我无法弄清楚如何调试核心转储。有谁愿意分享这些经验吗?

*****更新***** 我相信我现在可以工作了。我为核心文件创建了第二个调试配置。我需要添加指向生成的转储文件的“ coreDumpPath”选项。我还需要删除将始终生成新可执行文件的preLaunchTask选项。


4 个答案:

答案 0 :(得分:3)

VScode docs

  

内存转储调试

     

VS Code的C / C ++扩展也具有调试内存转储的功能。要调试内存转储,请打开launch.json文件,然后将coreDumpPath(对于GDB或LLDB)或dumpPath(对于Visual Studio Windows Debugger)属性添加到C ++ Launch配置中,设置其值为包含内存转储路径的字符串。这甚至适用于在x64机器上调试的x86程序。

P.S。 询问者已经使用解决方案更新了问题。但是添加此答案可以帮助那些直接跳到答案部分的人;)

答案 1 :(得分:2)

您不使用source code editor (甚至是VSCode)调试core转储(因为有core文件没有文字格式)。您使用gdb(或其他debugger,例如lldb)。 GDB有一个非常不错的user manual,我强烈建议阅读。您也不使用VSCode来编译C ++代码,而是使用compilerGCC之类的Clang(可能VSCode可以配置为为您启动g++)。

您也不需要故意生成核心转储。在gdb下设置breakpoint通常更简单。您可以使用gcore(1)来生成正在运行的进程的核心。您可以使用gdb(1)gdb选项将-p附加到正在运行的进程。在极少数情况下,故意生成核心转储很有用。但是当然abort(3)(也由assert(3)使用)会生成core转储。

最好使用to GCC调试信息来编译您的应用程序(使用-g选项DWARF或Clang)。假定您的应用程序可执行文件是某个yourapp可执行文件。然后,您调试核心转储(有关core文件,请参见core(5);请注意,gdb(1) man页中提到了core(5),由man core命令)使用gdb yourapp core

某些源代码编辑器能够运行gdb(我的编辑器是emacs,并且能够与gdb一起运行M-x gdb)。您应该深入了解源代码编辑器的文档,以了解如何执行此操作。

但是我建议在终端的命令行中使用gdb。这是一个非常方便的工具。请参阅this对相关问题的答案。

gdb使用了非常低级的ptrace(2)系统调用来设置断点等。您几乎不需要ptrace(除非您编写自己的调试器,否则可能需要数年时间)工作)),但您使用的是gdb,它使用的是ptrace

PS。如何从VSCode运行gdb是一个不同的问题。由于我不使用VSCode,因此无法回答。这甚至可能不值得做。即使拥有30年的emacs经验,我仍然经常在终端机上运行gdb。由于它比从emacs(或VSCode)运行它更简单。

NB。如今,在2019年,“源代码编辑器”几乎是“ IDE”的同义词。实际上,这两种功能都指相同的产品,但是它们呈现它们的方式不同。您可以将emacs称为IDE,我(和GNU社区)更喜欢将其称为源代码编辑器,但我们俩都将其用于相同的事情:很好地编写,浏览和使用source code并构建和调试它。

答案 2 :(得分:2)

给出@insaf答案的具体示例。可以将其用作launch.json的模板(单击调试侧栏顶部的设置按钮进行编辑):

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) Launch",
            "type": "cppdbg",
            "request": "launch",
            "program": "<PATH-TO-BINARY>",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ],
            "coreDumpPath": "<PATH-TO-CORE-DUMP>"
        }
    ]
}

相应地编辑二进制和核心转储的路径。

然后按下绿色的播放按钮(开始调试)-除了加载核心转储,它实际上并没有启动任何东西。

答案 3 :(得分:0)

我编写了一个 little helper script,它以机器可读的方式复制了 coredumpctl 的功能。

  • 在 systemd 日志中搜索记录的核心转储
  • 使用 fzf 允许用户以交互方式选择其中之一
  • 将选定的核心转储解压到 /tmp/coredump
  • 将关联的可执行文件链接到 /tmp/coredump_program

然后我创建了以下 tasks.json

{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "select coredump",
            "type": "shell",
            "command": "coredumpselect.py",
            "args": [],
            "presentation": {
                "reveal": "always",
                "panel": "new"
            }
        }
    ]
}

并将以下调试配置添加到 launch.json

        {
            "name": "View coredump",
            "type": "cppdbg",
            "request": "launch",
            "program": "/tmp/coredump-program",
            "args": [],
            "cwd": "${workspaceRoot}",
            "coreDumpPath": "/tmp/coredump",
            "preLaunchTask": "select coredump",
            "MIMode": "gdb",
        }

现在,当您启动“查看核心转储”调试操作时,您将在终端中获得核心转储的交互式选择。选择其中之一后,vscode 调试器将打开它。