我故意从使用VSCode编写的C ++应用程序生成核心转储。我无法弄清楚如何调试核心转储。有谁愿意分享这些经验吗?
*****更新***** 我相信我现在可以工作了。我为核心文件创建了第二个调试配置。我需要添加指向生成的转储文件的“ coreDumpPath”选项。我还需要删除将始终生成新可执行文件的preLaunchTask选项。
答案 0 :(得分:3)
内存转储调试
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 ++代码,而是使用compiler或GCC之类的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
的功能。
它
fzf
允许用户以交互方式选择其中之一然后我创建了以下 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 调试器将打开它。