如何从故障偏移中确定调用的kernel32.dll函数

时间:2013-07-23 15:19:37

标签: c windows

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

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

1 个答案:

答案 0 :(得分:8)

我同意评论中所说的内容,但无论如何,我认为答案可能有用。以下是使用SDK中的Windows调试工具查找函数名称的方法,前提是EventViewer报告了kernel32.dll中失败指令的偏移量。

首先,安装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是函数名。 (您系统上的结果可能会有所不同。)