4

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

调用堆栈

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

知道为什么会这样吗?

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

编辑:

我发现了一个关于此的Microsoft Connect 问题。它说:

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

任何人都知道这是否仍然是真的?

4

3 回答 3

2

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

于 2011-09-09T14:30:38.770 回答
0

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

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

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

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

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

于 2011-09-09T14:21:39.637 回答
0

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

看看这些链接:

抛出异常时获得良好的转储

在 C# 中从异常中编写小型转储

于 2011-09-09T15:00:22.690 回答