如何使用Gdb调试器从数论库中查找ZZ对象的值?

时间:2016-02-08 20:02:19

标签: c++ debugging gdb ntl

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

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

我想这是我的ZZ对象的地址。我该如何打印它的价值?我应该提一下,我不知道这堂课的内部表现。

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

2 个答案:

答案 0 :(得分:1)

  

我可以在Eclipse等编译器中使用NTL吗?

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

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

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

答案 1 :(得分: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