Dav*_*sat 5 linux coredump visual-studio-code
我有意从我使用 VSCode 编写的 C++ 应用程序生成核心转储。我不知道如何调试核心转储。有没有人有这方面的经验,他们愿意分享?
***** 更新 ***** 我相信我现在可以工作了。我为核心文件创建了第二个调试配置。我需要添加指向生成的转储文件的“coreDumpPath”选项。我还需要删除 preLaunchTask 选项,它总是会构建一个新的可执行文件。
内存转储调试
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++ 代码,而是使用GCC或Clang等编译器(可能可以配置 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内置 ulimit或zsh内置 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 社区)更喜欢称其为源代码编辑器,但我们都将使用它做同样的事情:很好地编写、浏览、处理源代码以及构建和调试它。
| 归档时间: |
|
| 查看次数: |
7104 次 |
| 最近记录: |