我在其中一个.h文件中设置了一个断点,它有一个小方法的实现,
(gdb) break SmallVector.h:141
这是我从gdb得到的:
Breakpoint 5 at 0x416312: SmallVector.h:141. (38 locations)
为什么断点设置在38个位置而不是单个位置?
我不擅长调试以及C ++但不幸的是我从来没有像我现在正在工作的那样复杂(编译器)。所以我以前从未遇到过这样的事情。
感谢任何帮助。
答案 0 :(得分:6)
有几种方法可以实现。
正如您所发现的,一种主要方式是内联函数。一些编译器(如gcc)将发出有关其内联的调试信息。 gdb会看到此信息并尝试在每个内联位置设置断点。
另一种典型的方法是使用模板。每个模板实例化都将具有相同的位置,因此break file:line
将在每个实例化中产生断点。
另一种方法是使用break function
并且有多个同名函数。这里经常让新用户感到困惑的一个场景是,编辑器通常会发出构造函数的多个副本(查看"在构建器中#34;对于血淋淋的细节)。
这种情况的最后一种方式是编译器是否进行其他类型的优化,例如部分内联。这些更少见。
答案 1 :(得分:1)
每当我在带有模板实现的头文件中添加断点时,就会发生这种情况。
答案是,每次有内联函数调用时,断点都将设置在该位置,这通常发生在头文件中的模板实现:)
要强制函数内联,您必须为编译器指定__attribute__
函数标志!例如
#include <iostream>
using std::cout;
using std::endl;
__attribute__ ((always_inline))
inline void function() {
cout << "Hello World" << endl;
}
int main() {
cout << "Hello World" << endl;
return 0;
}
致@IwillnotexistIdonotexist