【问题标题】:Trouble debugging minidump in VS 2010在 VS 2010 中调试 minidump 时遇到问题
【发布时间】:2011-10-29 00:53:42
【问题描述】:

我正在从 .NET 调用 MiniDumpWriteDump 来生成一个小型转储,并且效果很好。但是,当我将生成的转储加载到 VS 2010 中时,我看不到任何有用的信息。特别是,调用堆栈窗口看起来像这样:

它不包含任何托管帧,尽管我在托管代码的异常处理程序中编写转储。此外,它不包含位于我的 exe 中的任何框架。

知道为什么会这样吗?

顺便说一句,当我从 VS 调试器手动创建转储时,转储确实包含预期的托管帧。

编辑:

我找到了一个关于这个的Microsoft Connect issue。它说:

目前 CLR 不支持托管进程获取自己的 转储。

有人知道这是否仍然是真的吗?

【问题讨论】:

  • 使用托管代码调试小型转储在 VS2010 中仍然是一个值得商榷的乐趣。只是一些提示:您需要启用 Microsoft 符号服务器,以便调试器可以在 Windows .pdb 文件的帮助下正确遍历非托管堆栈。并且您需要将 MiniDumpWriteDump() 选项设置为 11,以便垃圾收集堆在 minidump 中被捕获。如果你创建的那个和 VS 创建的一样大,那你就做对了。
  • @stefan msdn.microsoft.com/en-us/magazine/cc188701.aspx - “在仔细研究了我能想到的一切之后,我意识到我要从其他堆栈获取信息的唯一方法是生成一个可以通过它的进程信息返回到 SUPERASSERT.NET。”和“虽然想法是从流程内部遍历所有堆栈,但没有可行的方法来实现这一点。”

标签: visual-studio-2010 debugging callstack minidump


【解决方案1】:

我发现了我的错误。我正在查看错误线程的调用堆栈(我没有意识到有多个线程在运行)。现在我可以很好地看到托管调用堆栈了。

【讨论】:

    【解决方案2】:

    我在我的应用程序中做了类似的事情(即调用 MiniDumpWriteDump,然后在调试器中调查转储)。

    每当我遇到这个问题时,有两个可能的原因:

    • 缺少符号信息
    • 或转储时进程使用的 DLL 或 EXE 丢失

    第一个原因很容易解决。在 VS2010 中,您只需在调用堆栈或模块窗口中右键单击 DLL,然后选择“从 Microsoft 服务器加载符号”。

    第二个原因更难解决。如果缺少 DLL 或 EXE,调试器将拒绝让您调试它,甚至拒绝查看符号。诀窍是从 DMP 文件生成一个虚拟 DLL/EXE。查看 http://www.debuginfo.com/tools/modulerescue.html 的实用程序 MODULERESCUE。此实用程序可以为给定的 DMP 文件生成虚拟 DLL 和 EXE,足以满足调试器的要求,以便再次加载符号。

    【讨论】:

    • 谢谢。我发现我的错误,是我看错了线程。
    【解决方案3】:

    请记住,您应该从 VB.NET 支持但 C# 不支持的异常过滤器调用 MiniDumpWriteDump。

    看看这些链接:

    Getting good dumps when an exception is thrown

    Writing Minidumps from Exceptions in C#

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-04
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    • 2014-07-09
    • 2023-03-25
    • 2011-12-15
    相关资源
    最近更新 更多