我在一个 .h 文件中设置了一个断点,该文件具有一个小方法的实现。
(gdb) break SmallVector.h:141
这是我从gdb得到的:
Breakpoint 5 at 0x416312: SmallVector.h:141. (38 locations)
为什么断点设置在38个位置而不是一个位置?
我对调试和C++并不陌生,但不幸的是我从未像现在这样使用过复杂的东西(编译器)。所以我以前从未遇到过这样的情况。
感谢任何帮助。
有几种方式可以发生这种情况。
一种主要的方式,如您所发现的,是内联函数。某些编译器(例如gcc)将生成有关其已完成的内联的调试信息。gdb看到此信息并尝试在每个内联位置设置断点。
另一种典型的方式是使用模板。每个模板实例化将具有相同的位置,因此break file:line
将在每个实例化中导致断点。
还有一种方式,如果您使用break function
并且有多个同名函数,则会发生这种情况。在这里,经常使新用户感到困惑的一个场景是,在幕后,编译器经常会发出多个构造函数的副本(查找“in charge constructor”以获取详细信息)。
最后一种可能的方式是编译器进行其他类型的优化,例如部分内联。这些很少见。
#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 提供的贡献。
inline
,它仍然可以根据其所进行的分析来实现。我的理解正确吗? - flashburninline
关键字只是一个提示;编译器很少认真考虑它。 - Iwillnotexist Idonotexist