搜索
查看
编辑修改
首页
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
" href="/w/Gausst松鼠会/article/detail/235323" target="_blank">Scss 基本使用 ( @extend、 @mixin、@import、@if、@for、@while、@each )_
2
数据库简介及安装_数据库安装
3
npm使用淘宝镜像源设置大全_npm 淘宝源
4
安卓期末大作业——猫咪社区(源码+任务书)_貓咪社區
5
SpringBoot - spring-boot-maven-plugin插件介绍
6
调研:huggingface-diffusers_diffusers可以做什么
7
go反射实战
8
pytorch 卷积神经网络之数据增强_如何用卷积增加数据
9
【openvpn简介】_open vp
10
AIGC工具-Stable Diffusion安装指南
当前位置:
article
> 正文
使用WinDbg调试程序_windbg 源码模式
作者:你好赵伟 | 2024-03-22 11:50:09
赞
踩
windbg 源码模式
什么是
WinDBG?
WinDbg
是微软开发的免费源码级调试工具。Windbg可以用于Kernel模式调试和用户模式调试,还可以调试Dump文件。由于大部分程序员不需要做Kernel模式调试, 我在这篇文章中不会介绍Kernel模式调试。Kernel模式调试对学习Windows核心极有帮助。如果你对此感兴趣,可以阅读Inside Windows 2000和Windbg所带的帮助文件。
这篇文章得主要目的是介绍WINDBG的主要功能以及相关的命令。关于这些命令的详细语法,请参阅帮助文件。对文章中提到的许多命令,WINDBG有相应的菜单选项。
如何得到帮助
在命令(Command)窗口中输入
.hh
命会调出帮助文件令。
.hh keyword
会显示关于keyword的详细命令。
启动
Debugger
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的名字。
Dump
文件调试:如果在你的客户的机器上出现问题,你可能不能使用远程调试来解决问题。你可以要求你的用户将Windbg附加到出现问题的进程上,然后在命令窗口中输入:
.dump /ma File Name
创建一个Dump文件。在得到Dump文件后,使用如下的命令来打开它:
windbg –z DUMP_FILE_NAME
本地进程调试:你可以在Windbg下直接运行一个程序:
Windbg “path to executable” arguments
也可以将Windbg附加到一个正在运行的程序:
Windbg –p “process id”
Windbg –pn “process name”
注意有一种非侵入(Noninvasive)模式可以用来检查一个进程的状态并不进程的执行。当然在这种模式下无法控制被调试程序的执行。这种模式也可以用于查看一个已经在Debugger控制下运行的进程。具体命令如下:
Windbg –pv –p “process id”
Windbg –pv –pn “process name”
调试多个进程和线程
如果你想控制一个进程以及它的子进程的执行,在Windbg的命令行上加上
-o
选项。Windbg中还有一个新的命令
.childdbg
可以用来控制子进程的调试。如果你同时调试几个进程,可以使用
|
命令来显示并切换到不同的进程。
在同一个进程中可能有多个线程。
~
命令可以用来显示和切换线程。
调试前的必备工作
在开始调试前首先要做的工作是设置好符号(Symbols)路径。没有符号,你看到的调用堆栈基本上毫无意义。Microsoft的操作系统符号文件(PDB)是对外公开的。另外请注意在编译你自己的程序选择生成PDB文件的选项。如果设置好符号路径后,调用堆栈看起来还是不对。可以使用
lm, !sym noisy, !reload
等命令来验证符号路径是否正确。
Windbg
也支持源码级的调试。在开始源码调试前,你需要用
.srcpath
设置源代码路径。如果你是在生成所执行代码的机器上进行调试,符号文件中的源码路径会指向正确的位置,所以不需要设置源代码路径。如果所执行代码是在另一台机器上生成的,你可以将所用的源码拷贝(保持原有的目录结构)的一个可以访问的文件夹(可以是网络路径)并将源代码路径设为该文件夹的路径。注意如果是远程调试,你需要使用
.lsrcpath
来设置源码路径。
静态命令:
显示调用堆栈
:在连接到一个调试窗口后,首先要知道的就是程序当前的执行情况
k*
命令显示当前线程的堆栈。
~*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
选项可以用来指定在事件发生时执行的调试命令。
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/你好赵伟/article/detail/287952
推荐阅读
article
RapidSCADA
示例:采集
Modbus
TCP
和
发布
到
MQTT
...
RapidSCADA
示例:采集
Modbus
TCP
和
发布
到
MQTT
RapidSCADA
示例:采集
Modbus
TCP
和发...
赞
踩
article
OpenHarmony
轻量
系统
开发
-
鸿蒙
小车
开发
_
基于
鸿蒙
系统
智能
小车
简历...
摘要:本文简单介绍
鸿蒙
系统
+ Hi3861 的WiFi
小车
开发
适合群体:适用于润和Hi3861
开发
板文中所有代码仓库:...
赞
踩
article
使用
Juicesync
实现对腾讯
云
CHDFS
存储的
数据
迁移
_
迁移
工具
juice
...
近年来,
云
计算越来越流行,企业从自身利益出发,或是不愿意被单一
云
服务商锁定,或是业务和
数据
冗余,或是出于成本优化考虑,会...
赞
踩
article
【
XR806
开发板试用】
UART
串口
通信
篇...
【
XR806
开发板试用】
UART
串口
通信
篇【
XR806
开发板试用】
UART
串口
通信
篇 ...
赞
踩
article
封装
验证码
组件
的
简易教程...
验证码
我们平时应该不少见到,其原理就是通过HTML5 Canvas API也就是我们说
的
画布,我们可以通过算法随机生成一...
赞
踩
article
风险
分析
评估方法介绍...
当前最传统也最广泛的
风险
分析
方法主要是基于知识(Knowledge-based)的
分析
方法、基于模型(Model-ba...
赞
踩
article
ChatGPT
是
什么?其本质
是
什么?...
Optimizing Language Models for Dialogue(优化对话语言模型)
ChatGPT
以对话方...
赞
踩
article
项目
表格以及思路
的
设计
-
优惠券
设计
_电商
优惠券
数据表
设计
方案
...
这些是
项目
最初
的
设计
思路
优惠券
的
后台思路就是一个用户同等金额
的
只能存在一个,使用过,过期不算。discount
优惠券
...
赞
踩
article
如何在你
的
电脑
上
完成
whisper
的
简单
部署
_
whisper
部署
...
Windows使用
whisper
前需要进行
的
一些环境配置
_
whisper
部署
whisper
部署
...
赞
踩
article
uniapp
小程序
上传
图片
裁剪
效果
demo
(整理)_
uniapp
图片
上传
的时候编辑
图片
...
uniapp
小程序
上传
图片
裁剪
效果
demo
_
uniapp
图片
上传
的时候编辑
图片
uniapp
图片
上传
的时候编辑
图片
...
赞
踩
article
使用
语音
识别
+
声纹
识别
实现智能
会议记录
_
pyannote
.
audio
声纹
保存...
在基本功能实现方面,我们已经取得了不错的进展。在准确率方面,我们也进行了一些测试。大部分情况下,
声纹
识别
的准确率是可以接...
赞
踩
article
python
对
比
两张
图片
找不同_
python
比
两张
图片
内容图案...
【代码】
python
对
比
两张
图片
找不同_
python
比
两张
图片
内容图案
python
比
两张
图片
内容图案 ...
赞
踩
article
ChatGPT
编程
Python
小
案例
(拿来就用)—
解压
zip
压缩文件
...
AI
编程
随时助力你的梦想
ChatGPT
编程
Python
小
案例
(拿来就用)—
解压
zip
压缩文件
...
赞
踩
article
LangChain
:打造自己
的
LLM
应用
| 京东云技术团队_如何运用
langchain
框架
做
多功能
...
随着大模型
的
发展,
LangChain
应该是目前最火
的
LLM
开发
框架
,能和外部数据源交互、能集成各种常用
的
组件等等,大大降...
赞
踩
article
ECCV2020
最佳
论文
解读之递归
全对场
变换(
RAFT
)
光流
计算
模型
...
点击上方“3D视觉工坊”,选择“星标”干货第一时间送达
计算
机视觉三大国际顶级会议之一的 ECCV 2020 已经召开。今...
赞
踩
article
uniapp
APP
用户
修改
头像
(上传到
OSS
)_
uniapp
更换
头像
...
uniapp
APP
用户
修改
头像
(上传到
OSS
)点击
头像
进行
修改
头像
**点击
头像
跳转到新的页面**(先判断
用户
是否登陆)...
赞
踩
article
Android
debug:
Android
Studio
断点
调试
详解_
android
studio ...
Android
Studio
断点
调试
断点
调试
1、概述2、
调试
过程2.1 第1步:添加
断点
2.2 第2步:
调试
——单步
调试
...
赞
踩
article
基于
FPGA
的
图像
信号
白平衡
实现...
【代码】基于
FPGA
的
图像
信号
白平衡
实现。基于
FPGA
的
图像
信号
白平衡
实现 ...
赞
踩
article
HarmonyOS
学习
路之
开发
篇—
数据管理
(
分布式
数据服务
)...
分布式
数据服务
主要实现用户设备中应用程序的数据内容的
分布式
同步。当设备1上的应用A在
分布式
数据库中增、删、改数据后,设备...
赞
踩
article
ESP32
驱动
JQ8900
语音模块...
(1)硬件:ESP-WROOM-32开发板一块,
JQ8900
播报模块一个,喇叭一个,电源适配器一个,杜邦线若干(2)软件...
赞
踩
相关标签
物联网
IoT
SCADA
Modbus
mqtt
单片机
stm32
hadoop
腾讯云
云计算
数据迁移
云平台迁移
嵌入式硬件
免费源码
商城源码
验证码
开发教程
问卷调查
咨询
金融
文档
通讯
工具
chatgpt
人工智能