当前位置:Gxlcms > 数据库问题 > windbg符号加载和调试

windbg符号加载和调试

时间:2021-07-01 10:21:17 帮助过:26人阅读

pc机上每个东西都有驱动,键盘、鼠标、显示器、cpu等等。

没有驱动,这些东西都不能运作,就是一堆废品。


谈一谈windows驱动调试。

使用windbg调试。

一般安装ddk后,就安装了windbg,在目录

C:\Program Files (x86)\Windows Kits\8.1\Debuggers\x64里就有了windbg调试工具。


windbg命令分为标准命令元命令扩展命令

准命令提供最基本的调试功能,不区分大小写。如:bp  g  dt  dv  k等

元命令提供标准命令没有提供的功能,也内建在调试引擎中,以.开头。如.sympath  .reload等;

扩展命令用于扩展某一方面的调试功能,实现在动态加载的扩展模块中,以!开头。如!analyze等;

进入调试状态时,直接回车可重复执行上一条命令;按上下方向键可以浏览和选择以前输入过的命令;

 神奇的Tab键,进行命令补全;ESC清除当前命令输入框中的文本;

 使用;作为分隔符,可以在同一行输入多条命令;

当命令提示符显示*BUSY*时,即使命令输入框可以输入命令,但输入的命令不会立即被执行,要等windbg空闲时才能执行;

     可使用Ctrl + Break来终止一个长时间未完成的命令;

一次可以执行多条命令,命令间用分号;分隔 【:bp main;bp `test.cpp:120`】,一次打2个断点;

 为了保证windbg流畅运行,在调试时,尽量不要开启Watch、Locals、Registers、Call Stack、Processes and Threads窗口,直接用command来获取信息;

帮助:

?   // 打印出所有标准命令

.help  // 打印出所有元命令

.hh  // 打开windbg的chm帮助文件

.hh bp  // 打开windbg的chm帮助文件bp命令介绍页

command /?  // 打印命令command具体参数用法


*  // 注释整行

$$ // 注释(遇到分号结束)


.sympath   // 查看当前符号查找路径

.sympath c:\symbols   // 将符号查找路径设为:c:\symbols

.sympath+ c:\symbols  // 将c:\symbols添加到符号查找路径集合中

.symfix // 将符号查找路径设为:SRV*WinDbg安装目录\Sym*http://msdl.microsoft.com/download/symbols

.symfix f:\symbols // 将符号查找路径设为:SRV*f:\symbols*http://msdl.microsoft.com/download/symbols

.symfix+ f:\symbols  // 将SRV*f:\symbols*http://msdl.microsoft.com/download/symbols添加到符号查找路径集合中

.srcpath // 查看当前源文件查找路径

.srcpath f:\src // 将源文件查找路径设为:f:\src

.srcpath+ f:\src  // 将f:\src添加到源文件查找路径集合中

.exepath // 查看可执行文件查找路径

.exepath f:\bin // 将可执行文件查找路径设为:f:\bin

.exepath+ f:\bin  // 将f:\bin添加到可执行文件查找路径集合中

.effmach  // 查看当前调试mode:x86、x64等

.load wow64exts  // [!load wow64exts] 加载wow64exts.dll模块  注:!sw就是wow64exts中的命令

.unload wow64exts  // [!unload wow64exts] 卸载wow64exts.dll模块

!sw  // [!wow64exts.sw]  在多个mode:x86、x64上进行循环切换  注:如果win32程序在x64的mode下,会看到地址是64位的

!k  // [!wow64exts.k]  打印32位、64位堆栈

!k 5 // [!wow64exts.k 5]  打印32位、64位堆栈,栈帧个数为5

!info // [!wow64exts.info]  输出wow64相关的PEB、TEB和TLS基本信息

!r // [!wow64exts.r]  输出处理器当前上下文信息

!r dumpTest!main  // [!wow64exts.r dumpTest!main]  输出main函数地址的上下文信息

符号加载与查看

除了使用ld和.reload命令直接加载符号文件,某些使用符号的命令也可以触发调试器来加载符号,如:栈回溯命令(k*)和反汇编命令(u)等。

值得说明的是,windbg缺省使用的是懒惰式符号加载策略,当它收到模块加载事件时,它通常是不会加载符号的,符号状态显示为deferred(延迟加载)。

.symopt // 显示当前所有符号选项

.symopt+ flags // 添加符号选项

.symopt- flags // 删除符号选项

!sym noisy   // 激活详细符号加载(noisy symbol loading)显示

!sym quiet   // 禁止详细符号加载显示

ld * // 为所有模块加载符号

ld kernel32 // 加载kernel32.dll的符号

.reload // 为所有已加载模块载入符号信息

.reload /i // 重新加载不匹配符号的模块【dmp文件没有对应的pdb时使用

.reload /i TGame.exe // 重新加载不匹配符号的TGame.exe

.reload /f /v // f:强制立即模式(不允许延迟载入)  v:详细模式

.reload /f @"c:\windows\System32\verifier.dll" // 为指定模块加载符号信息

.reload /f TGame.exe // 为TGame.exe加载符号信息

.chain  // 显示已经加载进来的模块

x *! // 列出所有模块对应的符号信息

lm // 列出所有模块(加载和未加载)对应的符号信息

lmv // 列出所有模块(加载和未加载)对应的符号信息

lmvm ntdll  // 查看ntdll.dll的详细信息(注意exe、dll等都不要带后缀名)

x ConsoleTest!* // 列出ConsoleTest模块中的所有符号

x ConsoleTest!add* // 列出ConsoleTest模块中的所有add开头的符号

x /t /v ConsoleTest!* // 带数据类型、符号类型和大小信息,列出ConsoleTest模块中的所有符号

x kernel32!*LoadLib* // 列出kernel32模块中所有含LoadLib字样的符号

#进程

|   // 列出调试进程

|*  // 列出调试进程

|N  // 参看序数为N的调试进程

|Ns // 切换序数为N的进程为当前调试进程

#线程

~   // 列出线程

~*  // 所有线程

~* k // 所有线程堆栈信息

~* r // 所有线程寄存器信息

~.  // 查看当前线程

~0s // 查看主线程

~# // 查看导致当前事件或异常的线程

~N  // 查看序数为N的线程

~~[n]  // 查看线程ID为n的线程

~Ns   // 切换序数为N的线程为当前调试线程

~N f  // 冻结序数为N的线程

~N u // 解冻序数为N的线程

~N n  // Suspend序数为N的线程

~N m // Resume序数为N的线程

!runaway // 显示所有线程的CPU消耗

#断点

bl   // 列出所有断点

bc * // 清除所有断点

bc 1 // 清除1号断点

bc 1 2 5  // 清除1号、2号、5号断点

be *  // 启用所有断点

be 1  

人气教程排行