使用Windows事件查看器调试崩溃

本文讨论如何使用Windows事件查看器获取实际崩溃的模块以及代码中崩溃的位置。示例代码是用C++编写的,以生成不同类型的崩溃,例如访问冲突和堆栈溢出。

简介

我经常听同事和QA那里听说,一个特定的崩溃很容易在客户机上重现,而不是在他们的机器上重现。这是一个棘手的问题,因为开发人员无法在客户机上调试崩溃。最终的结果是支持团队和客户之间无休止的沟通,甚至是现场会议。很少有聪明的程序员自己开发一个崩溃日志系统来确定导致崩溃的代码。很少有人会在代码中全面地实现try-catch块,以缩小问题的范围。

背景

近年来,我开始使用事件查看器检查在特定计算机上注册的各种警告和错误的日志。我注意到应用程序或程序崩溃记录在应用程序事件日志中,并且在大多数情况下都有足够的信息来获取崩溃或问题位置。事件查看器通常位于C:\ Windows\system32\eventvwr.exe中,一旦启动,就可以轻松查看应用程序事件日志。

当应用程序或程序在特定机器上崩溃时,类似的信息也会显示给用户。

如何调试崩溃?

为了更好地理解事件记录器/查看器,我决定创建一个简单的程序,当某个特定的命令行参数传递给它时,该程序将崩溃。

HowToFindCrashInExeCode.exe以1到4之间的数字作为参数,然后通过生成适当的异常来相应地崩溃。1号和3号生成访问冲突异常,而2号和4号分别在从属DLL和主EXE中生成StackOverflow异常。下面的两个图像显示了当程序在命令行上崩溃时,使用1作为输入参数的崩溃报告和应用程序事件日志。

应用程序事件日志提供给我们的重要细节是错误应用程序路径、错误模块名称和路径、异常代码以及最重要的错误偏移量。错误应用程序路径、错误模块名称和路径的目的非常明显。异常代码揭示了崩溃发生的细节和/或情况。故障偏移量是加载的故障模块内的内存位置,即它为我们提供了日志中提到的故障模块中的准确故障位置。从客户处获取应用程序事件日志后,请检查故障模块名称、路径和故障偏移量,然后在计算机上启动应用程序并将其附加到调试器。找到加载的故障模块的起始内存地址,并将故障偏移量添加到此地址。然后使用反汇编跳转到内存地址。反汇编将准确地告诉您崩溃的位置。这不是一个很酷很快就能解决问题的方法吗。上面的事件管理器日志告诉我们,错误模块是HowToFindCrashInDLLCode.dll,异常代码是0xc000005,这是访问冲突异常,错误偏移量是0x00001032。下图描述了howtoFindCrashHindllcode.dll的反汇编以及模块加载地址。

模块加载地址为0x73D60000,现在添加错误偏移量0x00001032。产生的内存地址是0x73D61032。跳转到此内存位置后,可以看到崩溃来自函数crashForAccessViolation,生成此崩溃的代码是pVal[0]=10;因为pVal是未实例化的整数指针。

比较有趣的点

在开发人员的机器上调试相同版本/配置/平台的程序以获得准确的错误位置是很重要的。另外,如果为程序生成了pdb,那么一旦跳转到错误偏移量,就可以看到反汇编和源代码。不需要在禁用优化的情况下构建程序,因为该程序的错误偏移量是通用的,开发人员需要自己做一些基本的数学计算。有时,崩溃模块是系统DLL之一,例如kernel.DLL、nt.DLL或msvcr100.DLL,然后按上述方法检查故障偏移量,并检查异常代码。这两件事将帮助您猜测代码中的问题,例如STL或CRT库抛出一些异常,如逻辑错误,有时会生成未处理的异常,这些异常会被系统DLL捕获。

原文地址:https://www.cnblogs.com/yilang/p/11993912.html

时间: 2024-10-13 10:48:05

使用Windows事件查看器调试崩溃的相关文章

Windows 事件查看器(收集)

原文:Windows 事件查看器(收集) 事件查看器相当于一本厚厚的系统日志,可以查看关于硬件.软件和系统问题的信息,也可以监视 Windows 的安全事件 提示:除了可以在"控制面板→管理工具"中找到"事件查看器"的踪影外,也可以在"运行"对话框中 手工键入"%SystemRoot%\system32\eventvwr.msc /s"打开事件查看器窗口. 1. 应用程序日志 包含由应用程序或系统程序记录的事件,主要记录程序运

