帮助postmorten调试混合模式Win32应用程序

时间:2009-04-09 12:09:30

标签: c++ debugging managed-c++ mixed-mode postmortem-debugging

情况如下:

背景

我有一个在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。

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

4 个答案:

答案 0 :(得分:3)

您使用的是WinDbg吗?如果是这样,你使用的是罢工之子吗?

Bugslayer: Son-of-Strike

- 或 -

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)

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

答案 3 :(得分:0)

你的EIP刚刚被破坏了 假设ESP有效,您可以查看callstack,只需输入:
dds esp [enter]
dds [enter]

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