搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
小丑西瓜9
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
港中文联合MIT提出超长上下文LongLoRA大模型微调算法
2
周志华《机器学习》西瓜书新出算法推导视频!(超级详细)
3
论文笔记(SRAGAN)
4
树莓派xrdp远程桌面连接出现Problem Connecting错误_vnc error problem connecting
5
免费的主机,用来建站不香么?_freehost
6
【EI会议征稿】第三届光电信息与功能材料国际学术会议(OIFM 2024)_ei会议+光电+2024
7
51单片机学习(4)-----独立按键进一步控制LED灯
8
2023年MathorCup大数据竞赛:基于计算机视觉的坑洼道路检测和识别 思路论文_道路坑洼检测的优秀竞赛轮文论
9
华为---RSTP(三)---P/A机制及RSTP的生成树形成过程
10
Mybatis源码学习——SqlSession、事务、Executor及SqlSession线程安全_sqlsession开启事务
当前位置:
article
> 正文
调试winddows程序_windbg.msi
作者:小丑西瓜9 | 2024-02-29 20:53:42
赞
踩
windbg.msi
调试winddows程序(
windbg
和 Debug Diagnostic Tool)
2012-08-25 23:34:05
一、功能:
调试不在编译器中运行的程序。可以解决一下两种问题。
1、 程序崩溃,能找到程序报错是运行的代码行。
2、 程序涨内存,直接定位到导致内存泄漏的语句。(这个在Debug Diagnostic Tool中使用很简单)
二、用法:
我知道两个工具,Windbg和Debug Diagnostic Tool,前者比较牛叉,能调试系统驱动级的程序,普通程序当然也能调试,后者方便易用,功能也很厉害。
1、如果要调试运行在没有开发环境的机器上的程序,可以此机器上开一个远程调试工具(Windbg或者Remote Debug),然后在自己工作机上运行调试工具(windbg或者vs2008),设置好Symbol(符号 *.pdb文件)和Source(源码)文件路径,然后Attach to Process到需要调试的进程,就能像在平时用vs2008 上调试一样方便了。
2、如果要调试崩溃的程序,可以抓一个dump(*.dmp文件,也叫内存转储文件),然后用Windbg或者DebugDiagnosticTool工具进行分析,也能找到出错的代码行,进而分析出结果。
总之,调试前一定要设置Symbol文件路径,没有Symbol,你看到的调用堆栈基本上毫无意义。
三、详细用法:
(32位机器安装x86版本 64位机器安装x64版本, 以下链接为32位版本)
下载安装windbg
http://msdl.microsoft.com/download/symbols/debuggers/dbg_x86_6.11.1.404.msi
下载安装Debug Diagnostic Tool
http://download.microsoft.com/download/B/8/0/B80535DB-DF4D-4020-B41F-ECE9005D9A65/DebugDiagx86.msi
Windbg中:
1、 设置Symbol和Source。
File->Symbol File Path File->Source File Path
Symbol中添加“srv*c:\symbols*
http://msdl.microsoft.com/download/symbols
”,可以自动从Microsoft中下载windows系统的pdb,自动按需下载。如果添加多个目录,可以用 ; 分隔。
2、 直接调试可执行程序(*.exe)。
File->Executable ,然后找到exe程序,打开即可。
Debug->Stop Debug可以停止调试。
3、 调试正在运行中的可执行程序。
先运行程序,然后打开Windbg,File->Attach to a process。
4、 调试运行时崩溃的程序。
只要崩溃的程序没有关闭,
打开Windbg,File->Attach to a process,选中崩溃的程序。
在command中输入[.dump /ma 要保存的文件完整路径名称],提示Dump successfully written后,就会生成一个dump文件。
打开Windbg.设置好Symbol文件路径,File->Symbol File Path。
打开dump文件,File->Open Crash dump。
开始分析。。。
kb 显示当前线程调用堆栈。
~*kb 显示所有线程调用堆栈。
lm 显示当前加载的模块信息 (*.pdb *.dll)
!analyze –v 详细列出dump文件的信息
多数境况下列出堆栈信息,基本就能确定是程序哪行出现问题了。
5、调试涨内存的程序
这个时候用Debug Diagnostic Tool
设置symbol文件路径
6、 远程调试(没有实践过)
1)使用windbg:
你可以从机器A上调试在机器B上执行的程序。具体步骤如下:
在机器B上启动一个调试窗口(Debug Session)。你可以直接在Windbg下运行一个程序或者将Windbg附加(Attach)到一个进程。
在机器B的Windbg命令窗口上启动一个远程调试接口(remote):
.server npipe:pipe=PIPE_NAME
PIPE_NAME是该接口的名字。
在机器A上运行:
windbg –remote npipe:server=SERVER_NAME,pipe=PIPE_NAME
SERVER_NAME是机器B的名字。
2)使用vs2008:
在机器B上启动msvsmon.exe(远程调试器,在Viual studio Tool中可以找到,要拷贝所有文件到机器B(C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\Remote Debugger\x86))
点击 工具->选项 ,选择“windows身份验证”
点击 工具->权限 ,勾选“允许”
然后在机器A上打开vs2008,点击 工具->附加到进行,弹出下面窗口,输入机器B的IP,连接正常后,就能在下面看见机器B上的进程了。
四、windbg常用命令:
.dump /ma File Name 创建一个Dump文件
显示调用堆栈:在连接到一个调试窗口后,首先要知道的就是程序当前的执行情况
kb 命令显示当前线程的堆栈。
~*kb会显示所有线程的调用堆栈。如果堆栈太长,Windbg只会显示堆栈的一部分。.kframes可以用来设置缺省显示框架数。
显示局部变量:
dv显示局部变量的信息。
CTRL+ALT+V可以切换到更详细的显示模式。
关于dv要注意的是在优化过的代码中dv的输出极有可能是不准确的。这时后你能做的就是阅读汇编代码来发现你感兴趣的值是否存储在寄存器中或堆栈上。有时后当前的框架(Frame)上可能找不到你想知道的数据。如果该数据是作为参数传到当前的方法中的,可以读一读上一个或几个框架的汇编代码,有可能该数据还在堆栈的某个地址上。静态变量是储存在固定地址中的,所以找出静态变量的值较为容易。.Frame(或者在调用堆栈窗口中双击)可以用来切换当前的框架。注意dv命令显示的是当前框架的内容。你也可在watch窗口中观察局部变量的值。
显示类和链表:
dt可以显示数据结构。比如dt PEB 会显示操作系统进程结构。在后面跟上一个进程结构的地址会显示该结构的详细信息:dt PEB 7ffdf000。
Dl命令可以显示一些特定的链表结构。
显示当前线程的错误值:
!gle会显示当前线程的上一个错误值和状态值。
!error命令可以解码HRESULT。
搜索或修改内存:
s 命令来搜索字节,字或双字,QWORD或字符串。
e命令来修改内存。
计算表达式:
?命令可以用来进行计算。
关于表达式的格式请参照帮助文档。使用n命令来切换输入数字的进制。
显示当前线程,进程和模块信息:
!teb显示当前线程的环境信息。最常见的用途是查看当前线程堆栈的起始地址,然后在堆栈中搜索值。
!peb显示当前进程的环境信息,比如执行文件的路径等等。lm显示进程中加载的模块信息。
显示寄存器的值:
r命令可以显示和修改寄存器的值。如果要在表达式中使用寄存器的值,在寄存器名前加@符号(比如@eax)。
显示最相近的符号:
ln Address。如果你有一个C++对象的指针,可以用来ln来查看该对象类型。
查找符号:
x命令可以用来查找全局变量的地址或过程的地址。x命令支持匹配符号。
x kernel32!*显示Kernel32.dll中的所有可见变量,数据结构和过程。
查看lock:
!locks显示各线程的锁资源使用情况。对调试死锁很有用。
查看handle:
!handle显示句柄信息。如果一段代码导致句柄泄漏,你只需要在代码执行前后使用!handle命令并比较两次输出的区别。
!htrace对调试与句柄有关的Bug非常有用。在开始调试前输入:
!htrace –enable
然后在调试过程中使用!htrace handle_value 来显示所有与该句柄有关的调用堆栈。
显示汇编代码:
u。
程序执行控制命令:
设置代码断点:bp/bu/bm 可以用来设置代码断点。你可以指定断点被跳过的次数。假设一段代码KERNEL32!SetLastError在运行很多次后会出错,你可以设置如下断点:
bp KERNEL32!SetLastError 0x100.
在出错后使用bl 来显示断点信息(注意粗体显示的值):
0 e 77e7a3b0 004f (0100) 0:*** KERNEL32!SetLastError
重新启动调试(.restart命令)并设置如下的断点:
bp Kernel32!SetLastError 0x100-0x4f
Debugger会停在出错前最后一次调用该过程的地方。
你可以指定断点被激活时Debugger应当执行的命令串。在该命令串中使用J命令可以用来设置条件断点:
bp `mysource.cpp:143` "j (poi(MyVar)”0n20) ''; 'g' "
上面的断点只在MyVar的值大于32时被激活(g命令
条件断点的用途极为广泛。你可以指定一个断点只在特殊的情况下被激活,比如传入的参数满足一定的条件,调用者是某个特殊的过程,某个全局变量被设为特殊的值等等。
设置内存断点:ba可以用来设置内存断点。调试过程中一个常见的问题是跟踪某些数据的变化。如下的断点:
ba w4 0x40000000 "kb; g"
可以打印出所有修改0x40000000的调用堆栈。
控制程序执行:p, pa,t, ta等命令可以用来控制程序的执行。
控制异常和事件处理:Debugger的缺省设置是跳过首次异常(first chance expcetion),在二次异常(second chance exception)时中断程序的执行。sx命令显示Debugger的设置。sxe和sxd可以改变Debugger的设置。
sxe clr
可以控制Debugger在托管异常发生时中断程序的执行。常用的Debugger事件有:
av 访问异常
eh C++异常
clr 托管异常
ld 模块加载
-c 选项可以用来指定在事件发生时执行的调试命令。
五、Debug Diagnostic Tool详细用法
参考此文:
http://hi.baidu.com/ourok/item/47314e8db094e3814414cfba
此工具可以在程序发生崩溃或者内在溢出时自动生成dump,并有相应的崩溃/挂起分析器和内存压力分析器。
六、其他调试工具
参考此文:
http://www.cnblogs.com/moonz-wu/archive/2011/07/03/2096693.html
对于C++的程序来说,那工具可就多了。这里我主要用的是IIS Debug Diagnostics Tool,这个原本是用于IIS应用程序的诊断工具,在监视系统服务这样的应用上还是很方便的。同时它可以进行自动的memory leak分析并生成报表。对于memory leak的诊断很有帮助。当然,我还用到了vmmap和rammap两个应用程序。这两个程序原先是system internal那个作者开发的,现在已经收归微软门下了。这两个文件一个用于查看进程的虚拟内存分配情况,而另一个拥有查看物理内存的时候情况。最后一个工具就是process hacker,它能帮助我们更详细的了解进程的内存分配,句柄分配,模块加载,线程数目等。当然processexplorer也可以做相同的工作,但是如果你要查看内存块的内容时,还需要windbg的配合。
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/小丑西瓜9/article/detail/168314
推荐阅读
article
2023
年
华为
OD
最新资料
_
2023
华为
od...
题目通常包括算法题、编程题、数据结构题等,时间是150分钟也就是两个半小时,分值是100、100、200,400 分满分...
赞
踩
article
win7
休眠
、
待机
api
_睡眠原因:
application
api
...
win7
休眠
、
待机
api
通过c++让windows进入
休眠
或者
待机
状态。 xp、
win7
下用SetSystemPower...
赞
踩
article
redhat6
yum
安装
与配置_
redhat6
安装
yum
...
1.删除redhat原有的
yum
rpm -aq|grep
yum
|xargs rpm -e --nodeps 2.下载...
赞
踩
article
Linux
的
目录
和
文件
管理
_
linux
操作系统
管理
及应用实训2
文件
和
目录
的
管理
...
命令是要执行的操作或任务的名称,选项是命令的配置和行为设置,参数是要操作的对象或要使用的数据。学会使用命令
管理
文件
和
目录
...
赞
踩
article
python
画
围棋
棋盘
_
Python
语言
程序设计
之二--用
turtle
库
画
围棋
棋盘
和正、余弦函数图形...
这篇笔记依然是在做《
python
语言
程序设计
》第5章循环的习题。其中有两类问题需要记录下来。第一是如何
画
围棋
棋盘
。
围棋
棋...
赞
踩
article
win10
笔记本
电脑
总是自动休眠
解决办法
_
笔记本
自动休眠...
win10
笔记本
电脑
总是自动休眠
解决办法
win10
笔记本
电脑
总是自动休眠
解决办法
win10
笔记本
电脑
总是自动休眠
解决办法
...
赞
踩
article
GPL
和
BSD
和
Apache
之间
的
区别和联系_gpl、bsd、
apache
指
的
是什么...
GPL
和
BSD
和
Apache
开源许可证
GPL
、
BSD
、MIT、Mozilla、
Apache
和L
GPL
的
区别 以下是上述...
赞
踩
article
在
Linux
(
Redhat
/
CentOS
)上快速搭建我
的
世界(
Minecraft
)
服务器
,并实现远程...
我
的
世界 联机
服务器
minecraft linux
CentOS
内网穿透_
centos
mc
服务器
centos
mc
...
赞
踩
article
Python
进行大
数据
挖掘
和
分析
_结合你所掌握的大
数据
知识,谈谈
python
在
数据
爬取,
数据
分析
,数...
大
数据
无处不在。在时下这个年代,不管你喜欢与否,在运营一个成功的商业的过程中都有可能会遇到它。_结合你所掌握的大
数据
知识...
赞
踩
article
一
:
sql
语句
查询
的
执行
流程_一个
sql
语句
的
检索过程...
1.连接器
:
权限连接和管理验证,通过-h(ip地址) -P(端口号)-u(账号) -p(密码)登录,可以通过show p...
赞
踩
article
树莓
派
远程
连接
的
四种方式(最全)...
准备前提:首先用 ifconfig 查看
树莓
派
的
IP 地址,记录下来推荐通过固定 IP
的
方法把
树莓
派
的
IP 地址确...
赞
踩
article
搭建我
的
世界
Java
版
服务器
,畅享公网内网远程联机乐趣!_
hmcl
添加
认证
服务器
...
搭建我
的
世界MC JAVA
版
服务器
,和朋友一起玩耍。_
hmcl
添加
认证
服务器
hmcl
添加
认证
服务器
...
赞
踩
article
Linux
文件
和目录管理...
Linux
文件
和目录管理_linux
文件
和目录管理linux
文件
和目录管理 ...
赞
踩
article
docker
配置
java
环境
(全手动方式)_
docker
配置
jdk
环境
...
1、
docker
下载centos镜像(用作
配置
jdk
环境
系统)如果
docker
安装的服务器有网络,可以使用下面的命令拉取...
赞
踩
article
网
闸
的
理解-
python
脚本
模拟
网
闸
实现_
网
闸
代码...
网
闸
的
理解-
python
脚本
模拟
网
闸
实现_
网
闸
代码
网
闸
代码 ...
赞
踩
article
本地
搭建
我
的
世界
服务器
(
可
联机)_
mc
服务器
搭建
...
想自己
搭建
服务器
的
小伙伴们
可
以试一试。本篇是结合网上
的
方法自己整理
的
内容,仅供学习参考。树莓派端和Windows端
我
都尝...
赞
踩
article
SessionNotCreatedEx
c
eption:Message:
session
not
c
re...
用Python的selenium爬虫时:报如下错误:SessionNotCreatedEx
c
eption: Messag...
赞
踩
article
Centos7
安装
docker
-
compose
_"collecting
cached
-propert...
Docker-Compose是一个部署多个容器的简单但是非常必要的工具.安装Docker-Compose之前,请先安装 ...
赞
踩
article
pip
安装
&卸载包...
安装
包1. 在线
安装
:使用
pip
install + 包名默认
安装
最新版本的包:格式:
pip
install + 包名如...
赞
踩
article
数据结构
与算法
Python
语言描述 第三章
线性表
_
python
数据结构
与算法分析,
线性表
元素
的定...
1、数据类型集合E上
线性表
为E中有穷
元素
排列的序列 L=(e0,e1,...,en-1) ei∈E n>=0。对于L表元...
赞
踩
相关标签
华为OD
api
windows
休眠
待机
关机
linux
服务器
运维
python画围棋棋盘
网络
java
vim
python
数据挖掘
信息可视化
学习
开发语言
docker