c++ - 使用 gdb 调试 C++ 模板

标签 c++ gdb

当我在带有模板的函数内部调试时,

  1. 我如何知道当前函数正在使用哪种模板类型?

    我试过了 p T .它说 gdb 无法打印类型。

  2. 如何中断特定模板类型?

    假设函数 foo<T>(...)有 2 种可能的形式,foo<int>(...)foo<long>(...) .如何设置断点以便 gdb 仅在第一个使用 int 的断点处暂停,但不是第二个使用 long 的?

编辑:如果断点可以按行号设置就好了。这有很多很好的理由,例如。函数的初始部分可能需要很长时间才能运行,我希望调试的地方可能在 if 中声明等

最佳答案

要为所有实例设置断点,请使用:

gdb> rbreak Foo<.*>

只在已知实例上设置断点

gdb> break Foo<int>

您还可以使用 rbreak Foo<int>但是使用调用女巫评估正则表达式但你没有给出 :-) 是没有意义的

示例代码:

#include <iostream>
#include <string>

template < typename T>
T Foo(T t) { return t; }

int main()
{
    std::cout << Foo<int>(1) << std::endl;
    std::cout << Foo<std::string>("Hallo") << std::endl;
}

使用调试信息简单地编译:

g++ main.cpp -g -o go

运行 gdb:

gdb go

并测试:

gdb> rbreak Foo<int>
gdb> run
gdb> backtrace
gdb> cont

如您所见:只有模板的一个实例受到影响。

在回溯中你可以看到调用了哪个模板实例:

#0  Foo<int> (t=1) at main.cpp:5
#1  0x0000000000400b69 in main () at main.cpp:9

如您所见,它是 Foo<int>在这里。

回复评论: “有没有办法在特定行的特定已知实例中放置断点?”

是的!

gdb> break main:692
gdb> info break

这会返回类似的东西

Num     Type           Disp Enb Address            What
5       breakpoint     keep y   <MULTIPLE>         
5.1                         y   0x00000000004026db in Foo<int>(int) at main.cpp:692
5.2                         y   0x00000000004027a6 in Foo<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >) at main.cpp:692
(gdb)

现在您可以通过以下方式禁用特定实例:

gdb> disable 5.2

您不能删除特定的“子断点”。但是禁用正是您所需要的。如果您愿意,您还可以提供一系列实例,例如:

gdb> disable 5.1-2

关于c++ - 使用 gdb 调试 C++ 模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33661179/

相关文章:

c++ - 如何在一个类(class)中正确管理2个不同类型的容器?

c++ - C++-我应该使用Dijkstra的哪些数据结构?

gdb - 加载断点文件错误

c - 位操作困难

android - 使用 Android NDK 和 GDB 断言后继续

c++ - C++ Lambda捕获此vs通过引用捕获

c++ - Visual Studio 中的 std::experimental::source_location 实现

c++ - 适用于集合的 std::async 变体

c - 关闭 GDB 中设置断点的确认

python - gdb 从哪里获取函数名?