本文讨论如何使用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捕获。

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

  1. Windows 事件查看器(收集)

    原文:Windows 事件查看器(收集) 事件查看器相当于一本厚厚的系统日志,可以查看关于硬件.软件和系统问题的信息,也可以监视 Windows 的安全事件 提示:除了可以在"控制面板→管理 ...

  2. windows事件查看器

    如果一个软件发生异常,软件本身没有提示异常信息, 需要从事件查看器中查看产生的错误事件 运行输入eventvwr或者win + X

  3. 转: Windows如何打开和使用事件查看器管理计算机

    方法/步骤   1 右键单击"我的电脑"(win8中名称为"这台电脑.This Computer"),选择"管理",点击. 步骤阅读 2 出 ...

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

    IIS服务器是我们常用的Web站点部署工具,而我们有时可能遇到IIS服务器的应用程序池莫名其妙的关闭了,或者是其他未知原因等等,我们这是可以通过微软提供的WebServer(Web服务事件查看器),来 ...

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

    事件查看器从简单的查看电脑登录信息到检查系统是否出现错误,是否被入侵都有着很重要的作用,Microsoft为了简便,采用事件ID来代表一些信息,下面是我从Microsoft找来的WIN2003的对应关 ...

  6. Server 2008 R2 事件查看器实现日志分析

    在 windows server 2008 R2 中,可以通过点击 "开始" -> "管理工具" -> "事件查看器" ,来打开 ...

  7. 应用程序池自动停止,事件查看器报错6D000780

    20210913 今天中午网站突然报错,后台程序无法访问,503错误. 调查发现"应用程序池"被关闭,但是手动开启后不久,又被关闭. 本地调试没问题,所以一开始怀疑是服务器或者Ng ...

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

    1.打开注册表编辑器(Win+R,Regedit),定位至(建议修改前备份注册表): HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Photo Viewe ...

  9. 如何在Win10下设置图片的浏览方式为windows照片查看器

    小编前些天刚装好了win10,一阵心奋啊,今天刚打开一个图片,却发现图片的默认打开方式是window应用商店的app, 这让我觉得特别不舒服,没有之前windows自带的照片查看器好用,后来我本想进入 ...

随机推荐

  1. Nginx Tutorial #1: Basic Concepts(转)

    add by zhj: 文章写的很好,适合初学者 原文:https://www.netguru.com/codestories/nginx-tutorial-basics-concepts Intro ...

  2. java ASM

    一.什么是ASM ASM是一个java字节码操纵框架,它能被用来动态生成类或者增强既有类的功能.ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为.J ...

  3. python turtle画花

    turtle是一个功能强调大的绘图的库,可以用来绘制各种所需要的图案,但是在使用时需要计算好角度等一系列的问题. 代码(源自<Python语言程序设计>)如下: 运行结果:

  4. ML学习笔记之LATEX数学公式基本语法

    作者:@houkai本文为作者原创,转载请注明出处:https://www.cnblogs.com/houkai/p/3399646.html 0x00 概述 TEX 是Donald E. Knuth ...

  5. SQL server数据库创建代码,filegroup文件组修改,

    以下示例在 SQL Server 实例上创建了一个数据库.该数据库包括一个主数据文件.一个用户定义文件组和一个日志文件.主数据文件在主文件组中,而用户定义文件组包含两个次要数据文件.ALTER DAT ...

  6. mysql数据库事务

    事务: 一个或者一组sql语句组成一个执行的单元,这个单元要么全都执行,要么都不执行.也就是每个sql语句相互依赖.如果中间有一条出现错误则整个单元将回滚.(回滚就是刚刚的操作都撤销) 事务的属性:  ...

  7. Java NIO , AIO

    New IO: 特点:不再阻塞 Channel , Buffer Async IO: 特点:异步

  8. 配置kubectl在Mac(本地)远程连接Kubernetes集群

    集群部署在云服务器的ECS上,但是有时需要本地原创连接集群,这就需要通过ApiServer的外网地址去访问集群,但是-/.kube/config下的地址又都是内网,所以可以使用如下方式解决: Mac安 ...

  9. kaishi

    https://zjc.wtc.edu.cn/zs/2019/0623/c2937a54869/page.htm https://zjc.wtc.edu.cn/zs/2019/0614/c593a54 ...

  10. 简要介绍Linux网络服务的种类

    如果有人问你Linux最强大的功能是什么,你大概会回答“是网络功能”.Lmux操作系统的优势之一就是网络功能了,这包含比较稳定的系统资源分配,以及较为安全的网络防护能力,所以许多人都喜欢用它来进行网络 ...