在GDB中查看打印方法

时间:2013-11-11 23:18:39

标签: c++ gdb

我有一个复杂的类,为了调试的目的,我已经编写了一个干净的打印方法,或多或少。但是,当我使用gdb时,我似乎无法弄清楚实际使用它来打印的语法。基本上我想要能够键入类似“myObject-> print()”的内容并让它运行我的print方法,但我得到以下错误:

  

程序收到信号EXC_BAD_ACCESS,无法访问内存。   原因:KERN_INVALID_ADDRESS位于地址:0x00000000000000a1   std :: ostream :: sentry :: sentry()中的0x00007fff814c0684程序   正在调试时,在从GDB调用的函数中发出信号。 GDB   保留在收到信号的帧中。要改变这一点   行为使用“set unwindonsignal on”评估表达式   包含该函数(wfSamplePath :: print_traj(std :: ostream&))将   被遗弃。

其中“wfSamplePath”是我的类,“print_traj”是我的print方法(使用std :: cout作为默认参数)。所以我认为我能做到这一点显然有些不对劲。我在xcode 3中使用gdb。“myObject”肯定在范围内,因为我可以访问其他一些方法。

1 个答案:

答案 0 :(得分:1)

GDB中的表达式求值程序非常有限,特别是对于C ++表达式,所以尽量保持简单。特别是,不要使用默认参数。使用cout也可能是一个坏主意。内联函数也是如此。

使用返回字符串的简单成员函数,我得到了很好的结果。例如,此代码按预期工作:

#include <sstream>

struct S
{
    int x, y, z;
    std::string debug();
};

std::string S::debug()
{
    std::ostringstream os;
    os << x << ", " << y << ", " << z;
    return os.str();
}

int main()
{
    S s;
    s.x = 1;
    s.y = 2;
    s.z = 3;
    return 0;
}

然后,编译并调试:

$ g++ -O0 -g test.cpp
$ gdb ./a.out
....
$start
....
19      s.x = 1;
(gdb) n
20      s.y = 2;
(gdb) n
21      s.z = 3;
(gdb) n
22      return 0;
(gdb) p s.debug()
$1 = "1, 2, 3"
相关问题