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

prdp8dxp  于 2022-11-22  发布在  Linux
关注(0)|答案(4)|浏览(289)

我正在用VSCode编写一个C++应用程序,我故意生成了一个内核转储。我不知道如何调试内核转储。有没有人愿意分享一下这方面的经验?

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

gmxoilav

gmxoilav1#

来自VScode文档

内存转储调试

VS代码的C/C扩展还具有调试内存转储的功能。要调试内存转储,请打开launch.json文件并添加coreDumpPath(适用于广发银行或LLDB)或dumpPath(适用于Visual Studio Windows调试工具)属性设定为C启动组态,将其值设置为包含内存转储路径的字符串。这甚至适用于在x64机器上调试的x86程序。
另外,提问者已经用答案更新了问题,但是添加这个答案是为了帮助那些直接跳到答案部分的人;)
更新:用于C/C++扩展的示例launch.json,不带硬编码核心文件名

{
    "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"
      }
    ]
}

CodeLLDB扩展名的示例launch.json,不带硬编码核心文件名

{
    "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"
      }
    ]    
}
sd2nnvve

sd2nnvve2#

给予一个@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>"
        }
    ]
}

相应地编辑二进制文件和核心转储的路径。
然后按下绿色的播放按钮(开始调试)--它实际上并不启动任何东西,只是加载内核转储。

ghhaqwfi

ghhaqwfi3#

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

  • 在systemd日志中搜索记录的核心转储
  • 使用fzf允许用户以交互方式选择其中一个
  • 解压缩选定的coredump到/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",
        }

现在,当您启动“View coredump”调试操作时,您将在终端中获得一个交互式的coredump选择。选择其中一个后,vscode调试器将打开它。
要在Linux系统上运行这个脚本,你需要安装systemd Python包。在Ubuntu上,使用sudo apt install python3-systemd。在Arch Linux上,使用sudo pacman -S python-systemd。在pip上,这个包是systemd-python。(不要与systemd混淆,这是一个不同的不兼容包)。(sudo apt install fzfsudo pacman -S fzf),以及核心转储的适当解压缩程序(例如lz4zstd)。

xj3cbfub

xj3cbfub4#

您不使用source code editor(偶数VSCode)以两柴core倾印(因为core档案没有文字格式)。您使用gdb GDB有一个非常好的user manual,我强烈推荐阅读它。您也不用VSCode来编译您的C++代码,而是一个compiler,如GCCClang(可能VSCode可以配置为启动g++)。

在Linux上,如果您的C或C++程序是使用-gpassed tog++gcc作为可执行文件$HOME/bin/foo构建的,您可以尝试

gdb $HOME/bin/foo core

然后使用gdb调试器的事后分析命令。详细信息请阅读documentation of gdb。核心转储文件的存在和名称是可配置的(在使用X1 E10 F1 X和通过X1 E11 F1 X的最低层,例如bash内置ulimitzsh内置limit)。另请参见core(5)。请注意,您的登录shell可以更改为chsh(1)。在Linux上,bash通常(并不总是)是默认shell,但是您可以切换到zsh甚至fish shell
你也不需要特意生成一个内核转储。在gdb下设置一个breakpoint通常会更简单。你可以使用gcore(1)生成一个正在运行的进程的内核。你可以使用gdb(1)-p选项将gdb附加到一个正在运行的进程。我很少看到特意生成一个内核转储是有用的。当然,abort(3)(也被assert(3)使用)会生成一个core转储。
您的应用程序最好使用DWARF调试信息进行编译(使用-g选项to GCC或Clang)。假设您的应用程序可执行文件是某个yourapp可执行文件。然后调试核心转储(对于core文件,请参阅core(5)了解更多信息;请注意,gdb(1)core(5)man页面中提及,由man core命令指定)使用gdb yourapp core
有些源代码编辑器能够运行gdb(我的编辑器是emacs,它能够用M-x gdb运行gdb)。
但是我推荐在终端的命令行中使用gdb,它是一个非常方便的工具,请参见this对相关问题的回答。
gdb正在使用非常低级的ptrace(2)系统调用来设置断点等。您几乎从不需要ptrace(除非您编写自己的调试器,这可能需要多年的工作),但您使用的是gdb,而gdb使用的是ptrace
另外,如何从VSCode运行gdb是另一个问题。因为我不使用VSCode,所以我无法回答这个问题。而且这可能不值得做。即使有30年的emacs经验,我也经常在终端中运行gdb。因为这比从emacs(或VSCode)运行它简单。
注意:在2019年,“源代码编辑器”是“IDE“的近义词。这两种说法实际上指的是相同的产品,但它们的表达方式不同。你可以称emacs为IDE,我(和GNU社区)更喜欢称它为源代码编辑器,但我们都将使用它来做同样的事情:很好地编写、浏览和处理source code,并对其进行构建和调试。

相关问题