【问题标题】:How to setup custom breakpoints in the C++ program?如何在 C++ 程序中设置自定义断点?
【发布时间】:2019-03-21 16:50:05
【问题描述】:

我正在做一个项目,我不能透露代码的细节。因此,该应用程序都是用 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 进行调试,因为我不应该使用。

【问题讨论】:

  • 你的 Ubuntu 14 真的很旧,你应该升级它(当前的 Ubuntu 是 2018 年 10 月的 18.04
  • @BasileStarynkevitch Ikr
  • edit您的问题添加几段动机和背景。为什么需要在 C 代码中添加断点?为什么你不能使用一些脚本(可能来自你的Makefile?)以非交互方式运行gdb?没有这些解释,您的问题就不清楚了。
  • 您在调试器中设置断点,而不是在源代码中。
  • 你的问题很不清楚,而且很混乱。在命令行上构建您的程序。在您的问题中显示编译命令和一些minimal reproducible example

标签: c++ linux build console


【解决方案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'

【讨论】:

【解决方案2】:

阅读有关debugging with gdb 的更多信息。确保使用DWARF 调试信息编译所有代码(因此使用g++ -Wall -Wextra -g 编译它和GCC)。

GDB 是 extensible,你可以在你的 init 文件 startup probably .gdbinitdefine 使用你自己的 gdb 命令,并将一些初始命令放在那里。

顺便说一句,在 Linux 上,调试(所以 gdb 调试器)正在使用 ptrace(2) 设施。您可以使用脚本在命令行上以非交互方式使用gdb

如何在代码中设置断点

我不建议为断点添加特定的 C 代码。所以在你的 C 代码中不要这样做。但另请参阅this

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

我无法使用任何 GUI 进行调试

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

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

请注意,IDEs 只是被夸奖的 source code editors 能够运行其他外部工具(包括 GCC 编译器和 gdb 调试器)。您当然不需要 - 在 Linux 上 - 任何 IDE 来运行编译器或调试器(但 IDE 可能方便,但没有必要,因为你可以(并且应该)在命令行上运行您的编译器、调试器、构建自动化工具。

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

你应该先解决这个问题。您需要制作可执行文件。顺便说一句,运行时不涉及“导入”,因为 header files 仅在编译时相关。阅读有关cpp preprocessor 的更多信息。你可能应该invoke GCC(例如g++编译器,因为你有C++代码)和适当的preprocessor options(有时,像pkg-config这样的工具对此很有用)。您可能应该使用一些build automation 工具,例如GNU makewith your Makefile;请参阅this 以获得灵感)或ninja。您可以在您的构建过程中添加特别的 gdb 命令(例如,在您的 Makefile 中添加一些额外和特定的规则和/或配方)。

【讨论】:

  • 更多的是在构建项目本身时程序被调试,所以我想在程序中放置断点。
  • 方法错误。您的构建过程应该使用适当的脚本运行gdb。不要尝试在 C 中以编程方式添加断点。顺便说一句,您可能会解释为什么要在构建时调试程序(这是通常的要求)
  • 我有一个程序文件,它是项目的一部分,它又要导入许多头文件。所以单独我无法制作一个 exe 文件来使用 gdb。
  • 如果您没有可执行文件,则无法运行调试器。因此,您需要改进构建程序以使用可执行文件(甚至是“临时”文件)
【解决方案3】:

首先,确保您已使用 -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。然后滚动到您想要断点的位置。将光标放在行上,然后单击工具栏中的中断。

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

【讨论】:

  • 很抱歉,我想在调试之前将断点放在程序本身中。你能帮我“如何在程序本身中设置断点”。
  • 我已经修改了答案。
猜你喜欢
  • 2011-08-24
  • 1970-01-01
  • 2011-01-05
  • 1970-01-01
  • 1970-01-01
  • 2019-01-11
  • 1970-01-01
  • 2013-04-05
  • 1970-01-01
相关资源
最近更新 更多