vs远程调试步骤

举报
Amrf 发表于 2019/02/14 21:08:12 2019/02/14
【摘要】 以vs2015举例:找到C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Remote Debugger\目录;根据编译程序是32位的还是64位的选择,Remote Debugger目录下的x86或者x64,拷贝到目标远程机器中;在目标远程主机上启动msvsmon.exe程序;为了连接方便,在msvsmon.exe...

以vs2015举例:

  1. 找到C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Remote Debugger\目录;

  2. 根据编译程序是32位的还是64位的选择,Remote Debugger目录下的x86或者x64,拷贝到目标远程机器中;

  3. 在目标远程主机上启动msvsmon.exe程序;

  4. 为了连接方便,在msvsmon.exe中点击工具选项设置如下:

    spacer.gif

  5. 在调试机器上打开项目并选择调试附加到进程,输入目标机器的ip:4200,回车确定;

  6.  将项目编译好的程序拷贝到目标远程机器, 在目标机器上启动程序;

  7. 在调试机器上的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://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=ZH-CN&k=k(vs.debug.remote.overview)&rd=true

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方式从服务器

/********************************************************************************/

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。