如何在C ++程序中设置自定义断点?

时间:2018-10-17 05:01:28

标签: c++ linux build console

我正在从事一个项目,在该项目中我无法透露代码的详细信息。因此,该应用程序全部用C和C ++编写。由于要调试的特定文件具有很多依赖性和导出功能,因此我需要调试整个项目。如何在代码本身中设置断点,以便在该特定点停止调试?我正在使用Ubuntu 14.04(因为该项目与此环境兼容)和gdb调试器。

我尝试使用

#include <csignal>

// Generate an interrupt
std::raise(SIGINT);

但是我总是收到错误消息

error: ‘raise’ is not a member of ‘std’

即使这也不起作用

#include <signal.h>
raise(SIGINT);

此外,调试不会在那时候停止,因此我可以预见到该功能。我只想从控制台调试它,而不是使用任何IDE。

由于我要调试的程序文件包含许多导入的头文件,因此我无法使可执行文件使用gdb。因此,在我的MakeFile的make clean build上,我想通过特定的功能调试特定的程序文件。因此,为此,我想在程序中添加断点。我不能使用任何GUI进行调试,因为我不应该使用它。

3 个答案:

答案 0 :(得分:1)

您是否尝试过使用GDB命令?
b lineno - set a break point at line 'lineno' b srcfile:lineno - set a break point in source file 'srcfile' at line 'lineno'

答案 1 :(得分:0)

详细了解debugging with gdb。确保使用DWARF调试信息来编译所有代码(因此请使用g++ -Wall -Wextra -g来使用GCC进行编译)。

GDB是extensible,您可以在初始化文件define中的startupprobably .gdbinit gdb命令,并在其中放置一些初始命令。 / p>

顺便说一句,在Linux上,调试(因此gdb调试器)正在使用ptrace(2)工具。而且,您可以使用脚本在命令行上非交互式地使用gdb

  

如何在代码本身中设置断点

我不建议为断点添加特定的C代码。因此,在您的C代码中不要这样做。但另请参见this

也许您想要一些回溯库,例如Ian Taylor的libbacktrace

  

我不能使用任何GUI进行调试

您不需要。您将在命令行上使用gdb使用适当的gdb脚本,您甚至可以非交互式地使用它(例如,在Makefile中)< / p>

  

我只想从控制台调试它,而不是使用任何IDE。

请注意,IDE仅是能够运行其他 external 工具(包括GCC编译器和gdb调试器)的source code editor。在Linux上,您当然不需要任何IDE来运行编译器或调试器(但IDE可能方便,但不必要),因为您可以(并且应该)在命令行上运行编译器,调试器,构建自动化工具。

  

由于我要调试的程序文件具有很多导入的头文件,因此我无法制作可执行文件

您应该先解决此问题。您需要制作可执行文件。顺便说一句,在运行时不涉及“导入”,因为header files仅在编译时相关。详细了解cpp preprocessor。您可能应该invoke GCC(例如,g++编译器,因为您拥有C ++代码)和适当的preprocessor options(有时,诸如pkg-config之类的工具对此很有用)。您可能应该使用一些build automation工具,例如GNU makewith 您的 Makefile;请参见this以获得灵感)或{{ 3}}。您可以在构建过程中添加临时gdb命令(例如,在ninja中添加一些其他和特定的规则和/或配方)。

答案 2 :(得分:0)

首先,确保已使用-g进行编译。 gcc中还有其他特定于gdb的标志。您也可以添加它们。

尝试使用ddd(gdb的图形版本)。如果您不了解gdb命令行,则为出色的工具。只需打开相关的源文件,选择该行,然后单击工具栏上的断点即可。它会在控制台部分告诉您实际执行了什么命令(学习的好方法)。有一个带有运行,下一个等内容的浮动按钮列表,用于单步执行代码。

ddd将在大多数gcc工具链上运行。

编辑: 假设您的代码由2个文件main.cpp和child.cpp组成。 main.cpp包含main()。可执行文件称为a.out。

开始

ddd a.out &

它将在main.cpp中打开。要在child.cpp中设置断点,请单击File / Open Source ...,然后选择child.cpp。然后滚动到想要断点的位置。将光标放在行上,然后在工具栏上单击break。

要运行,请在下面的gdb窗口中键入run,或者在浮动按钮对话框中单击“运行”。