1

情况如下:

背景

我有一个在 Visual Studio 2008 中开发的混合模式 .NET/Native 应用程序。

我所说的混合模式是指前端是用 C++ .NET 编写的,它调用本机 C++ 库。本机代码在应用程序中完成大部分工作,包括根据需要启动新线程。.NET 代码仅用于 UI 目的(赢取表单)。

我有一个在测试人员的计算机上运行的应用程序的发布版本。

本机库经过全面优化编译,但也启用了调试(“调试信息格式”设置为“程序数据库”)。

这意味着我在 PDB 文件中有应用程序的调试符号。

问题

所以无论如何,其中一位测试人员遇到了应用程序问题,它偶尔会在 XP 上崩溃。我已经能够使用 Watson 博士多次运行获得崩溃的小型转储。

当我调试它时(使用 minidump - 我实际上并没有调试真正的应用程序),所有调试符号都正确加载:我可以正确看到所有本机线程的完整堆栈跟踪。其他线程(可能是 .NET 线程)没有堆栈跟踪,但它们至少都向我显示了线程是在哪个 dll 上启动的(即 ntdll.dll)。

它正确报告失败的线程(“用户(5).dmp 中 0x0563d652 处的未处理异常:0xC0000005:访问冲突读取位置 0x00000000)。

但是,当我进入线程时,它显示没有任何用处。在堆栈跟踪中有一个条目,它只有内存地址“0563d652()”(甚至不是“ntldll.dll”)。

当我进行拆卸时,它只显示大约 30 条指令的随机部分。内存地址的任何一侧都只是“???”。它几乎看起来不是我的源代码的一部分(您的二进制文件不是按顺序加载到内存中吗?在中间有一组随机的汇编语句是否正常?)。

我的问题

所以基本上我的问题是三次的。

1)任何人都可以解释调试器缺乏信息吗?

2)请记住,我无法显示我的代码中发生的错误,任何人都可以提出失败的原因

3) 我可以做任何其他事情来帮助我在未来诊断当前的问题吗?

帮助!

约翰

更新:

这是来自 WinDBG 的失败线程的堆栈转储

 # ChildEBP RetAddr  
WARNING: Frame IP not in any known module. Following frames may be wrong.
00 099bf414 02d0e7fc 0x563d652
01 00000000 00000000 0x2d0e7fc

很奇怪吧?甚至不显示 DLL。

是否有可能我已经以某种方式破坏了堆栈/堆,导致线程刚刚被破坏......?

4

4 回答 4

3

你在用WinDbg吗?如果是这样,您是否使用罢工之子扩展程序?

Bugslayer:罢工之子

-或者-

深入了解 .NET Framework 内部结构,了解 CLR 如何创建运行时对象

于 2009-04-09T12:23:20.363 回答
1

We had an issue similar to this where a code bug was silent in MSVC2K5 SP1, but if you had the MSVC2K5 SP2 runtime installed it caused an error which didn't point at valid code.

Part of the problem is, when you start executing data as code you could be doing anything and so the crash location becomes useless as you cannot even get back to a valid stack trace.

We had this happen to us when the new .Net runtime install installed a newer version of the MSVC C++ Runtime in the SxS directory.

In the end our method to resolve the issue was to make the crash happen frequently and add as much logging as necessary to localize it.

于 2009-04-09T13:11:38.780 回答
1

一旦你抓住并安装了windbg的副本并在那里打开了转储文件,你能发布错误线程的堆栈吗?我们可以从那里开始。

于 2009-04-09T17:56:24.903 回答
0

您的 EIP 刚刚损坏。
假设 ESP 有效,可以查看调用栈,只需输入:
dds esp [enter]
dds [enter]

您还可以使用内存窗口:
将地址设置为:esp
将格式设置为:指针和符号

于 2009-08-12T09:03:35.747 回答