• 忘掉天地
  • 仿佛也想不起自己
bingliaolongBingliaolong  2025-12-05 13:50 Aet 隐藏边栏 |   抢沙发  1 
文章评分 1 次,平均分 5.0

通用

配置符号路径

  1. 目的
    1. WinDbg能够将内存地址翻译成可读的函数名,否则调用栈全是地址,无法分析
  2. 命令

识别 Dump 类型和架构

  1. 目的
    1. 确定是什么类型的dumpfull dump? mini dump?
    2. 32位还是64位程序
    3. 操作系统版本
    4. 是否是WOW6464位系统运行32位程序)
  2. 命令

  1. 如果看到WOW64

查看进程和模块信息

  1. 目的
    1. 进程名称、PID
    2. 加载了哪些DLL
    3. 哪些是系统DLL,哪些是第三方DLL
  2. 进程命令

  1. 模块命令

  1. 模块地址范围

  1. 时间戳的价值

  1. 查找特定模块

自动分析

  1. 目的
    1. WinDbg 自动分析 dump,给出初步诊断
  2. 命令

  1. !analyze -v 的输出

  1. 根据 !analyze 输出判断问题类型

查看所有线程

  1. 目的
    1. 了解程序有多少线程,每个线程在做什么
  2. 列出线程概览
    1. Suspend: 0 - 线程可以运行
    2. Suspend: 1 - 线程被挂起(可能正常,也可能异常)
    3. Unfrozen - 线程可调度
    4. Frozen - 线程被冻结(调试器命令导致)

  1. 查看所有线程的调用栈

  1. 快速扫描所有线程
    1. 看每个线程在做什么:
    2. NtWaitForSingleObject - 等待(正常)
    3. Sleep - 休眠(正常)
    4. 如果都在等待,可能死锁
    5. 如果某线程栈很深,可能递归太深
  2. 切换线程

查看寄存器和内存

  1. 目的
    1. 查看崩溃时的CPU状态和内存内容
  2. 查看寄存器

  1. 查看内存

其他

  1. symfix
    1. 自动连接到微软的公共符号服务器
    2. 可以下载 Windows 系统文件(kernel32.dll, ntdll.dll等)的符号
    3. 默认储存在 C:\Symbols</li> </ol> </li> <li>sympath+ 路径
      1. 添加你自己程序的符号文件路径
      2. + 号:表示追加,不覆盖已有路径

    1. reload
      1. 重新加载所有模块的符号

    1. 如何判断符号加载成功

    输出示例

    1. 常见异常代码

    崩溃(Crash)专项

    分析异常信息

    1. 目的
      1. 详细了解崩溃的原因和上下文
    2. 查看异常记录
      1. ExceptionAddress - 崩溃发生的精确地址
      2. ExceptionCode - 异常类型
      3. Parameter[0] - 操作类型(读/写)
      4. Parameter[1] - 访问的地址(0表示NULL

    1. 查看上下文
      1. 执行后,寄存器会切换到崩溃瞬间的状态,然后可以:
      2. 查看崩溃时的准确调用栈
      3. 查看崩溃时的寄存器

    分析崩溃点的代码

    1. 目的
      1. 理解崩溃指令在做什么
    2. 反汇编崩溃点

    1. 反汇编整个函数

    检查函数参数和局部变量

    1. 目的
      1. 查看崩溃函数的输入和内部状态
    2. 查看局部变量

    1. 查看函数参数

    1. 手动查看栈内容

    常见崩溃模式识别

    1. NULL指针访问

    1. 野指针(已释放的内存)

    1. 栈溢出

    1. 除零错误

    卡死(Hang)专项

    识别阻塞线程

    1. 目的
      1. 找出是哪个线程卡住了,或线程间是否死锁
    2. 运行hang分析

    1. 查看线程CPU使用
      1. 某线程时间特别长→ 可能死循环,切换到该线程查看
      2. 所有线程时间都很短→ 不是CPU问题,可能是在等待I/O或锁

    分析等待原因

    1. 目的
      1. 查看线程在等待什么资源
    2. 查看线程调用栈(重点)

    典型等待模式

    1. 模式1:等待同步对象

    1. 模式2:等待文件I/O
      1. 线程在读文件(可能网络文件导致慢)

    1. 模式3:等待网络

    1. 模式4:等待消息(UI线程)

    检查死锁

    1. 目的
      1. 查找线程间的循环依赖
    2. 查看所有锁

    1. 检查特定临界区

    分析线程池

    1. 目的
      1. 查看线程池状态,是否线程池耗尽
    2. 命令
      1. Idle Thread Count = 0→ 线程池饱和,所有线程在忙
      2. Current = Max→ 达到上限,无法创建新线程

    内存泄漏专项

    概述

    1. 需要两个dump对比,或使用内存分析扩展

    查看堆内存状态

    1. 目的
      1. 了解内存使用情况,识别泄漏
    2. 堆概览
      1. Committed:实际占用的物理内存
      2. Reserved:保留的虚拟地址空间
      3. 如果某个堆特别大,可能是泄漏源

    1. 查看堆详情

    检查句柄泄漏

    1. 目的
      1. 查看是否有句柄(文件、线程、Event等)没有关闭
    2. 统计句柄
      1. 正常程序:几十到几百个句柄
      2. 如果有几千个句柄,可能泄漏
      3. 重点关注EventMutexFile类型

    1. 按类型统计

    查找内存分配源头

    1. 目的
      1. 找到哪段代码分配了大量内存但没释放
    2. 需要 UMDHLeakDiag

    1. 专业的工具
      1. UMDH- 对比两个dump找泄漏
      2. Application Verifier- 运行时检测泄漏
      3. WinDbg PreviewTime Travel Debugging

    性能问题专项

    CPU热点分析

    1. 目的
      1. 找出哪个函数占用CPU最多
    2. 命令

    实战技巧

    保存分析日志

    对比两个Dump

声明:本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

bingliaolong
Bingliaolong 关注:0    粉丝:0
Everything will be better.

发表评论

表情 格式 链接 私密 签到
扫一扫二维码分享