gdb,多个位置的断点

fla*_*urn 5 c++ debugging gdb

我在其中一个.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++,但不幸的是我从来没有像我现在工作的那样复杂(编译器).所以我以前从未遇到过这样的事情.

任何帮助表示赞赏.

Tom*_*mey 7

有几种方法可以实现.

正如您所发现的,一种主要方式是内联函数.一些编译器(如gcc)将发出有关其内联的调试信息.gdb会看到此信息并尝试在每个内联位置设置断点.

另一种典型的方法是使用模板.每个模板实例化都将具有相同的位置,因此break file:line将在每个实例化中产生断点.

另一种方法是,如果您使用break function并且有多个相同名称的功能.这里经常让新用户感到困惑的一个场景是,编辑器通常会发出构造函数的多个副本(查看"负责构造函数"以获取详细信息).

最后一种方法是,如果编译器执行其他类型的优化,例如部分内联.这些更少见.


Cur*_*ous 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;

}
Run Code Online (Sandbox Code Playgroud)

致谢@IwillnotexistIdonotexist