簡體   English   中英

使用gdb調試c ++模板

[英]debug c++ template with gdb

當我用模板調試函數內部時,

  1. 我如何知道當前函數使用的模板類型?

    我試過p T 它說gdb不能打印一種類型。

  2. 如何打破特定模板類型?

    讓我們說函數foo<T>(...)有兩種可能的形式, foo<int>(...)foo<long>(...) 我如何設置一個斷點,以便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;
}

在這里,我可以進入s2的構造函數並看到T

(gdb) ptype T
type = const char *

看看當前的框架:

(gdb) frame
#0  S<char const*>::S (this=0x7fffffffe35f, t=0x400940 "hello") at q.cc:8
8       std::cout << t;

我可以使用那里給出的函數名設置斷點:

(gdb) b S<const char *>::S
Breakpoint 2 at 0x40087a: file q.cc, line 8.

要為所有實例設置斷點,請使用:

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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM