gpt4 book ai didi

c++ - 在GDB中查看打印方法

转载 作者:太空宇宙 更新时间:2023-11-04 11:45:45 26 4
gpt4 key购买 nike

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

Program received signal EXC_BAD_ACCESS, Could not access memory. Reason: KERN_INVALID_ADDRESS at address: 0x00000000000000a1 0x00007fff814c0684 in std::ostream::sentry::sentry () The program being debugged was signaled while in a function called from GDB. GDB remains in the frame where the signal was received. To change this behavior use "set unwindonsignal on" Evaluation of the expression containing the function (wfSamplePath::print_traj(std::ostream&)) will be abandoned.

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

最佳答案

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"

关于c++ - 在GDB中查看打印方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19917918/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com