vs远程调试步骤
以vs2015举例:
找到C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Remote Debugger\目录;
根据编译程序是32位的还是64位的选择,Remote Debugger目录下的x86或者x64,拷贝到目标远程机器中;
在目标远程主机上启动msvsmon.exe程序;
为了连接方便,在msvsmon.exe中点击工具选项设置如下:
在调试机器上打开项目并选择调试附加到进程,输入目标机器的ip:4200,回车确定;
将项目编译好的程序拷贝到目标远程机器, 在目标机器上启动程序;
在调试机器上的vs附加到进程窗口下方点击刷新附加,选择目标调试进程名进行调试;
一个小技巧,如果目标程序的问题是过于早的自动退出,有没有崩溃信息和报错,也就是程序存在了几秒导致难以附加,可以考虑在程序入口加上一段时间延时,以便于附加成功;
参考文档:
https://www.cnblogs.com/sundajade/articles/5440334.html
https://www.cnblogs.com/tuyile006/p/7827158.html
https://blog.csdn.net/u011014707/article/details/15498129
https://docs.microsoft.com/zh-cn/visualstudio/debugger/remote-debugging?view=vs-2017
/********************************************************************************/
https://github.com/thawk/wiki/wiki/windbg
如何将64位Dump转成32位 (https://www.cnblogs.com/alone-striver/p/7661269.html)
.load wow64exts
!sw
分析Dump
!analyze -v
~* kv
https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/-analyze
https://blog.51cto.com/whatday/1382378
https://blog.csdn.net/china_jeffery/article/details/79317864
下载系统文件的符号(https://www.cnblogs.com/Fido/archive/2011/12/26/2302377.html)
symchk c:\winnt\system32\ntoskrnl.exe /r /s srv*d:\symbols*http://msdl.microsoft.com/download/symbols
查看堆栈
kn [frame count]察看当前堆栈及其索引, frame count指定要显示多少桢
kb显示堆栈桢地址,返回地址,参数,函数名等
kv在kb的基础上增加了函数调用约定等信息, 所以推荐用kv命令察看堆栈.
.frame [frame index] 将当前堆栈切换到某个堆栈桢, 比如.frame 1 切换到第1桢
dv 命令察看当前堆栈桢的局部变量
堆栈桢的含义(https://www.cnblogs.com/qinfengxiaoyue/p/3399537.html)
显示当前调用栈信息
k
kv
.frame
!*kb
dps esp
dps esp l 100
查看当前局部变量
dv
(按下Ctrl+Alt+V)
Verbose mode ON.
0:000> dv
上下文
可以通过.frame [index] 切换当前堆栈桢,然后通过dv 显示当前堆栈桢函数的局部变量(堆栈桢的index从0开始,可以通过kn命令显示堆栈桢索引)
查看线程死锁
!locks 显示死锁
!handle 列出当前进程所handle
!handle [index] f, 显示某个handle的详细信息
查看进程PEB
首先使用!peb获取内存中地址,然后使用 dt peb 内存地址 方式查看对应的数值
!peb
dt _peb addr
查看进程TEB
!teb
查看LastError值
!gle
!error
指定形式输出
? 0xxxxx+0n10
0x/0n/0t/0y 分别表示 16/10/8/2 进制。
格式化输出
.formats @eax
加载DLL时中断
sxe ld
sx, sxd, sxe, sxi, sxn, sxr 几条命令可用来设置异常和事件的处理方式。
显示地址附近结构
ln xxxx
显示加载模块
lm
列举当前进程线程信息
~
~*
显示/修改寄存器值
r
r eax
r eax=xxxxx
r eax
搜索全局变量/函数地址
x Kernel32!*
!handle
!handle c f
反汇编
u
u*反汇编
修改反汇编指令
u xxxx
a xxxx
u xxxx
断点相关
bp、bl、bc、bd、be
ba:内存访问断点
查看/修改内存
dd esp+8
d*查看,e*修改,可F1查看帮助。
踩内存问题定位总结
https://blog.csdn.net/helloguoqijun/article/details/78036096
Gflags工具是微软公司开发的windbg调试工具里自带的内存非法访问检查工具,简单易用。
Gflags的原理:
当分配一块内存时,通过调整内存块的分配位置,使其结尾恰好与系统分页边界对齐,然后在边界处再多分配一个不可访问的页作为保护区域。这样,一旦出现内存读/写越界时,进程就会Crash,从而帮助及时检查内存越界。
内存非法访问分类:
(1)数组访问越界
(2)释放过的指针继续访问
(3)重复释放指针
能使用list,就不要使用vector,避免连续内存分配失败
窗口Create必须要判断返回结果
new失败会抛出异常,而不是返回NULL,需要加std::nothrow异常说明
利用Vs为X86程序开启大内存的方法 (https://www.cnblogs.com/lidabo/p/12163101.html)
/********************************************************************************/
组播,伙伴地址,该请求在局域网内组播
p2p请求从该伙伴处下载
p2s方式从服务器
/********************************************************************************/
- 点赞
- 收藏
- 关注作者
评论(0)