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"
}
]
}
4条答案
按热度按时间gmxoilav1#
来自VScode文档
内存转储调试
VS代码的C/C扩展还具有调试内存转储的功能。要调试内存转储,请打开launch.json文件并添加
coreDumpPath
(适用于广发银行或LLDB)或dumpPath
(适用于Visual Studio Windows调试工具)属性设定为C启动组态,将其值设置为包含内存转储路径的字符串。这甚至适用于在x64机器上调试的x86程序。另外,提问者已经用答案更新了问题,但是添加这个答案是为了帮助那些直接跳到答案部分的人;)
更新:用于C/C++扩展的示例
launch.json
,不带硬编码核心文件名CodeLLDB扩展名的示例
launch.json
,不带硬编码核心文件名sd2nnvve2#
给予一个@insaf的答案的具体例子。这可以用作
launch.json
的模板(点击调试边栏顶部的设置按钮来编辑它):相应地编辑二进制文件和核心转储的路径。
然后按下绿色的播放按钮(开始调试)--它实际上并不启动任何东西,只是加载内核转储。
ghhaqwfi3#
我编写了一个little helper script,它以机器可读的方式复制了
coredumpctl
的功能。它
fzf
允许用户以交互方式选择其中一个然后我创建了下面的
tasks.json
:并将以下调试配置添加到
launch.json
:现在,当您启动“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 fzf
,sudo pacman -S fzf
),以及核心转储的适当解压缩程序(例如lz4
或zstd
)。xj3cbfub4#
您不使用source code editor(偶数VSCode)以两柴
core
倾印(因为core
档案没有文字格式)。您使用gdb GDB有一个非常好的user manual,我强烈推荐阅读它。您也不用VSCode来编译您的C++代码,而是一个compiler,如GCC或Clang(可能VSCode可以配置为启动g++
)。在Linux上,如果您的C或C++程序是使用
-g
passed tog++
或gcc
作为可执行文件$HOME/bin/foo
构建的,您可以尝试然后使用
gdb
调试器的事后分析命令。详细信息请阅读documentation ofgdb
。核心转储文件的存在和名称是可配置的(在使用X1 E10 F1 X和通过X1 E11 F1 X的最低层,例如bash
内置ulimit
或zsh
内置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,并对其进行构建和调试。