【问题标题】:Getting Function for a DLL Address Following a Crash获取崩溃后 DLL 地址的函数
【发布时间】:2010-09-19 18:46:41
【问题描述】:

我知道当应用程序崩溃时,系统会报告它在 mydll.dll 中的 0x00004b79 位置崩溃。我有源代码和二进制文件,但我没有 PDB 或该 DLL 构建中的任何列表文件。

崩溃是可重复的,但我无法在生产机器上安装调试器,并且在开发或调试环境中不会发生崩溃。我已经设置了 Dr. Watson,并且有一个故障转储和 Dr. Watson 日志文件。

Dr. Watson 日志文件包含正在执行的函数的反汇编:

        10604b70 8b442408         mov     eax,[esp+0x8]
        10604b74 8b542404         mov     edx,[esp+0x4]
        10604b78 50               push    eax
FAULT ->10604b79 8b4120           mov     eax,[ecx+0x20]    ds:0023:00000020=????????
        10604b7c 52               push    edx
        10604b7d 6801800000       push    0x8001
        10604b82 50               push    eax
        10604b83 ff156c946210 call dword ptr [mydll!DllUnregisterServer+0x1720c (1062946c)]
        10604b89 c20800           ret     0x8

(INT 3 指令在上面的程序集 sn-p 之前和之后。)

堆栈跟踪仅包括地址 mydll+0x4b79。它不提供任何来电者信息。

在 windbg 中加载故障转储未提供任何其他信息。

如何确定崩溃发生在哪个函数(或者更好的是,哪一行代码)中?

【问题讨论】:

    标签: windows debugging dll


    【解决方案1】:

    创建应用程序的故障转储并使用调试器对其进行检查,WinDbg 是这里的明显选择。故障转储将为您提供堆栈跟踪和详细的错误信息。

    编辑:至于无法安装调试器,DrWatson 已预先安装并且能够生成故障转储,然后可以在另一台机器上检查。

    【讨论】:

    • 我在 WinDbg 中有一个故障转储。但是,对于我正在查看的功能仍然一无所知。堆栈跟踪只有 mydll.dll+0x4b79。反汇编只是对 DLL 中其他地方的一堆调用,混合了大量的 MOV、PUSH 和 JZ 指令。
    • 最简单的方法?使用调试信息重建 DLL,重现崩溃。更难的手动工作:将崩溃跟踪到已知/导出的函数并从那里开始工作。
    • 我试图避免重建和重新安装,但这就是我必须做的。谢谢。
    猜你喜欢
    • 2014-02-18
    • 2014-02-03
    • 2020-10-05
    • 2014-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多