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

Dav*_*sat 5 linux coredump visual-studio-code

我有意从我使用 VSCode 编写的 C++ 应用程序生成核心转储。我不知道如何调试核心转储。有没有人有这方面的经验,他们愿意分享?

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


Ins*_*f K 8

来自VScode 文档

内存转储调试

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

PS提问者已经用解决方案更新了问题。但是添加这个答案是为了帮助那些直接跳到答案部分的人;)


更新:launch.json没有硬编码核心文件名的 C/C++ 扩展示例

{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "cppdbg",
            "request": "launch",
            "name": "Open a core dump(c/c++)",
            "program": "<Path to the program here>",
            "coreDumpPath": "${input:coreFileName}",
            "cwd": "${workspaceFolder}",
            "MIMode": "lldb" // or gdb, if you are using gdb
        }
    ],
    "inputs": [
      {
        "id": "coreFileName",
        "type": "promptString",
        "description": "Enter core file path"
      }
    ]
}
Run Code Online (Sandbox Code Playgroud)

launch.json没有硬编码核心文件名的 CodeLLDB 扩展示例

{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "lldb",
            "request": "custom",
            "name": "Open a core dump",
            "initCommands": [
                "target create -c ${input:coreFileName}"
            ]
        }
    ],
    "inputs": [
      {
        "id": "coreFileName",
        "type": "promptString",
        "description": "Enter core file path"
      }
    ]    
}
Run Code Online (Sandbox Code Playgroud)


Bas*_*tch -5

您不使用源代码编辑器(甚至 VSCode)来调试core转储(因为core文件没有文本格式)。您使用gdb(或者可能是其他一些调试器,例如lldb)。GDB 有一本非常好的用户手册,我强烈推荐阅读。您也不使用 VSCode 来编译 C++ 代码,而是使用GCCClang编译器(可能可以配置 VSCode 来为您启动)。g++

在 Linux 上,如果您的 C 或 C++ 程序是通过-g 传递 g++gcc作为可执行文件构建的$HOME/bin/foo ,您可以尝试

 gdb $HOME/bin/foo core
Run Code Online (Sandbox Code Playgroud)

然后使用调试器的事后检查命令gdb。阅读的文档gdb了解详细信息。核心转储文件的存在和名称是可配置的(在最低级别使用setrlimit(2)和通过proc(5),因此bash内置 ulimitzsh内置 limit)。另请参见core(5)。请注意,您的登录 shell 可以使用chsh(1)进行更改。在 Linux 上,bash通常(并非总是)默认 shell,但您可能会切换到 shell zsh,甚至切换到fishshell。当然,请阅读有关Unix shell 的内容。

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

您的应用程序最好使用DWARF调试信息进行编译(使用GCC或 Clang-g选项) 。假设您的应用程序可执行文件是某个可执行文件。然后使用以下命令调试核心转储(对于文件,请参阅core(5)了解更多信息;请注意, 在core(5)页面中提到了gdb(1),由命令给出)yourappcore manman coregdb yourapp core

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

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

gdb正在使用非常低级别的ptrace(2)系统调用来设置断点等。您几乎永远不需要ptrace (除非您编写自己的调试器,这可能需要多年的工作),但是您使用gdbwhich using ptrace.

附言。如何gdb从 VSCode 运行是另一个问题。由于我不使用VSCode,所以无法回答。这甚至可能不值得做。即使有30年的经验,我也经常在终端里emacs运行。gdb因为它比从emacs(或 VSCode)运行它更简单。

注意。如今,在 2019 年,“源代码编辑器”几乎是“ IDE ”的同义词。实际上,这两种说法都指的是相同的产品,但它们的呈现方式有所不同。你可以称emacs为 IDE,我(和 GNU 社区)更喜欢称其为源代码编辑器,但我们都将使用它做同样的事情:很好地编写、浏览、处理源代码以及构建和调试它。

  • VSCode 不是文本编辑器,而是 IDE。它与 gdb 紧密集成。在 VSCode 中,您可以使用 GDB 单步执行代码并在编辑器中设置断点。您可以附加到正在运行的进程并查看堆栈和回溯是什么样子。这是一个尖刻无知的答案,没有帮助 (4认同)
  • 我试图避免在命令行模式下使用 gdb,并且不太喜欢 tui 功能。现在我已经完成了这项工作,这真的很好,我可以看到所有本地\全局变量、每个线程的调用堆栈,而且它看起来工作得很好。只有时间才能证明它在实际生产转储中的性能如何,其中应用程序不是玩具应用程序。感谢您抽出时间回答我的问题! (2认同)