加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_泰州站长网 (http://www.0523zz.com/)- 视觉智能、AI应用、CDN、行业物联网、智能数字人!
当前位置: 首页 > 运营中心 > 网站设计 > 教程 > 正文

Visual Studio高级调试技巧

发布时间:2016-10-29 20:48:32 所属栏目:教程 来源:站长网
导读:副标题#e# 1. 设置软件断点,运行到目标位置启动调试器 方法①:使用汇编指令(注:x64 c++不支持汇编) _asm int 3 方法②:编译器提供的方法 __debugbreak(); 方法③:使用windows API DebugBreak(); WerFault.exe进程(Windows Error Reporting)弹出Con

通过命令来完成vs中的功能(不仅仅在调试状态时使用),另外其调试相关命令与windbg保持一致。

? nLocal  //查看变量nLocal的值
?? nLocal //将nLocal添加到Quick Watch窗口中
? nLocal=100 //修改nLocal的值为100
? MySum(20,30) //调用全局函数MySum,并返回结果
k //打印当前线程堆栈
~ //查看线程情况
~*k  //打印出所有线程的堆栈信息
watch //打开watch窗口
memory2 //打开memory2窗口
g //继续执行,F5功能
q //结束调试

12. 内存断点

Visual Studio高级调试技巧

(1)在84行断点停住后,查看&s.Age的地址为0x0042FCEC

(2)点击"Debug"-"New Breakpoint"-"New Data Breakpoint...",在弹出的对话框Address填入:0x0042FCEC,长度为4即可

(3)当运行到88行时,由于Scores数组越界引发了s.Age的内存修改,触发了内存断点

13. 条件断点

Visual Studio高级调试技巧

断点说明:

(1)设置断点条件:i>6;且被命中次数>=2时才断住程序,所以第一次断住时i=8

(2)命中时,在Output窗口中打印当前函数名及线程ID(也可以打印相关变量的值,详见"When Breakpoint Is Hit"面板上的说明);在Command窗口中打印出堆栈信息

(3)若不想断住程序,可以把"When Breakpoint Is Hit"对话框中的"Continue execution"勾选上

注1:对于字符串的条件断点,不能写如下条件pStr=="Hello"(pStr为char*类型),应该写成:pStr[0]=='H' && pStr[1]=='e' && pStr[2]=='l' && pStr[3]=='l' && pStr[4]=='o' && pStr[5]==''

     vs2010及以上版本中,条件断点中可使用字符串:strcmp(pStr, "Hello")==0

     支持的字符串函数有:strlen, wcslen, strnlen, wcsnlen, strcmp, wcscmp, _stricmp, _wcsicmp, strncmp, wcsncmp, _strnicmp, _wcsnicmp, strchr, wcschr, strstr, wcsstr.

注2:也可以创建自己的宏,具体方法:"Tools"-"Macros"-"Macro Explorer",然后在下图:MyMacros-Module1上右键快捷菜单中选择"New macro",

     如ChangeExpression宏函数会在Output窗口的Debugger过滤器下打印出"Hello World",然后修改变量code的值为1000

     编写自己的宏时,可以参考大量vs已有的宏(见:Samples节点下)

Visual Studio高级调试技巧

14.在windows API上打断点

(1)例如:对SetWindowText打断点。首先当前程序字符集为未设置或多字节,则SetWindowTextA;为Unicode则为SetWindowTextW。下面以SetWindowTextA为例。

(2)调试运行程序断住后,打开Modules窗口可以看到所有已经加载的模块,找到windows API所在的模块,右击鼠标执行"Load Symbols From" - "Microsoft Symbol Servers"下载并加载对应模块的pdb

(3)新建一个Break At Function断点,填入:{,,user32.dll}_SetWindowTextA@8。可以看到,VS里面的符号跟windbg相比多了一些字符,其中‘_’表示stdcall类型,后面‘@8’表示所有参数的字节数的和。

       有些函数Symbol Name与导出函数名可能不一致,例如GetDC(HWND),其Symbol Name为NtUserGetDC,最后断点应填入:{,,user32.dll}_NtUserGetDC@4

       注:查找windows API符号名可以使用windbg的x命令或者使用pdb解析工具(symView)

Visual Studio高级调试技巧

也可以直接使用地址对windows API打断点(这种方式不需要符号的支持):如对GetDC打断点,可以用Dependency查看其在user32.dll中导出函数地址(Entry Point列):0x000172CC

Visual Studio高级调试技巧

然后在Modules窗口中获得user32.dll模块起始地址0x75840000,最后对两个值相加后的绝对地址处直接设置断点:{,,user32.dll}0x758572CC

Visual Studio高级调试技巧

15. 异常时断住程序

(1)在"Debug"-"Exceptions...",弹出如下对话框:点击Add按钮,新增一个int类型的C++ Exceptions异常,并勾选Thrown

Visual Studio高级调试技巧

(2)当int、int*、int&的异常被catch到时,会断住程序进入调试状态(注:以上void类型对应:char*、void*的异常)

Visual Studio高级调试技巧

16. 单步调试自动跳过不必进入的函数  (注:仅适用于Native c++)

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINESOFTWAREWow6432NodeMicrosoftVisualStudio9.0NativeDEStepOver]
"1"="scope:CString.*::.*=NoStepInto"

注1:如果是32位windows,删除上面路径中的Wow6432Node

注2:不进入任何CString的方法(前面的1表示优先级,该值越大优先级越高)

++++++++++++++++++++++++++++++

NoStepInto 不可进入匹配函数
StepInto   可进入匹配函数

特殊字符串:

cid 代表一个C/C++标识符
funct 代表一个C/C++函数名
scope 代表一个函数的作用范围(命名空间+类名 如:ATL::CFoo::CBar::)
anything 代表一个字符串
oper 代表一个C/C++操作符

正则表达式:

(编辑:云计算网_泰州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读