5

我有一个作为 Windows 服务运行的应用程序。今天,我被告知该服务已死亡。我找到了一个事件查看器条目,其基本信息是:故障模块 kernel32.dll,版本 6.0.6002.18740,时间戳 0x50b58c3d,异常代码 0xc0000005,故障偏移量 0x0003fc2e

我确定我的代码中存在错误。我可以从偏移量中确定 kernel32.dll 函数(异常来自哪里)吗?我打算回溯到我的代码中的调用。

4

1 回答 1

8

我同意评论中所说的,但无论如何我认为答案可能有用。如果 EventViewer 报告 kernel32.dll 中失败指令的偏移量,您可以使用 SDK 中的 Windows 调试工具找到函数名称。

首先,安装 Windows 调试工具并配置 Microsoft 公共符号服务器的路径。说明可在线获得,例如,此视频:http ://channel9.msdn.com/Shows/Defrag-Tools/Defrag-Tools-Building-your-USB-thumbdrive

启动附加到您的进程或系统中任何进程的 Windows 调试器。kernel32.dll 是任何进程加载的第一个 DLL 之一,它不太可能被重新定位。所以 kernel32.dll 的基地址在所有进程中都是相同的。

通过在调试器中运行“list modules”命令获取 kernel32.dll 的基地址

0:006> lm m kernel32
start    end        module name
7c800000 7c8f6000   kernel32   (pdb symbols)          c:\debuggers\symbols\kernel32.pdb\A22E3A9843CC45B4A2BFA31377127D422\kernel32.pdb

所以基地址是7c800000。现在使用 DLL 基地址和偏移量运行“反汇编单指令”命令:

0:006> u 0x7c800000+0x0003fc2e l 1
kernel32!BasepCopyFileExW+0x859:
7c83fc2e 53              push    ebx

BasepCopyFileExW函数名也是如此。(您系统上的结果可能会有所不同。)

于 2013-07-23T17:44:52.827 回答