1

我使用 gdb 调试器来打印 ZZ 类型的变量的值。此数据类型在数论库或 NTL中定义。当我使用“print x”来找出我的变量的值时,我得到了这样的东西:

print x 
$1 = {rep=0xab2cc54}. 

我想这是我的 ZZ 对象的地址。我怎样才能打印它的价值?我应该提一下,我不知道这个类的内部表示。

我可以将 NTL 与 Eclipse 之类的编译器一起使用来更轻松地调试我的应用程序吗?

4

2 回答 2

1

我可以将 NTL 与 Eclipse 之类的编译器一起使用吗?

首先:Eclipse 不是编译器,而是为您封装编译器和调试工具的 IDE。

在调试模式下,IDE 能够解析源代码中使用的实际类型和内部表示,并让您逐步完成。

也就是说,我很确定您可以使用 Eclipse CDT 来检查您的特定类型值。

于 2016-02-08T20:07:33.497 回答
1

……我的 ZZ 对象。我怎样才能打印它的价值?

这有点难看,但有效:

(gdb) call NTL::operator<<(std::ostream&, NTL::ZZ const&)(cerr, x)
42$1 = (std::ostream &) @0x620020: <incomplete type>

(在本例中,变量x的值为42)。
如果您不想在值之后出现垃圾,则可以转换为void

(gdb) call (void)NTL::operator<<(std::ostream&, NTL::ZZ const&)(cerr, x)
42(gdb) 

(但请注意,值之后没有换行符)。

如果你不是using namespace std,你可能不得不写

(gdb) call NTL::operator<<(std::ostream&, NTL::ZZ const&)('std::cerr', x)

有时cerr可能不在范围内:

(gdb) call NTL::operator<<(std::ostream&, NTL::ZZ const&)(cerr, x)        
No symbol "cerr" in current context.

- 然后你可以尝试使用cout,但它变得更加丑陋,因为必须刷新缓冲的输出:

(gdb) call NTL::operator<<(std::ostream&, NTL::ZZ const&)(cout, x)
(gdb) call 'std::basic_ostream<char, std::char_traits<char>>& std::operator<< <std::char_traits<char>>(std::basic_ostream<char, std::char_traits<char>>&, char const*)'(&cout, "\n")
42
于 2016-04-08T08:03:06.353 回答