搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
从前慢现在也慢
这个屌丝很懒,什么也没留下!
关注作者
热门标签
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
华为交换机下的DHCP的IPmac地址绑定_the static-mac is exist in this ip-pool
2
大数据数据分析-scala、IDEA、jdk之间的搭配关系
3
HarmonyOS学习路之开发篇—网络与连接(蓝牙开发 二)
4
一文了解云计算
5
计算机系统结构 并行性,计算机体系结构中并行性的发展
6
05-图像纹理恢复_小尺寸,简单的纹理修复任务
7
Android 错误ClassLoader referenced unknown path: /mnt/asec/com.smartonet-2/lib/arm_classloader referenced unknown path: system/framew
8
C++简单排序算法之冒泡排序_c++使用冒泡排序,将char数组从小到大排序
9
使用tcpdump观察ARP通信过程和ARP报文详解_arp tcpdump解析
10
httpcanary动态注入_HttpCanary使用指南——正则匹配注入
当前位置:
article
> 正文
调试winddows程序(windbg 和 Debug Diagnostic Tool)_debugdiag-tools
作者:从前慢现在也慢 | 2024-03-23 14:46:01
赞
踩
debugdiag-tools
一、功能:
调试不在编译器中运行的程序。可以解决一下两种问题。
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博客】
推荐阅读
article
iOS开发之
Xcode
常用调试(
Debug
)技巧总结_
xcode
phone
debug
...
转自: iOS开发之
Xcode
常用调试(
Debug
)技巧总结_
xcode
phone
debug
xcode
phone
...
赞
踩
article
【
Tools
】
CCS
v4的
工程
怎么用
CCS
5.5
.0打开?_
ccs
的
project
下没有impo...
一、
CCS
5.5
.0导不进
CCS
v4
工程
首先在网上找到如下的操作,但是不行。点击任务栏---projet;下面有"imp...
赞
踩
article
python
初级8(
buffer
ing:缓冲区,
encoding
,文本操作,写入,文件指针,
with
...
buffer
ing:缓冲区,
encoding
,文本操作,写入,文件指针,
with
关键字,调试 debug
_
default
...
赞
踩
article
eclipse
工程配置文件详解_
org
.
eclipse
.jdt.
internal
.
debug
.ui....
先建了一个最基本的java工程:TestProject,发现
eclipse
自动生成了这些东西: 分别打开看看:.clas...
赞
踩
article
android
编译时没有规则可以创建“out/
target
/
common
/obj/
APPS
/Calc...
没有规则可以创建“out/
target
/
common
/obj/
APPS
/
CalculatorTests
_intermed...
赞
踩
article
【
DevEco
Studio
】
MacOS
系统
DevEco
报错
NoSuchFileException
...
source之后可以在终端中通过show和hide来隐藏和显示隐藏文件。删除User目录下的.gradle隐藏文件夹,重...
赞
踩
article
【IOS-Debug】
uniapp
小
程序
打开
APP
原生
页面_
uniapp
ios
小
程序
调用
原生
界面...
APP
里面的
uniapp
小
程序
要接入微信支付,但是支付的调起为实现统一管理是由
APP
原生
调起支付,不是每个
小
程序
自己实现...
赞
踩
article
【
NLP
Tool
--
JieBa
】Jieba
实现
TF-
IDF
和
TextRank
文本关键字提取(附...
简单快速
实现
文本关键词提取_
textrank
代码
实现
textrank
代码
实现
NLP
Tool
...
赞
踩
article
使用
VSCode
编译
调试
IAR
的
stm32
工程_
vscode
iar
debug
...
相对于
IAR
和Keil上世纪水平的代码编辑器,巨硬出品的
VSCode
简直就是太香了,可惜毕竟不是专门为嵌入式开发设计的,...
赞
踩
article
Qt pro文件中判断
x86
/
arm
(
a
arch
64
)交叉编译环境,区分
linux
/window...
使用的
arm
编译器为
a
arch
64
, 很多博客都是使用 QMAKE_HOST.
arch
进行判断,但这并不能分辨出 aa...
赞
踩
article
WinDbg
-分析
DMP
文件,我这是要换
CPU
了么?一直不定时的蓝屏
_
genuineintel
.sy...
........analyze -v9: kd>!analyze -vnt!Arguments:Value: 87.ec...
赞
踩
article
HuBuidler 启动自己的
项目
失败:[WeChat mini-
app
devoloper too...
补充:(代码编译完成,控制台报 [
error
]
Error
:
Fail
to
open
IDE 错误,可以 正常唤起
微信
...
赞
踩
article
idea
启动项目报错:Unable
to
open
debug
ger
port
(127.0.0.1:...
idea
启动项目报错:Unable
to
open
debug
ger
port
(127.0.0.1:XXXXX)_ide...
赞
踩
article
idea
启动项目时候,启动失败
Unable
to
open
debug
ger
port
(127.0...
小编有话:重新启动
idea
的时候,右下角爆出这样的错误,这是因为端口被占用了。还有有可能是java 进程占用了这个端口。...
赞
踩
article
Idea
debug
无法启动项目
Unable
to
open
debug
ger
port
(12...
1、造成这个问题可能有两个原因端口占用冲突非端口占用冲突2、 端口占用冲突这个很好解决,网上大部分都说是端口占用冲突,打...
赞
踩
article
【计算机视觉 5】、图像检索_
content
based
image
retrieval
: tool...
90年代以后,出现了对图像的内容语义,如图像的颜色、纹理、布局等进行分析和检索的图像检索技术,即 基于内容的图像检索 (...
赞
踩
article
Android
Studio
4.0
插件下载_
android
stuido com.androi...
Android
Studio
4.0
插件下载其他博客上写了很多的解决关于AS插件搜索和下载缓慢的问题,但是,我尝试一下...
赞
踩
article
Android
Studio 解决License for
package
Android
SDK
B...
要解决
Android
SDK
Build
-Tools 28.0.3许可证未被接受的问题,首先需要打开命令行并导航到你的S...
赞
踩
article
Android
代码
混淆
_
android
混淆
debug...
一、代码
混淆
作用:防止反编译; 精简编译后的apk文件大小;二、开启
混淆
:在项目的build.gradle中开启
混淆
:将...
赞
踩
article
Android
Gradle
Plugin
、
Gradle
、
Build
Tools
、JDK版本对应关...
Android
SDK
Build
-
Tools
是构建
Android
应用所需的一个
Android
SDK 组件,安...
赞
踩
相关标签
python
开发语言
后端
eclipse
Java项目编译
macos
uni-app
小程序
objective-c
xcode
自然语言处理
nlp
c++
linux
java
android
qt
arm
microsoft
windows
微信小程序
intellij-idea
tomcat