IIS事件查看器_WebServer事件查看器_帮助查看IIS-Web服务器事件执行日志

IIS服务器是我们常用的Web站点部署工具,而我们有时可能遇到IIS服务器的应用程序池莫名其妙的关闭了,或者是其他未知原因等等,我们这是可以通过微软提供的WebServer(Web服务事件查看器),来帮助我们查找原因. 打开方法 编辑 方法一:可以通过单击鼠标右键至"我的电脑"(windows7的"计算机"),在弹出的快捷菜单下选择"管理",会弹出计算机管理菜单,选择菜单下的"事件查看器"即可,单击会出现三个选项,其中的系统可

Win10电脑老是自动弹出“事件查看器”?教你一招关掉它!

有网友表示,电脑升级win10系统后,“事件查看器”老是自动弹出,关闭后过段时间又弹出,玩游戏时也会自己弹出,严重影响心情.今天我就教大家如何解决这个问题,快来看看吧! 1.首先,按WIN+R键打开运行窗口,输入services.msc 回车打开: 2.找到[Windows Event Log],双击它,将“启动类型”修改为[足球比分],然后点[停止],“确定”即可. 设置好后,“事件管理器”就不会再自动弹出啦~ 如果你也升级了win10系统,快去设置下吧!

事件查看器事件ID部分说明

事件查看器从简单的查看电脑登录信息到检查系统是否出现错误,是否被入侵都有着很重要的作用,Microsoft为了简便,采用事件ID来代表一些信息,下面是我从Microsoft找来的WIN2003的对应关系. 事件ID:517     审核日志已经清除事件ID:528     登陆成功                      可以显示客户端连接ip地址事件ID:683     会话从 winstation 中断连接     可以查看客户端计算机名事件ID:624     创建了用户帐户事件ID:6

删除事件查看器中多余的日志分类

用vs2008开发“Windows 服务”程序,安装后在“事件查看器”中生成一个新的事件日志分类 “MyNewLog”,卸载服务后,打开事件查看器,发现“MyNewLog”的事件日志分类没有删除. 具体删除过程如下: 1.在“开始”--“运行...”中输入“regedit”打开注册表编辑器: 2.定位到 HKEY_LOCAL_MACHINE/SYSTEM/ControlSet00X/Services/Eventlog(其中 ControlSet00X 中的最后一位是数字一般为1.2或3),Eve

无法访问远程计算机上的事件查看器?

如果您无法访问远程计算机上的事件查看器,则可能会收到以下错误消息: # 1 error Computer <computer_name> cannot be connected. Verify that the network path is correct, the computer is available on the network, and the appropriate Windows Firewall rules are enabled on the target compute

Win10图片打开方式没有“Windows照片查看器”,如何找回?

如果你是全新安装的Win10正式版,那么就会发现当在图片上点击右键时,“打开方式”菜单里熟悉的“Windows照片查看器”不见了,换成了Win10全新的“照片”应用.而如果你是从Win7/Win8.1升级到的Win10系统,“Windows照片查看器”则会被保留.下面就来分享一下如何找回Win10图片打开方式中的“Windows照片查看器”选项: 首先,打开注册表编辑器(1.Win10打开注册表编辑器的方法), Win10打开注册表编辑器的方法 方法一:运行“regedit”命令打开注册表编辑器

解决Win10图片打开方式没有“Windows照片查看器”问题

1.打开注册表编辑器(Win+R,Regedit),定位至(建议修改前备份注册表): HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Photo Viewer\Capabilities\FileAssociations 2.在右侧窗口中点击右键,选择"新建 – 字符串值",然后把新建的字符串值重命名为 .jpg ,数值数据设置为 PhotoViewer.FileAssoc.Tiff:然后按同样的方法新建名为 .jpeg  .png  .gif

Delphi7 调用 Windows 照片查看器打印对话框

Delphi7 调用 Windows 照片查看器打印对话框. uses ShellAPI; var strPictureFilePath: string; begin ShellExecute(Handle, 'print', PChar(strPictureFilePath), nil, nil, SW_SHOW); end;