10

Windbg 粉丝声称它非常强大,我倾向于同意。但是在调试 STL 容器时,我总是卡住。如果变量在堆栈上,!stl扩展有时会计算出来,但是当具有复杂类型(例如std::vector<TemplateField, std::allocator<TemplateField> >)的容器在堆上或其他结构的一部分时,我只是不知道如何查看其内容。

欣赏任何提示,指针。

4

6 回答 6

3

我经常发现调试器对 STL 数据类型的支持不足。出于这个原因,我越来越多地使用日志框架和日志语句。我曾经认为这些是为不能使用调试器的人准备的,但我现在意识到它们提供了真正的价值。它们允许您在代码中嵌入可移植的调试知识,并将其与代码一起维护。相反,您在调试器中所做的工作通常是短暂的。

于 2008-09-27T05:55:46.403 回答
2

您可能还想试试这个调试器扩展。它是一个名为 SDbgExt 的库,由Skywing开发。

于 2008-10-15T19:29:19.383 回答
2

WinDbg (pykd) 的 Python 扩展具有可以转储地图内容的片段stlp.py。
目前它支持 STLPort 映射实现。在 x86 和 x64 上测试。本文演示了如何使用它(它在俄语,但是,示例是不言自明的)。

于 2011-04-10T19:56:56.340 回答
1

前段时间我有完全相同的问题。我的回答是 Visual Studio 确实是一个更好的 STL 和复杂类型的调试器(就像 Visual Studio 只是一个比 MDbg 更好的调试器)。

这并不是说 WinDBG 的功能不那么强大,只是它的级别较低(例如,尝试使用 Visual Studio 对故障转储做任何有用的事情——你不能)。

无论如何,要回答您的问题,您可以使用 Visual Studio 使用一些技巧来查看数据类型:

  1. 启动另一个 WinDBG 实例,以非侵入方式附加:cdb -p <PID> -pv. 这将暂停被调试者的线程。现在您可以安全地分离原始 WinDBGqd
  2. 将 Visual Studio 附加到它,然后分离非侵入式 WinDBG qd。查看 STL 并按您的意愿继续。
  3. 当您需要返回 WinDBG 时,转到第 1 步,与侵入式 WinDBG 进行交换。
于 2011-01-05T13:37:37.987 回答
0

我通常最终会toString()在我的很多课程中坚持一种方法。这显示了我认为重要的所有信息,然后任何容器都可以调用它以在控制台中显示类信息

于 2008-09-27T10:37:05.667 回答
0

使用 dt -r 即 dt yourapp!class 7ffdf000 -r5

于 2008-10-12T13:00:58.063 回答