Windbg 粉丝声称它非常强大,我倾向于同意。但是在调试 STL 容器时,我总是卡住。如果变量在堆栈上,!stl
扩展有时会计算出来,但是当具有复杂类型(例如std::vector<TemplateField, std::allocator<TemplateField> >
)的容器在堆上或其他结构的一部分时,我只是不知道如何查看其内容。
欣赏任何提示,指针。
我经常发现调试器对 STL 数据类型的支持不足。出于这个原因,我越来越多地使用日志框架和日志语句。我曾经认为这些是为不能使用调试器的人准备的,但我现在意识到它们提供了真正的价值。它们允许您在代码中嵌入可移植的调试知识,并将其与代码一起维护。相反,您在调试器中所做的工作通常是短暂的。
WinDbg (pykd) 的 Python 扩展具有可以转储地图内容的片段stlp.py。
目前它支持 STLPort 映射实现。在 x86 和 x64 上测试。本文演示了如何使用它(它在俄语上,但是,示例是不言自明的)。
前段时间我有完全相同的问题。我的回答是 Visual Studio 确实是一个更好的 STL 和复杂类型的调试器(就像 Visual Studio 只是一个比 MDbg 更好的调试器)。
这并不是说 WinDBG 的功能不那么强大,只是它的级别较低(例如,尝试使用 Visual Studio 对故障转储做任何有用的事情——你不能)。
无论如何,要回答您的问题,您可以使用 Visual Studio 使用一些技巧来查看数据类型:
cdb -p <PID> -pv
. 这将暂停被调试者的线程。现在您可以安全地分离原始 WinDBGqd
qd
。查看 STL 并按您的意愿继续。我通常最终会toString()
在我的很多课程中坚持一种方法。这显示了我认为重要的所有信息,然后任何容器都可以调用它以在控制台中显示类信息
使用 dt -r 即 dt yourapp!class 7ffdf000 -r5