zoukankan      html  css  js  c++  java
  • 《WinDbg 命令三部曲:(一)WinDbg 命令手册》

    from:https://www.cnblogs.com/gaochundong/p/windbg_cheat_sheet.html

    系列博文

    1. 《WinDbg 命令三部曲:(一)WinDbg 命令手册》
    2. 《WinDbg 命令三部曲:(二)WinDbg SOS 扩展命令手册》
    3. 《WinDbg 命令三部曲:(三)WinDbg SOSEX 扩展命令手册》

    导航目录

    调试准备

    为了测试 WinDbg 中使用 SOS 扩展命令,我创建了应用程序 "MemoryLeakApp.exe",Visual Studio 程序选择为 64 位环境编译。

     "MemoryLeakApp.exe" 启动运行后可能占用内存600M。

    此时,选择使用 64 位 WinDbg 来调试程序。我们先通过 Attach Process 方式来调试。

    当然,如果我们使用了 32 位的 WinDbg 去 Attach 进程,会直接报错。

    WinDbg 常用命令手册

    内置帮助命令
    命令 描述
    ?

    ?             显示常规命令

    ? /D            通过 DML(Debugging Markup Language) 方式显示常规命令

    .help

    .help        显示 . 系列命令

    .help /D       通过 DML 方式显示 . 系列命令

    .help /D a*   通过 DML 方式显示所有以 'a' 字母开头的 . 系列命令

    .chain

    .chain          列出所有已加载的调试器扩展

    .chain /D      通过 DML 方式列出所有已加载的调试器扩展

    .extmatch

    .extmatch /e ExtDLL FunctionFilter      显示调试器扩展的所有导出函数

    .extmatch /D /e ExtDLL FunctionFilter  通过 DML 方式显示调试器扩展所有导出函数

    .extmatch /D /e uext *                       显示 uext 扩展中的所有导出函数

    .hh

    .hh         打开 WinDbg 的帮助文件

    .hh Text  打开 WinDbg 的帮助文件,并自动搜索 Text 的内容

    .hh dt     在 WinDbg 帮助文件中搜索 dt 命令

    调试会话命令
    命令 描述
    .attach

    .attach PID 附加到指定ID的进程

    .detach

    .detach      结束调试会话,被调试进程仍可继续运行

    q

    q               结束调试会话,同时终止被调试进程的进行

    qq             结束调试会话,同时终止被调试进程的进行

    .restart

    .restart      重启被调试应用

    一般信息命令
    命令 描述
    version

    显示调试器版本信息和已加载的调试器扩展

    vercommand

    显示调试器启动文件的路径

    vertarget

    显示目标机器的版本

    CTRL+ALT+V

    打开或关闭 Verbose 模式开关,某些命令在此模式下可以给出更多详细信息

    .formats

    .formats Expression  显示数字的各种格式信息

    .formats 5

    .cls

    清理屏幕

    .last event 显示最新的异常信息或事件信息
    .effmach

    .effmach 显示有效作用的机器信息
    .effmach .
    .effmach #
    .effmach x86 | amd64 | ia64 | ebc

    .time

    显示系统记录的各种时间

    .echo

    .echo String  输出字符串

    .echo "String"

    .echo "Hello World"

    符号加载命令
    命令 描述
    ld

    ld ModuleName  加载指定模块的符号

    ld *                  加载所有模块的符号

    !sym

    !sym                获取符号加载状态

    !sym noisy       让调试器显示符号搜索详细信息

    !sym quiet        默认项,不显示符号搜索信息

    .sympath

    .sympath         显示和设置符号搜索路径

    .sympath+       增加符号搜索路径

    .sympath+ C:Symbols

    .symopt

    .symopt            显示当前符号可选项

    .symopt+ Flags  添加符号可选项

    .symopt- Flags   移除符号可选项

    .symfix

    .symfix                           设置符号库路径

    .sym+ DownstreamStore  添加符号库路径

    x

    x [Options] Module!Symbol    模式匹配符号信息

    x /t ..            根据数据类型匹配

    x /v ..            显示详细信息

    x /a ..            按照地址排序

    x /n ..            按照名称排序

    x /z ..            按照大小排序

    x *!               列出所有模块

    x ntdll!*          列出 ntdll 模块

    x /t /v ntdll!*    列出 ntdll 模块数据类型和符号类型

    .reload

    .reload                            重新加载符号信息

    .reload [/f | /v]                /f 强制立即加载符号 /v 显示详细信息

    .reload [/f | /v] Module     Module 为指定模块加载符号信息

    .reload /f @"ntdll.dll"

    .reload /f @"C:WINNTSystem32verifier.dll"

    模块加载命令
    命令 描述
     lm

    lm[ v | l | k | u | f ] [m Pattern] 显示已加载的模块

    lm   显示所有加载和未加载的模块信息

    lmv 显示已加载模块的详细信息

    lml  同时显示加载的符号信息

    lmk 显示内核模块信息

    lmu 显示用户模块信息

    lmf  显示镜像路径

    lmm 匹配模块名称

    lmD 使用 DML 方式显示

    lmv m kernel32 显示 kernel32 模块详细信息

    !dlls

    !dlls         列出所有加载的模块和加载数量

    !dlls -i      根据初始化顺序

    !dlls -l      根据加载顺序(默认项)

    !dlls -m    根据内存顺序

    !dlls -v     显示更多详细信息

    !dlls -c ModuleAddr  仅显示 ModuleAddr 地址的模块信息

    !dlls -?     显示帮助

    !dlls -v -c kernel32 显示 kernel32.dll 的信息

    !lmi

    !lmi Module    显示模块的详细信息,包括加载符号信息

    !lmi kernel32  显示 kernel32.dll 模块的信息

    异常分析命令
    命令 描述
    !analyze

    !analyze -v       显示当前异常的详细信息

    !analyze -hang  诊断线程调用栈上是否有任何线程阻塞了其他线程

    !analyze -f        查看异常分析信息,尽管调试器并未诊断出异常

    进程信息命令 线程信息命令~                              显示线程信息

    ~* [Command]           所有线程

    ~. [Command]            当前线程

    ~# [Command]           引发当前事件或异常的线程

    ~Number [Command]  显示指定序号的线程

    ~~[TID] [Command]   显示指定线程ID的线程

    ~Ns                          切换到线程 N

    ~* k  显示所有线程的调用栈

    ~2 f   冻结2号线程

    ~# f  冻结引发异常的线程

    ~3 u  解除对3号线程的冻结

    ~2 k  显示2号线程的调用栈

    ~e

    ~* e CommandString            在所有线程上执行命令

    ~. e CommandString             在当前线程上执行命令

    ~# e CommandString            在引发异常的线程上执行命令

    ~Number e CommandString   在指定序号的线程上执行命令

    ~2e r; k; kd  相当于 ~2r; ~2k; ~2kd

    ~*e !gle       显示所有线程的最后一个错误信息

    ~f

    ~Thread f    冻结线程

    ~u

    ~Thread u   解除冻结线程

    ~n

    ~Thread n   挂起线程,增加线程挂起数量

    ~m

    ~Thread m  恢复线程,减少线程挂起数量

    !teb

    显示线程环境信息

    !tls 

    !tls -1          -1 为显示当前线程所有的 slot 信息

    !tls SlotIdx   显示指定的 slot 信息

    !tls [-1 | SlotIdx] TebAddr

    .ttime

    显示线程时间信息

    !runaway

    [Flags: 0 | 1 | 2] 显示每个线程消耗的时间,用于快速的查找 CPU 时间消耗最多的线程

    0 用户态时间

    1 内核态时间

    2 自线程创建起的时间间隔

    !gle

    !gle         显示当前线程的最后错误

    !gle -all    显示所有线程的最后错误

    !error

    !error ErrValue      解析错误信息

    !error ErrValue 1   将错误值作为 NTSTATUS 代码

    堆栈信息命令
    命令 描述
    k

    k [n] [f] [L] [#Frames]  显示调用栈信息

    kn      调用栈包含帧号

    kf       临近帧的距离

    kL       忽略源代码

    kb ...  最开始的 3 参数

    kp ...  所有的参数,包括参数类型、名称和值

    kP ...  所有的参数

    kv ...  FPO信息

    kb 5   显示最开始的 5 个帧

    kd

    kd [WordCnt]  显示原始栈数据和可能的符号信息

    kM

    使用 DML 格式显示堆栈信息

    .kframes

    设置栈长度,默认是20(0x14)

    .frame

    .frame            显示当前帧

    .frame #         指定帧号

    .frame /r [#]   显示寄存器信息

    .frame 2         显示帧号 2 的信息

    .frame /r 0d    显示 0 帧中寄存器信息

    !uniqstack

    !uniqstack                   显示所有线程的栈信息

    !uniqstack [b|v|p] [n]   b=前3个参数;v=FPO信息;p=所有参数;n=帧号

    !uniqstack -?               显示帮助

    !findstack

    !findstack Symbol              找到包含符号或模块的栈

    !findstack Symbol [0|1|2]   0=仅显示线程ID;1=线程ID和帧;2=全部的线程栈;

    !findstack -?                      显示帮助

    !findstack clr 2                   显示包含 clr 的所有栈的信息

    扩展帮助命令

    !Uext.help

    用户态模式扩展命令帮助

    !Ntsdexts.help

    用户态扩展命令帮助(OS相关)

    !logexts.help

    日志相关扩展

    !clr10sos.help

    调试托管代码

    !wow64exts.help

    wow64调试器扩展

    !Wdfkd.help

    内核态驱动框架扩展

    !Gdikdx.help

    图形驱动扩展

    !NAME.help

    显示任何 NAME 名称的扩展命令的帮助
    日志扩展命令
    命令 描述

    !logexts.help

     显示所有日志扩展命令

    !loge

    !loge [dir]  打开日志功能,可选配置输出目录

    !logi

    初始化日志功能

    !logd

    关闭日志功能

    !logo

    !logo                    列出日志配置信息

    !logo [e|d] [d|t|v]  打开或关闭日志,d=调试器,t=文本文件,v=详细信息

    !logc

    !logc                        列出所有日志类型

    !logc p #                  列出 # 中的日志类型

    !logc [e|d] *              打开或关闭所有日志类型

    !logc [e|d] # [#] [#]  打开或关闭日志类型 #

    !logb

    !logb p  打印缓冲区信息至调试器

    !logb f   刷新缓冲区内容之日志文件

    !logm

    !logm                          显示模块的包含或屏蔽列表

    !logm [i|x] [DLL] [DLL]  指定模块的包含或屏蔽列表

    参考资料

    本文为 Dennis Gao 原创技术文章,发表于博客园博客,未经作者本人允许禁止任何形式的转载。

    系列博文

      1. 《WinDbg 命令三部曲:(一)WinDbg 命令手册》
      2. 《WinDbg 命令三部曲:(二)WinDbg SOS 扩展命令手册》
      3. 《WinDbg 命令三部曲:(三)WinDbg SOSEX 扩展命令手册》
  • 相关阅读:
    找工过程中碰到的笔试面试题整理(1)
    windows核心编程学习笔记(五.续)堆
    windows核心编程学习笔记(二)Wait For Kernel Object(s)
    windows核心编程学习笔记(四)windows内存结构/虚拟内存/线程的堆栈
    [转]筛选法求素数
    windows核心编程学习笔记(五)内存映射文件
    windows核心编程学习笔记(八)结构化异常处理(Structured Exception Handling)
    [转]亲密接触VC6.0编译器
    windows核心编程学习笔记(三)线程池(Thread Pooling)
    windows核心编程学习笔记(七)DLL Injection and API Hooking
  • 原文地址:https://www.cnblogs.com/lidabo/p/14363340.html
Copyright © 2011-2022 走看看