1

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

程序收到信号 EXC_BAD_ACCESS,无法访问内存。原因: KERN_INVALID_ADDRESS 地址:0x00000000000000a1 0x00007fff814c0684 in std::ostream::sentry::sentry () 正在调试的程序在从 GDB 调用的函数中发出信号。GDB 保留在接收信号的帧中。要更改此行为,请使用 "set unwindonsignal on" 对包含函数 (wfSamplePath::print_traj(std::ostream&)) 的表达式的评估将被放弃。

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

4

1 回答 1

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"
于 2013-11-11T23:38:06.330 回答