C++ 调试c++;带有gdb的模板

C++ 调试c++;带有gdb的模板,c++,gdb,C++,Gdb,当我使用模板在函数内部调试时 如何知道当前函数使用的模板类型 我试过pt。它说gdb不能打印字体 如何在特定模板类型上断开 假设函数foo(…)有两种可能的形式,foo(…)和foo(…)。如何设置断点,使gdb只在使用int的第一个断点上暂停,而不在使用long的第二个断点上暂停 编辑:如果断点可以按行号设置就好了。有很多很好的理由,例如,函数的初始部分可能需要很长时间才能运行,我希望调试的位置可能在if语句中等。您可以使用ptype而不是p打印类型。对于最近的(几年前的)g++和gdb,

当我使用模板在函数内部调试时

  • 如何知道当前函数使用的模板类型

    我试过
    pt
    。它说gdb不能打印字体

  • 如何在特定模板类型上断开

    假设函数
    foo(…)
    有两种可能的形式,
    foo(…)
    foo(…)
    。如何设置断点,使gdb只在使用
    int
    的第一个断点上暂停,而不在使用
    long
    的第二个断点上暂停


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

    您可以使用
    ptype
    而不是
    p
    打印类型。对于最近的(几年前的)g++和gdb,这将起作用

    考虑一下这个来源:

    #include <iostream>
    
    template<typename T>
    struct S
    {
      S(T t)
      {
        std::cout << t;
      }
    };
    
    int main()
    {
      S<const char*> s2("hello");
      S<int> s1(23);
      return 0;
    }
    
    查看当前帧:

    (gdb) frame
    #0  S<char const*>::S (this=0x7fffffffe35f, t=0x400940 "hello") at q.cc:8
    8       std::cout << t;
    
    (gdb)帧
    #0 S::S(this=0x7fffffffe35f,t=0x400940“你好”)在q.cc:8
    
    8 std::cout要为所有实例设置断点,请使用:

    gdb> rbreak Foo<.*>
    
    运行gdb:

    gdb go
    
    和测试:

    gdb> rbreak Foo<int>
    gdb> run
    gdb> backtrace
    gdb> cont
    
    gdb>rbreak Foo
    gdb>运行
    gdb>回溯
    gdb>cont
    
    如您所见:只有一个模板实例受到影响

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

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

    正如你所看到的,这里是
    Foo

    我今天在工作中这样做了,我很确定
    bfoo
    会起作用。。。如果你做了
    b foo.cpp:123
    (假设第123行是
    foo
    的那一行,它将为所有模板变量设置多个断点。您所处的模板实例化应该在回溯中可见。我更新了
    ptype
    部分以打印有趣的内容,即
    ptype T
    而不是
    ptype S
    e答案。您可以按行号设置断点,但问题是根据类型对其进行过滤。这可以通过一些Python脚本完成;基本上,您需要一个新的方便函数来检查类型。啊,如果
    b Foo
    默认为与
    rbreak Foo
    相同的所有实例,那就更好了。
    #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 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