【问题标题】:Debugging C++ STL containers in Windbg在 Windbg 中调试 C++ STL 容器
【发布时间】:2008-09-27 05:40:27
【问题描述】:

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

欣赏任何提示、指点。

【问题讨论】:

    标签: c++ stl windbg


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      您可能还想试试这个debugger extension。它是一个名为 SDbgExt 的库,由Skywing 开发。

      【讨论】:

        【解决方案3】:

        Python extension for WinDbg (pykd) 有 sn-p stlp.py 可以转储地图内容。
        目前它支持 STLPort 映射实现。在 x86 和 x64 上测试。 这个article 演示了如何使用它(它是俄语,但是,示例是不言自明的)。

        【讨论】:

          【解决方案4】:

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

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

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

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

          【讨论】:

            【解决方案5】:

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

            【讨论】:

              【解决方案6】:

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

              【讨论】:

                猜你喜欢
                • 2010-09-11
                • 1970-01-01
                • 1970-01-01
                • 2018-05-12
                • 2011-02-07
                • 1970-01-01
                • 1970-01-01
                • 2019-05-04
                • 1970-01-01
                相关资源
                最近更新 更多