如何在ucrtbase.dll中找到在指定偏移量处执行的代码?

时间:2018-07-09 17:51:44

标签: debugging

查看此评论Windows c++ service faulting on ucrtbase.dll when starting

(与帖子重复)

  

ucrtbase + 7350e是CRT中止功能中的int 0x29指令。这是具有代码FAST_FAIL_FATAL_APP_EXIT(7)的KERNEL_SECURITY_CHECK_FAILURE的__fastfail内在函数。该中断由KiRaiseSecurityCheckFailure处理,从而引发STATUS_STACK_BUFFER_OVERRUN(0xC0000409)

从调试的角度来看,那里提供的信息很有用(从学术上讲非常有用,不是运行时发生溢出的错误,他只是倒霉的一个举报者),该用户如何确定这一点?

我意识到已经提供了一些C语言运行时的代码,但是如何从偏移量过渡到源文件呢?

我有一个类似的问题正在尝试在这里查找:

Fault Module Name:  ucrtbase.dll
Fault Module Version:   10.0.14393.2097
Fault Module Timestamp: 5a820a13
Exception Offset:   000000000006eabe
Exception Code: c0000409

我正在ucrtbase + 6eade上寻找代码

1 个答案:

答案 0 :(得分:1)

即使应用程序未在调试器下运行或内存转储不可用,也可能会知道该应用程序发生故障的那一行。它可能不会告诉您失败的原因,但它至少会为您提供开始调查的地方。

应用程序失败后,在Windows事件日志中查找如下所示的条目:

  

“正在对应用程序yourapp.exe进行故障修复,版本1.0.0.0,时间戳记   0x49e0238,模块yourmodule.dll,版本1.1.0.0出现故障,时间戳记   0x09ec5a57,异常代码0xc0000005,故障偏移量   0x000000000051000e,进程ID为0x00,应用程序启动时间为0x00。“

使用windbg.exe -z c:\yourmodule.dll加载发生故障的模块(确保有符号!) 列出加载的模块(在这种情况下为yourmodule.dll

0:000> lm
start             end                 module name
00000000`00300000 00000000`00425000   yourmodule    (private pdb symbols)  c:\yourmodule.pdb

通过将事件查看器中报告的“故障偏移量”添加到模块的“起始”地址来查找崩溃的行

0:000> ln 300000+5100e
c:\sources\myclass.cpp(130)+0x14

如果您的符号与生产中的模块不完全匹配,则可以尝试 windbg 命令“ .symopt + 0x40”;它将减少限制。