其他分享
首页 > 其他分享> > 如何在DDD(或gdb)中使用unique_ptr调试C 11代码?

如何在DDD(或gdb)中使用unique_ptr调试C 11代码?

作者:互联网

std :: unique_ptr很不错,但是在DDDgdb调试时我发现它们不太舒服.

我正在使用gcc中的gdb pretty打印机(例如/usr/share/gcc-4.8.2/python/libstdcxx/v6/printers.py).这是可读性的一大胜利,例如:

$print pTest
std::unique_ptr<MyType> containing 0x2cef0a0

但是,取消引用指针不起作用:

$print *pTest
Could not find operator*.

当我需要访问该值时,我必须手动复制指针并将其强制转换为正确的类型,例如:

print *((MyType*) 0x2cef0a0)

如果进程仍在运行,那么这个版本可以工作(仍然很难但更好):

print *pTest.get() // will not work if analyzing a core dump

在DDD中直接显示Display * pTest的方法也不起作用.它只会导致以下错误:

<error: Could not find operator*.>

有没有办法在DDD中使用unique_ptr调试C 11代码(不像我使用繁琐的解决方法那样打破工作流程)?

我不怕使用gdb命令,但DDD集成将是一个加号.例如,通过双击它们来跟踪数据结构中的指针通常比键入更快.

我已经尝试放弃漂亮的打印机,但它也不是最佳选择.我能想到的最好的是以下内容:

 print pTest._M_t->_M_head_impl

解决方法:

这个问题实际上与C 11,unique_ptr或漂亮的打印无关.问题是gcc不会为std :: unique_ptr :: operator *发出代码,可以由gdb调用以取消引用unique_ptr.例如,你添加* pTest;到你的代码然后gdb确实执行解除引用.

SO 07 How to `print`/evaluate c++ template functions in gdb中描述了类似的问题.在https://sourceware.org/ml/archer/2012-q1/msg00003.html,auto_ptr描述了几乎相同的问题.如果我正确理解了线程,一个解决方法是修补漂亮的打印机,并在打印unique_ptr时打印出解除引用的指针.可以在http://sourceware.org/bugzilla/show_bug.cgi?id=12937找到gdb错误报告.

https://sourceware.org/gdb/wiki/STLSupport上的gdb wiki描述了更漂亮的打印解决方案,可能有其他解决方法.

编辑:强制编译器为包括operator *在内的所有成员模板发出代码的更优雅的解决方案是显式实例化该类:

template class std::unique_ptr<MyType>;

标签:c,c11,gdb,unique-ptr,ddd-debugger
来源: https://codeday.me/bug/20190928/1828211.html