我正在从事一个项目,在该项目中我无法透露代码的详细信息。因此,该应用程序全部用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进行调试,因为我不应该使用它。
答案 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中的startup处probably .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 make
(with 您的 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,或者在浮动按钮对话框中单击“运行”。