Visual Studio高级调试技巧
通过命令来完成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. 内存断点 (1)在84行断点停住后,查看&s.Age的地址为0x0042FCEC (2)点击"Debug"-"New Breakpoint"-"New Data Breakpoint...",在弹出的对话框Address填入:0x0042FCEC,长度为4即可 (3)当运行到88行时,由于Scores数组越界引发了s.Age的内存修改,触发了内存断点 13. 条件断点 断点说明: (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节点下) 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) 也可以直接使用地址对windows API打断点(这种方式不需要符号的支持):如对GetDC打断点,可以用Dependency查看其在user32.dll中导出函数地址(Entry Point列):0x000172CC 然后在Modules窗口中获得user32.dll模块起始地址0x75840000,最后对两个值相加后的绝对地址处直接设置断点:{,,user32.dll}0x758572CC 15. 异常时断住程序 (1)在"Debug"-"Exceptions...",弹出如下对话框:点击Add按钮,新增一个int类型的C++ Exceptions异常,并勾选Thrown (2)当int、int*、int&的异常被catch到时,会断住程序进入调试状态(注:以上void类型对应:char*、void*的异常) 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 不可进入匹配函数 特殊字符串: cid 代表一个C/C++标识符 正则表达式: (编辑:淮北站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |