前段日子调试dump文件的时候遇到一个问题:生成的64位进程的dump文件,换台机子后打开该dump文件,调用堆栈显示异常,32位程序不存在这种情况

问题是这样:

我在64位winsrv2003上用的X64配置编的测试exe,内容为在程序内抛出异常,并通过SetUnhandledExceptionFilter设置异常处理函数,在该函数内通过调用dbghelp.dll的MiniDumpWriteDump生成dump文件。

在本机执行生成dump文件(a.dmp),拖到vs10里面可以打开,看到详细的函数调用栈信息,当我把exe,pdb以及a.dmp文件拷到其他64位机器(一台64位win7)下,将a.dmp拖到vs10里面,看到的函数调用栈信息,跟之前在winsrv2003上看到的是不一样的,而且很少,只有一两行,其他的都是灰色的

若我在这台64位win7上生成dump文件(b.dmp),则在当前这台win7上b.dmp可以看到详细函数栈,但是将该dump拷到原来的winsrv2003上又是同一样的情况,看不了

还有个很奇怪的现象,跨机用 windbg 打开,使用 kb 指令看到栈信息跟vs里面的一样,但是当我用 !analyze -v 指令时, 就可以打出正常的调用栈信息

我还测试了相同系统的情况下,两台64win7 sp1 也还是相同的情况,
在本机可以看,说明dump文件生成应该是没问题的,只是一跨机就看不了,这到底是什么情况呢,符号库吗?

这是为什么呢?
我的理解是:只要pdb\exe\dmp\文件配套的话,就算系统底层模块的函数栈无法显示,但至少exe模块内的栈信息还是可以显示的。

这个问题搞了我好多天,查阅各种资料无果

终于在各种尝试后,找到解决办法:

若dump文件在机子A生成的,拷到机子B之后查看,需要拷贝机子A上的若干系统底层dll到dump文件目录下
具体是哪些dll可以将dump拖到VS里后,查看"调试-模块"窗口里显示的那些
不过一般不需要全部,只要kernel32.dll 或者 kernelbase.dll 就可以了,若不行的话在尝试拷其他的dll
拷贝后,将dump拖到VS里,再执行就OK了

注:64位 windows 下
C:\WINDOWS\system32 下的才是 64 位程序的 dll
C:\WINDOWS\syswow64 下的为 32 位程序 dll

 

posted on 2013-01-30 18:50  布丁嫩  阅读(1226)  评论(0编辑  收藏  举报