情况如下:
背景
我有一个在Visual Studio 2008中开发的混合模式.NET / Native应用程序。
混合模式的意思是前端是用C ++ .NET编写的,它调用本机C ++库。本机代码完成应用程序中的大部分工作,包括根据需要启动新线程。 .NET代码仅用于UI目的(获胜表单)。
我在测试人员的计算机上运行了一个应用程序的发布版本。
本机库使用完全优化进行编译,但也启用了调试(“调试信息格式”设置为“程序数据库”)。
这意味着我在PDB文件中有应用程序的调试符号。
问题
所以无论如何,其中一个测试人员遇到了应用程序的问题,它偶尔会在XP上崩溃。我已经能够使用Dr Watson进行多次运行来获得崩溃的小型泵。
当我调试它时(使用minidump - 我实际上并没有调试真正的应用程序),所有调试符号都正确加载:我可以正确地看到所有本机线程的完整堆栈跟踪。其他线程(可能是.NET线程)没有堆栈跟踪,但它们至少都显示了线程启动的dll(即ntdll.dll)。
它正确报告失败的线程(“用户(5)中的0x0563d652处的未处理异常.dmp:0xC0000005:访问冲突读取位置0x00000000)。
然而,当我进入线程时,它没有显示任何有用的东西。在堆栈跟踪中,有一个条目只有内存地址“0563d652()”(甚至不是“ntldll.dll”)。
当我进入dissasembly时,它只显示了大约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。
我是否有可能以某种方式损坏了堆栈/堆,导致线程被损坏......?
答案 0 :(得分:3)
您使用的是WinDbg吗?如果是这样,你使用的是罢工之子吗?
- 或 -
Drill Into .NET Framework Internals to See How the CLR Creates Runtime Objects?
答案 1 :(得分:1)
我们遇到了类似的问题,其中代码错误在MSVC2K5 SP1中是静默的,但如果您安装了MSVC2K5 SP2运行时,则会导致错误,而该错误未指向有效代码。
部分问题是,当您开始执行数据作为代码时,您可能正在执行任何操作,因此崩溃位置变得无用,因为您甚至无法返回到有效的堆栈跟踪。
当新的.Net运行时安装在SxS目录中安装了更新版本的MSVC C ++ Runtime时,我们遇到了这种情况。
最后,我们解决问题的方法是经常发生崩溃,并根据需要添加尽可能多的日志记录来进行本地化。
答案 2 :(得分:1)
答案 3 :(得分:0)
你的EIP刚刚被破坏了
假设ESP有效,您可以查看callstack,只需输入:
dds esp [enter]
dds [enter]
您也可以使用内存窗口:
将地址设置为:esp
将格式设置为:指针和符号