Crash dump中需要重点关注的信息

Crash都是发生在某一函数中, 而95%的crash都是由下面两种情况中的一种导致的:

  • 发生crash的函数获得了错误的参数.
  • 发生crash的函数使用了损坏了的内部数据.

代码的执行过程是对数据进行变化的过程. 对同一段代码, 在相同环境下, 如果使用的数据都相同, 那么执行的结果肯定是唯一的. 如果函数发生崩溃, 那么肯定是使用到的数据跟理想情况有差别. 函数使用的数据来源: 一是函数传入的参数, 二是函数体引用到的成员变量或全局变量.

 

因此要分析crash dump, 大多数情况都是寻找错误数据的来源. 下面是一些常见的, 导致数据错误的例子:

  1. 使用了未初始化的变量. 比如没有分配内存的指针, 没有初始化的CriticalSection.
  2. 错误地计算了函数参数. 比如调用函数的时候弄错了传入参数的顺序, 字符串操作时算错了字符串长度.
  3. 错误地使用数据导致发生corruption. 比如double free导致heap curruption, 在多线程环境下忘记同步导致据全局变量计算错误, COM的AddRef和Release调用不配对.
  4. 违背程序逻辑地使用数据. 比如在程序加载必要的资源以前就开始使用这些资源的函数.

由此可见, crash dump的分析完全取决于程序的情况. 能否从crash dump中挖掘出有用的信息, 取决于:

  • 对目标程序的熟悉程度. 包括程序的架构, 重要函数的作用, 重要的数据结构, 函数之间的调用逻辑, 关键函数的实现细节.
  • 对基础知识的掌握程度, 包括汇编, 异常, 内存, API, 消息, CRT, 等等.

一般来说, 分析一个dump可以通过下面的步骤入手:

  1. 看清楚是何种异常导致的崩溃.
  2. 对齐symbol, 找到发生崩溃的函数名字, 以及对应的汇编代码和源代码.
  3. 列出callstack
  4. 检查callstack是否合理
  5. 检查发生崩溃的函数是否得到了正确的参数.
  6. 检查发生崩溃的函数使用的数据是否正确.
  7. 结合上面的信息, 构思来龙去脉, 然后用资料来证明, 或者反驳自己的猜想.
  8. 通过进一步的操作来获取更有意义的资料. 比如激活pageheap后, 重新抓取dump, 或者干脆进行Live debug

关于CRT的文章: http://www.codeproject.com/KB/cpp/Short_Story_VCPP_CRT.aspx?msg=2319521

 

摘自:<Windows用户态程序高效排错>

posted on   中道学友  阅读(963)  评论(0编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律

导航

< 2009年12月 >
29 30 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 1 2
3 4 5 6 7 8 9

技术追求准确,态度积极向上

点击右上角即可分享
微信分享提示