我们的程序COM+部分出了问题,我用adplus -carsh 抓了dump 文件进行分析。
对windbg 不熟悉,有几个地方不明白,请教一下。
1.出现错误后,抓取的dump文件会有好多个。例如
PID-324__DLLHOST.EXE_Genersoft_BSCW__1st_chance_AccessViolation__mini_0440_2007-04-02_15-47-45-812_0144.dmp
PID-324__DLLHOST.EXE_Genersoft_BSCW__1st_chance_AccessViolation__mini_0440_2007-04-02_15-48-20-687_0144.dmp
PID-324__DLLHOST.EXE_Genersoft_BSCW__1st_chance_AccessViolation__mini_0440_2007-04-02_15-48-31-875_0144.dmp
。。。。。
我不明白 : 抓取的这些dump文件的个数是有什么决定的?
这些文件产生的先后顺序对我来说意味着什么?这些dump 文件之间有什么关系呢 ? 我觉得弄明白这个很重要,这决定了我分析的时候是全部分析呢,还是分析具体的某几个
2.程序里有些组件是用delphi写的,我把map文件转换为了dbg文件。
我打开!sym noisy 后发现了一些这样的信息
image header does not match memory image header.
Couldn't map image from disk
Partial symbol image load missing image info
这些dump 文件都是从别的服务器上抓的。那为什么还要根我机器上的那些文件有联系呢。
幸好我的机器上也安装了那套程序,不然的话,那些调试符号就加载不进来。
我不知道这是怎么回事.
windbg 用到的调试符号不是由产生dump时进程中的dll的版本决定的吗,跟我分析dump文件用的机器还有什么关系吗?
对于问题1,你将Adplus运行在了所谓的崩溃模式(Crash Mode),这实际上会将一个调试器CDB附加到要监视的进程。这个调试器会监视包括除零、非法访问等结构化异常。因为调试器总是先于应用程序得到异常处理机会,所以不管你的应用程序是否捕捉了这些异常,CDB都会先得到机会,并写一个dump文件。而且一旦有调试器,那么它会默认处理异常的第二轮处理机会,但这个处理实际上并没有解决问题。所以异常还会发生,如此循环不断。通常没有调试器时,不会进入第二轮异常分发应用程序就会被关闭。
文件名中的AccessViolation表示这是因为发生了Access Violation (访问违例,非常普遍的异常)异常而写的dump。__1st_chance_表示是在异常的第一轮处理机会时写的dump。
因此,以上这么多dump文件很可能是重复的,也就是描述的都是一个异常。所以,你分析哪个关系都不是很大,通常可以分析最早发生的一个。
对于问题2,第一,WinDbg不仅需要符号文件,还需要可执行文件(DLL等)。第二,每个符号文件都有自己的时间戳和Age属性,你自己转化出来的很可能与要求的不匹配。
对于第一轮异常,CDB/ADPLUS写完dump后,返回给系统FALSE,意思是让系统继续搜索异常处理器(catch或__except等)。这时如果代码中有异常处理器而且处理了异常,那么分发结束,如果没有异常处理器,那么如果系统不在调试,那么缺省的异常处理器就会终止程序,如果在调试,那么却省的调试处理器会返回EXCEPTION_CONTINUE_SEARCH给系统,引发第二轮分发。对于第二轮,调试器仍然先得到处理机会,但是这次调试器会返回TRUE,意思是我“处理”了,回到原位置继续执行。回到原来位置多数会再发生异常,因为异常条件并没有真正消除。
对于有调试器的情况,系统是假设有调试工程师坐在旁边的,他/她了解以上情况,可以采取措施,选择终止以上循环,或者采用其它办法跳出循环,比如把EIP指针调整到新的位置——要视具体情况了。
我明白了,谢谢您的详细的解答。谢谢您了。