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