我在其中一个.h文件中设置了一个断点,它有一个小方法的实现,
(gdb) break SmallVector.h:141
Run Code Online (Sandbox Code Playgroud)
这是我从gdb得到的:
Breakpoint 5 at 0x416312: SmallVector.h:141. (38 locations)
Run Code Online (Sandbox Code Playgroud)
为什么断点设置在38个位置而不是单个位置?
我不是新手调试和C++,但不幸的是我从来没有像我现在工作的那样复杂(编译器).所以我以前从未遇到过这样的事情.
任何帮助表示赞赏.
有几种方法可以实现.
正如您所发现的,一种主要方式是内联函数.一些编译器(如gcc)将发出有关其内联的调试信息.gdb会看到此信息并尝试在每个内联位置设置断点.
另一种典型的方法是使用模板.每个模板实例化都将具有相同的位置,因此break file:line将在每个实例化中产生断点.
另一种方法是,如果您使用break function并且有多个相同名称的功能.这里经常让新用户感到困惑的一个场景是,编辑器通常会发出构造函数的多个副本(查看"负责构造函数"以获取详细信息).
最后一种方法是,如果编译器执行其他类型的优化,例如部分内联.这些更少见.
每当我在具有模板实现的头文件中添加断点时,就会发生这种情况。
答案是,每次有内联函数调用时,都会在该位置设置断点,这通常发生在头文件中的模板实现中:)
要强制函数内联,您必须__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;
}
Run Code Online (Sandbox Code Playgroud)
致谢@IwillnotexistIdonotexist