调试dmp文件的方法整理

调试dmp文件

添加目录

  • Symbol File Path: .pdb文件
  • Source File Path: 源代码
  • Image File Path: .dll文件

基本流程

加载步骤

  • STEP 1:打开Windbg,在file中选择open crash Dump来打开所需要调试的Dump文件。
  • STEP 2:在file菜单中分别设置好Symbol file path 和 Source file path。
    • 其中Symbol file path是程序编译时所生成的pdb文件
  • STEP 3:设置完这些之后,就可以在command窗口中使用Windbg的命令行来进行各种调试分析了。
    • 如果有pdb文件的话,尽可能的保证pdb文件和产生Dump文件的程序版本是匹配的。
    • 尽可能地保证所用来分析的源代码和程序版本是匹配的。
    • 如果上述有不匹配的情况,很有可能导致分析时所得到的结果不是正确的,或者是在通过地址偏移定位出现异常代码的行数时导致定位不准确。

如何用Windbg进行分析

基本分析步骤

  • !analyze -v命令使用

如果想要严谨的分析crash根因,我们需要借助dump文件(转储文件)得到下列信息:

重要指令

  • .exr (Display Exception Record)

  • .cxr (Display Context Record)

  • 异常发生的地方 (地址、源码文件和代码行)

  • 异常发生时的调用堆栈,通过.cxr命令

  • 调用堆栈上函数参数和本地变量的值,通过k命令以及d命令

  • 想要得到这三个信息,最重要的一步就是得到函数执行异常时的上下文环境,通过 .cxr 命令可实现。

步骤一: 获取异常原因

步骤二: 切换上下文

STACK_COMMAND和CONTEXT字段,都给出了分析堆栈重要前提

.cxr 0x2afb08 用来显示上下文记录,0x2afb08 是上下文记录地址,这个命令很重要,只有切换到出问题时的上下文记录,才能分析堆栈信息。

windbg入门教程之crash分析步骤_Keep Moving~-CSDN博客_windbg分析崩溃

步骤三: 显示调用栈信息

与此同时,我们可输入kb命令,显示函数调用栈过程
为了清楚看到函数入参,我们建议使用kP命令
还有其他的本地变量或者全局变量需要分析,我们可使用d命令,比如dt命令或者dv

附加到进程

  1. 设置好,exe极其pdb, 放置在同一个目录, 或者windbg可以找到的.
  2. 打开windbg, F5运行.
  3. 当遇到断点或进程异常时, 控制权回到windbg, 这时,
    1. 点击工具栏的callstack 命令,
    2. 打开堆栈窗口, 可以看到函数调用堆栈,
    3. 点击这个新CallStack窗口里的Source命令, 可以显示出堆栈里的函数对应的源文件所在的位置及行号.(如果你的源文件恰好放在这里的话, 就直接转到你的源文件里了.)
    4. 打开callstack窗口还提供了很多别的信息可以查看, 比如FuncInfo 可以看到该函数的调用约定 stdcall, Frame nums可以看到帧编号. SourceArgs, 可以看到原始的参数.

指令 ^694326

  • !analyze -v :自动分析并生成异常报告
  • .cls 清除windbg调试窗口内容
  • .frame 设置进入某个函数栈,可用于显示当前栈中的局部变量
  • ~ 显示或者切换线程信息(~* 1),可以配合其他命令执行(*kn)
  • ~*kbn :查看所有的线程
  • kbn  列出当前的调用堆栈
  • k 显示当前线程的堆栈, 例如kb kpkn,这些后缀控制了显示的格式和信息
  • d 用于显示内存信息,比如da,dd等等
  • dd: d*命令显示给定范围内的内存内容。dd,双字值 (4 个字节为单位)。默认计数是 32 dword 值 (128 个字节)
  • dt: 用于显示类型,包括局部变量、全局变量、联合体和结构体
  • .exr命令显示异常记录的内容。
  • .cxr 显示上下文记录信息
  • !locks 显示死锁

windbg入门教程中常见命令总结_Keep Moving~-CSDN博客

windbg使用超详细教程(我是新手,大佬轻虐) - 知乎 (zhihu.com)

posted @ 2022-05-10 20:35  nino4love  阅读(689)  评论(0编辑  收藏  举报