情况如下:
背景
我有一个在 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。
是否有可能我已经以某种方式破坏了堆栈/堆,导致线程刚刚被破坏......?