使用模板时我的gdb会工作吗?

时间:2014-07-10 11:29:25

标签: c++ debugging templates gdb

我计划模板化一个可用于各种数据类型的容器类。我目前有一个很大的担忧:

  • 我的gdb还能在模板中使用吗?我可以像在普通成员函数中一样在类模板中设置断点,打印值,打印堆栈跟踪吗?
  • 限制在哪里?是否存在严重的限制或奇怪的行为?

我不是在谈论调试模板实例化本身,我也不是在谈论广泛的元编程。

我在互联网上做了一些研究,但搜索结果已经完成了真实的模板调试,很难找到这个(希望)相对简单的问题的答案。

2 个答案:

答案 0 :(得分:3)

您可以使用gdb rbreak命令在模板的所有实例上使用gdb中断!这使用了很多!更容易。

#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;
}

您可以按如下方式使用gdb:

gdb> rbreak Foo<.*>
Breakpoint 4 at 0x400cc5: file main.cpp, line 5.
int Foo<int>(int);
Breakpoint 5 at 0x400cda: file main.cpp, line 5.
std::basic_string<char, std::char_traits<char>, std::allocator<char> > Foo<std::string>(std::string);

希望这有帮助!

答案 1 :(得分:2)

普通班级

class foo
{
private:
    int x;
public:
    foo(int n = 0):x(n) {cout<<"foo::foo(int)"<<endl;}
    ~foo() {cout<<"foo::~foo()"<<endl;}
};

To put the breakpoint, we follow as below
$gdb: b foo::foo(int)
      b foo::~foo()

=============================================== ==========

模板类示例

template<typename T>
class bar
{
private:
    T x;
public:
    bar(T n = 0):x(n) {cout<<"bar::bar(int)"<<endl;}
    ~bar() {cout<<"bar::~bar()"<<endl;}
};

To put the breakpoint, we follow as below
$gdb: b bar<int>::bar(int)
      b foo<int>::~bar()

我们唯一需要理解的是(我猜你们有点困惑),当我们调试模板类时,我们不能像bar<T>::bar()这样使用断点。程序运行时,程序会将模板类实例化为特定类型bar<int>::bar()

除此之外,调试非模板与基于模板的类没有区别。我们唯一需要考虑的是,模板基类会有点冗长,特别需要一些时间才能理解。