gdb,多个位置的断点

时间:2016-02-05 23:53:43

标签: c++ debugging gdb

我在其中一个.h文件中设置了一个断点,它有一个小方法的实现,

(gdb) break SmallVector.h:141

这是我从gdb得到的:

Breakpoint 5 at 0x416312: SmallVector.h:141. (38 locations)

为什么断点设置在38个位置而不是单个位置?

我不擅长调试以及C ++但不幸的是我从来没有像我现在正在工作的那样复杂(编译器)。所以我以前从未遇到过这样的事情。

感谢任何帮助。

2 个答案:

答案 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