ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2019-09-28 17:07:19  阅读:352  来源: 互联网

标签:c c11 gdb unique-ptr ddd-debugger


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有