25

我的问题是我在代码中设置了一些断点,其中一些没有工作。在某些地方它抱怨“未解决的断点”。

有谁知道为什么会这样?顺便说一句,我正在使用 gdb。

编辑:是的,当然是用调试信息编译的。它只发生在代码中的某些类或点上。而且我很确定已经到达了代码的那一部分,因为我可以通过步进到达它

编辑:理查德的解决方案不起作用;不管怎么说,还是要谢谢你。我正在调试中编译,没有任何优化。

4

12 回答 12

15

可能是您试图在尚未加载的共享库中设置断点。在库加载之前,这将不起作用。较新的 gdb 允许设置延迟断点,但 CDT 可能(尚)不支持。一种解决方法是在一个从一开始就可用的位置设置一个断点,当相关共享库已经加载时将到达该位置。然后在共享库中设置另一个断点。现在它应该可以工作了。这有点乏味,但通常有效。

GDB 文档

对于地址未知的挂起断点,该字段将包含“PENDING”。在加载具有断点引用的符号或行的共享库之前,不会触发此类断点。

于 2009-05-22T04:04:00.957 回答
10

我发现有时将引用的 Process Launcher 从“GDB (DSF) Create Process Launcher”切换到“Standard Create Process Launcher”已经为我解决了这个问题。其他时候,只需删除所有断点并重新启动 Eclipse 即可。

于 2012-08-15T13:18:13.363 回答
3

“未解决的断点”只是意味着 GDB 没有找到与您尝试设置断点的文件和行相对应的代码位置。

您是否试图在构造函数中停止?

如果是这样,您可能会看到这个 cently fixed GCC bug

于 2008-12-06T07:30:14.633 回答
3

有时优化也会导致断点被跳过。确保您使用 -O0 进行编译

于 2011-09-09T04:01:45.557 回答
0

我发现使用 F8 (resume) 不会在我的断点处停止。但是,如果我设置了 Stop On Startup : main ,然后单步执行我的代码(F5/F6),那么我的断点就会被命中。除了-g 或-g3 之外,我没有任何特殊的编译器选项。希望帮助...

于 2012-05-20T11:24:53.883 回答
0

确保断点类型正确。对于 C/C++,它是一个小蓝点。如果它看起来像其他任何东西,则很可能断点类型不正确。我会尝试关闭文件,右键单击它 -> 使用 -> C/C++ 编辑器打开。这对我有用。

于 2012-05-31T07:37:07.307 回答
0

如果这里的其他答案没有解决您的问题,那么您可能遇到了与我相同的问题(这是 GDB 版本过时的结果)。对于在 Mac 上使用 GDB 的任何人来说,情况都可能如此。

在这里查看我的问题和答案:

使用多个源文件时,GDB 不会中断某些代码行

于 2013-08-07T22:57:25.510 回答
0

我对 GDB 也有类似的问题。似乎它是由相同的源代码文件名引起的,即使它们具有不同的路径。我重命名了重复项,之后 GDB 工作得很好。

西尔维乌

于 2014-05-30T01:45:27.373 回答
0

您是否在模板类/函数中放置断点?我遇到了同样的问题:我可以单步执行模板代码,但断点不起作用。我猜eclipse不明白它必须在该类的所有实例中放置断点:

template <typename T>
int doit(T a) {
 return a.do(); // <-- breakpoint here
}
...
A a;
cout << doit(a);

我认为它会等待 doit(...) 而永远不会等待 doit(...)。如果我将它设置为函数:'doit',至少 gdb 本身会在断点处停止。

于 2013-10-21T11:14:37.820 回答
0

我有同样的问题,

1.- Removed the breakpoints. 
2.- Restart eclipse 
3.- Clean the project by using project -> clean 
4.- Add again the breakpoints and start your debugging.

这解决了我的问题。

于 2014-11-10T20:42:29.037 回答
0

令人惊讶的是,这个问题有这么多不同的答案。Eclipse 2019.12、CDT 9.10、RHEL 8.0、x86_64 中仍然存在(2020)问题。就我而言,我可以通过调整断点属性并将其从“常规”更改为“硬件”来修复它(选择断点窗口,然后右键单击断点,断点属性,常见,类型)。

于 2020-03-18T15:00:37.893 回答
0

如果您使用 GDB 作为调试器,请确保同时使用两个标志:-g 和 -ggdb

您可以直接编辑 make 文件,FCFLAGS = -g -ggdb(您可能拥有的其他一些标志)

或转到调试配置(它在您单击错误图标旁边的小箭头时下拉的菜单中。)选择您正在调试的项目,然后单击调试器选项卡。检查您正在使用 gdb,并在此处添加标志。

于 2016-05-10T17:57:54.497 回答