使用gdbdebuggingC ++ STL / Boost的最佳实践
使用gdb进行debugging,任何使用STL / boost的c ++代码仍然是一个噩梦。 任何使用STL的gdb都知道这一点。 例如,请参阅代码中的一些debugging会话的示例运行。
我试图通过收集提示来减轻痛苦。 能否请您对我在下面收集的提示发表意见(尤其是您已经使用过哪些build议,以及对build议的更改) – 我列出了提示是技术性降序。
- 有人使用“斯坦福GDB STL实用程序”和“UCF GDB实用程序” ? 是否有一些这样的使用提升数据结构? 上面的utils似乎不是可recursion使用的,例如在一个命令中以可读的方式打印boost :: shared_ptr的向量。
- 编写你的.gdbinit文件。 包括例如C ++相关的美化器,列在UCF GDB utils的底部。
- 使用选中/debuggingSTL / Boost库,如STLport。
- 使用日志logging(例如这里所描述的)
更新 :GDB有一个新的C ++分支 。
也许不是那种你正在寻找的“技巧”,但是我不得不说,从C ++&STL到C ++&boost&STL几年后,我的经验是,现在我花在GDB上的时间比我less很多习惯于。 我把这个放在了很多事情上:
- 增加智能指针(特别是“共享指针”,当需要性能时指针容器)。 我不记得上次我必须写一个明确的删除(删除是C ++恕我直言的“goto”)。 有很多GDB的时间追踪无效和泄漏的指针。
- 提升是充满了你可能破解了一些劣质版本的东西的经过validation的代码。 例如
boost::bimap
对于LRUcaching逻辑的常见模式非常有用。 还有一堆GDB的时间。 - 采用unit testing。
boost::test
的AUTOmacros意味着设置testing用例( 比CppUnit更容易 )是一个绝对的琐事。 这很早就捕获了很多东西,然后它就被构build到任何你必须附加一个debugging器的地方。 - 与此相关的是,像
boost::bind
这样的工具可以更容易地进行testingdevise。 例如,algorithm可以是更通用的,并且与其操作的types更紧密; 这使得它们更容易被插入到testing垫片/代理/模拟对象中(而且暴露在提升模板中的事实会鼓励你“敢于模板”以前从未考虑过的事情,从而产生类似的testing益处)。 -
boost::array
。 “C数组”性能,在debugging版本中进行范围检查。 - 提升是充满了伟大的代码,你不禁要学习
你可能会看:
用gdb检查标准容器(std :: map)的内容
我认为最简单和最多的select是使用日志logging(以及我实际使用debugging打印,但我认为这不是重点)。 最大的好处是你可以检查任何types的数据,每次程序执行多次,然后用文本编辑器search它来查找有趣的数据。 请注意,这是非常快的。 缺点是显而易见的,您必须预先select您想要logging的数据和地点。 然而,这不是一个严重的问题,因为你通常知道代码中哪里发生了不好的事情(如果不是的话,你只要加上理智检查,然后你就会知道了)。
检查/debugging库是好的,但作为一个testing工具(例如运行它,看看我是否做错了什么)更好,而且不擅长debugging特定问题。 他们无法检测到用户代码中的缺陷。
否则,我使用普通的GDB。 听起来并不是那么糟糕,虽然可能是因为“ print x
”打印了一大堆垃圾而感到害怕。 但是,如果您有debugging信息,例如打印std::vector
工作成员,如果有任何失败,您仍然可以通过x
命令检查原始内存。 但是,如果我知道我在找什么,我使用选项1 – 日志logging。
请注意,“难以检查”的结构不仅仅是STL / Boost,还有其他库,比如Qt / KDE。