我的问题是我在代码中设置了一些断点,其中一些没有工作。在某些地方它抱怨“未解决的断点”。
有谁知道为什么会这样?顺便说一句,我正在使用 gdb。
编辑:是的,当然是用调试信息编译的。它只发生在代码中的某些类或点上。而且我很确定已经到达了代码的那一部分,因为我可以通过步进到达它
编辑:理查德的解决方案不起作用;不管怎么说,还是要谢谢你。我正在调试中编译,没有任何优化。
我的问题是我在代码中设置了一些断点,其中一些没有工作。在某些地方它抱怨“未解决的断点”。
有谁知道为什么会这样?顺便说一句,我正在使用 gdb。
编辑:是的,当然是用调试信息编译的。它只发生在代码中的某些类或点上。而且我很确定已经到达了代码的那一部分,因为我可以通过步进到达它
编辑:理查德的解决方案不起作用;不管怎么说,还是要谢谢你。我正在调试中编译,没有任何优化。
可能是您试图在尚未加载的共享库中设置断点。在库加载之前,这将不起作用。较新的 gdb 允许设置延迟断点,但 CDT 可能(尚)不支持。一种解决方法是在一个从一开始就可用的位置设置一个断点,当相关共享库已经加载时将到达该位置。然后在共享库中设置另一个断点。现在它应该可以工作了。这有点乏味,但通常有效。
从GDB 文档:
对于地址未知的挂起断点,该字段将包含“PENDING”。在加载具有断点引用的符号或行的共享库之前,不会触发此类断点。
我发现有时将引用的 Process Launcher 从“GDB (DSF) Create Process Launcher”切换到“Standard Create Process Launcher”已经为我解决了这个问题。其他时候,只需删除所有断点并重新启动 Eclipse 即可。
有时优化也会导致断点被跳过。确保您使用 -O0 进行编译
我发现使用 F8 (resume) 不会在我的断点处停止。但是,如果我设置了 Stop On Startup : main ,然后单步执行我的代码(F5/F6),那么我的断点就会被命中。除了-g 或-g3 之外,我没有任何特殊的编译器选项。希望帮助...
确保断点类型正确。对于 C/C++,它是一个小蓝点。如果它看起来像其他任何东西,则很可能断点类型不正确。我会尝试关闭文件,右键单击它 -> 使用 -> C/C++ 编辑器打开。这对我有用。
如果这里的其他答案没有解决您的问题,那么您可能遇到了与我相同的问题(这是 GDB 版本过时的结果)。对于在 Mac 上使用 GDB 的任何人来说,情况都可能如此。
在这里查看我的问题和答案:
我对 GDB 也有类似的问题。似乎它是由相同的源代码文件名引起的,即使它们具有不同的路径。我重命名了重复项,之后 GDB 工作得很好。
西尔维乌
您是否在模板类/函数中放置断点?我遇到了同样的问题:我可以单步执行模板代码,但断点不起作用。我猜eclipse不明白它必须在该类的所有实例中放置断点:
template <typename T>
int doit(T a) {
return a.do(); // <-- breakpoint here
}
...
A a;
cout << doit(a);
我认为它会等待 doit(...) 而永远不会等待 doit(...)。如果我将它设置为函数:'doit',至少 gdb 本身会在断点处停止。
我有同样的问题,
1.- Removed the breakpoints.
2.- Restart eclipse
3.- Clean the project by using project -> clean
4.- Add again the breakpoints and start your debugging.
这解决了我的问题。
令人惊讶的是,这个问题有这么多不同的答案。Eclipse 2019.12、CDT 9.10、RHEL 8.0、x86_64 中仍然存在(2020)问题。就我而言,我可以通过调整断点属性并将其从“常规”更改为“硬件”来修复它(选择断点窗口,然后右键单击断点,断点属性,常见,类型)。
如果您使用 GDB 作为调试器,请确保同时使用两个标志:-g 和 -ggdb
您可以直接编辑 make 文件,FCFLAGS = -g -ggdb(您可能拥有的其他一些标志)
或转到调试配置(它在您单击错误图标旁边的小箭头时下拉的菜单中。)选择您正在调试的项目,然后单击调试器选项卡。检查您正在使用 gdb,并在此处添加标志。