我故意从我正在使用VSCode编写的C ++应用程序生成核心转储。我无法弄清楚如何调试核心转储。有没有人有这方面的经验,他们愿意分享?
*****更新*****我相信我现在有效。我为核心文件创建了第二个调试配置。我需要添加指向生成的转储文件的“coreDumpPath”选项。我还需要删除始终构建新可执行文件的preLaunchTask选项。
您不使用source code editor(甚至VSCode)来调试core
转储(因为core
文件没有文本格式)。你使用gdb(或者其他一些debugger,例如lldb)。 GDB有一个非常好的user manual,我强烈建议您阅读。你也不使用VSCode编译你的C ++代码,但compiler,如GCC或Clang(可能VSCode可能配置为你启动g++
)。
您也不需要故意生成核心转储。在breakpoint下设置gdb
通常更简单。您可以使用gcore(1)生成正在运行的进程的核心。您可以使用gdb
的-p
选项将gdb(1)附加到正在运行的进程中。我看到极少数情况下,有意生成核心转储是有用的。但当然abort(3)(也被assert(3)使用)产生了core
转储。
您的应用程序最好使用-g
调试信息进行编译(使用to GCC选项DWARF或Clang)。假设您的应用程序可执行文件是一些yourapp
可执行文件。然后你调试核心转储(对于core
文件,请参阅core(5)了解更多;请注意gdb(1)在core(5) man
页面中提到,由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并构建和调试它。