windbg学习记录(一)
来源:互联网 发布:去北京linux培训 编辑:程序博客网 时间:2024/05/18 17:57
1、安装
如果你安装了WDK或vs的相关版本,你都可以从安装目录中找到它们(一般在Debuggers目录中)。如果没有,你可以从下面的链接去下载安装:
Install Debugging Tools for Windows 32-bit Version
http://www.microsoft.com/whdc/devtools/debugging/installx86.mspx
Install Debugging Tools for Windows 64-bit Versions
http://www.microsoft.com/whdc/devtools/debugging/install64bit.mspx
2、简单配置
符号文件搜索路径配置(Symbol File Path)
D:\user_symbol_path;SRV*D:\symbolslocal*http://msdl.microsoft.com/download/symbols
意思是先从D:\user_symbol_path中找符号文件,如果没找到,就去服务器中下载并保存到D:\symbolslocal目录中。可以用.reload重新加载符号文件Image File Path配置
此项是在加载dump时,设置可执行文件exe,dll的路径的Source File Path配置
设置源代码目录。如果当前指令指针在源代码范围内,就会自动跳出源文件窗口。源文件窗口中的操作和vs类似。如果没有跳出,可以单机菜单项Open Source File手动选择源文件
3、开始调试
我们可以通过菜单项Open Executable来加载本地的一个exe来进行调试,也可以通过菜单项Attache to a Process来加载一个已经运行的exe来进行调试。
具体调试指令可以参考: Help->Contents->Debugging Tools for Windows->Debuggers->Debugger Reference
3、关于工作空间
windbg会保存每个你调试的工程的信息,这些信息包括调试项目的属性、参数、会话状态、调试器设置、及图形界面信息,类似于ide的项目文件。
每个调试的工作空间信息默认保存在 HKEY_CURRENT_USER\Software\Microsoft\Windbg\Workspaces
中,在这个键下一般有4个子键User
、Kernel
、Dump
、Explicit
、他们分别保存用户态调试,内核态调试、转储文件调试、以及手动保存(Save Workspace As)的工作空间信息。
4、窗口界面介绍
5、常用命令
windbg命令分为标准命令,元命令和扩展命令。
以.开头的元命令提供标准命令没有提供的功能,也内建在调试引擎中。
以!开头的扩展命令用于扩展某一方面的调试功能,实现在动态加载的扩展模块中。
.reload
重新加载符号文件 .restart
重新启动调试目标 bp $exentry
在程序入口点设置断点,$exentry
是一个伪寄存器 bp 0x00401030
在地址0x00401030处设置断点 bp MyTestModule!MyTestFunc
在MyTestModule模块中的MyTestFunc函数处设置断点,前提是该模块符号已经加载 bp MyTestModule!MyTestClass::SetValue
在模块MyTestModule的MyTestClass类成员函数SetValue处设置断点 bp @@C++(MyTestModule!MyTestClass::SetValue)
与上面一样,语法不同,C++语法,上面的为MASM语法 bl
查看设置的断点 be
激活断点 bd
禁用断点 bc
删除某个断点 s –a 00400000 L53000 “Wrong”
以ASCII码的形式从00400000处开始往后53000个字节搜索字符串“Wrong” ba
设置访问断点 ba r 1 0044108c
在内存0044108c的位置开始的下一个字节的读断点 ba w4@@C++(&i)
给变量i地址下4个字节的写断点 g
运行程序,相当于F5 gu
返回函数调用处,相当于shift+F11 a
修改当前指令,输入修改的指令按Enter结束 u
查看当前正要执行的代码 k
查看当前调用堆栈 ~
查看调试进程中的线程信息 db 400000
以二进制的方式显示内存地位为400000开始的内容 dd 400000
以DWORD类型查看 d
按上一次的d命令的方式来显示,如果不带参数,则从上一次显示结束的地方继续显示 ?i
查看局部变量i的值,会以10进制和16进制同时显示 eb 0012ff78 'a' 'b'
从内存地址0012ff78开始依次写入后面的值 r
用于查看或者修改寄存器或伪寄存器 r $peb
$peb是一个伪寄存器,调试器将它定义为当前进程的进程环境块地址 dt
用于查看结构体内容 !address 400000
查看指定内存地址的信息 dv
查看当前作用域下局部变量的类型和值
!analyze -v
详细显示当前异常信息
6、常用调试方法
6.1、附加进程调试
- 使用
File
菜单中的Attach to a Process
选项来选择要附加调试的进程
6.2、启动调试新进程
- 法一:使用
File
菜单中的Open Executable
选项来选择要启动调试的进程 - 法二:启动windbg时将待调试的程序的文件路径作为参数传递给windbg
- 法三:在注册表
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options
下新建一个以程序名命名的子项,然后在这个子项中新建一个名为Debugger
的REG_SZ
类型的值,将值设置为windbg的全路径,比如C:\Program Files (x86)\Windows Kits\8.1\Debuggers\x86\windbg.exe
。这样,再运行待调试的程序时,操作系统就会先启动windbg,并把要调试程序的路径传递给他。
6.3、调试转储文件
- 使用
File
菜单中的Open Crash Dump
选项来加载dump文件
6.4、远程调试
注意:服务器(被调试程序的机器)和客户端(发出远程请求的机器)都应该安装版本相同的windbg,应该有网络连接或者串行口连接。
以tcp端口方式:
- 以命令行的方式启动服务器中的windbg,如:
windbg.exe -server tcp:port=5005
- 以命令行的方式启动客户端中的windbg,如:
windbg.exe -remote tcp:port=5005,server=192.168.1.180
,
以管道方式:
- 以命令行的方式启动服务器中的windbg,如:
windbg -server npipe:pipe=advdbg
,adbdbg
为命名管道名称。 - 在客户端中以命令行的方式启动windbg,如:
windbg -remote npipe:server=REMOTEHOSTNAME,pipe=advdbg
,REMOTEHOSTNAME
为远程主机名,dbvdbg
为远程主机创建的命名管道名。(也可以选择File
菜单中的Connect to Remote Session
,在弹出来的编辑框中输入远程参数npipe:server=REMOTEHOSTNAME,pipe=advdbg
) - 成功连接后,命令行信息区会显示类似如下信息:
...(npipe advdbg) connected at Thu Jul 05 18:24:01 2017
,
之后可以在客户端或者服务器的windbg中执行各种调试命令,执行结果会同时显示在两个调试器中
还有其它的方式以及远程调试方案,具体可以参考 https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/remode-debugging-using-windbg
7、参考文章
http://www.cnblogs.com/kekec/archive/2012/12/02/2798020.html
- windbg学习记录(一)
- Windbg 的学习记录(一)
- Windbg的学习记录(一)
- WinDbg学习笔记一
- WinDbg学习笔记(一)--认识WinDbg
- WinDbg学习笔记(一)--认识WinDbg
- WinDbg学习笔记(一)--认识WinDbg
- WinDbg学习笔记(一)--认识WinDbg
- WinDbg学习笔记(一)--认识WinDbg
- WinDbg学习笔记(一)
- WinDbg学习(一)入门
- WINDBG学习
- windbg 学习
- WinDbg学习
- windbg操作命令记录
- Windbg 问题集锦记录
- windbg调试记录
- mysql学习记录 一
- Eclipse中.setting目录下文件介绍
- 请假时间计算(基本的)
- iscroll 5.1.2版本的API详解
- Hibernate SQLQuery执行实体查询带来的多个无关联查询语句
- iOS开发之ReactiveCocoa框架(RAC)第三篇实例颜色选择器
- windbg学习记录(一)
- json字符串转换
- Python在控制台输出进度条
- eclipse常用快捷键
- JS正则验证公式
- POJ 3281 Dinging(网络流最大流)解析
- linux 应用编程——多进程
- ios 分离出字符串中的数字
- (转载)JAVA设计模式之单例模式