Visual Studio 调试技巧
Visual Studio 调试小技巧,设置断点的条件
在编程时,我们很多时候需要调试来跟踪程序,比如我们在一个循环的时候需要当i==2时中断程序,这个时候我们可以条件一个断点,然后对着断点右键,选择Condition,然后我们就可以设置条件了。
在设置断点条件的时候,==运算符比较的是两个字符的地址而不是内容,当我们需要判断字符串的值时,不能str=="debug",visual studio 考虑到程序经常会根据字符串的内容来天剑断点,因此在添加断点这个功能上为字符串做了特殊的支持,我们在根据字符串内容来添加断点的时候,可以使用strcmp,等函数来判断,于是我们在判断字符串时候相等的时候可以使用strcmp(str,"debug")==0来做为判断的条件。Visual Studio中的添加断点功能中支持的字符串函数有:strlen, wcslen, strnlen, wcsnlen, strcmp, wcscmp, _stricmp, _wcsicmp, strncmp, wcsncmp, _strnicmp, _wcsnicmp, strchr, wcschr, strstr, wcsstr.。
Visual Studio 调试小技从watch查看更过的信息
在使用Visual Studio开发调试程序时,我们经常需要打开查看窗口(Watch)来分析变量。有时在查看窗口显示的内容不是很直观。为了能从查看窗口的变量中得到更多的信息,我们需要一些小的技巧。下面是几个例子。
1. Windows消息 在开发调试界面程序时,我们经常需要查看消息的内容。当在查看窗口中,仅仅只显示出消息对应的整数值,我们并不能直观地知道究竟是什么消息。比如: 为了能让查看窗口显示出消息内容,我们只需要在变量名添加“, wm”的格式化后缀,就能显示消息的名字:
2. 句柄返回值
Windows有很多API返回一个HANDLE类型的值来表示操作是否成功。当操作失败时,返回一个特定的值来表示操作失败的原因。通常我们不可能记住所有的错误代码对应的失败类型。比如在下面的例子中,我们就不一定能看出0x80070005表示的错误原因
3. 错误代码
Windows 中有很多API在操作失败时,会设置一个错误代码,程序员可以调用函数GetLastError得到该错误代码。在调试时,如果代码中没有调用GetLastError,那么我们就不能很方便地得到给错误代码。 由于这个错误代码是设置在一个叫$ERR的寄存器里。我们可以在查看窗口中显示出该寄存器的值从而得到错误代码。例如,我们运行如下代码:
HANDLE hFile = CreateFile(_T("wojiushi3344.txt"), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
我们可能不能从错误代码0x0002看出出错的原因。有了前面句柄的经验,我们可以在后面添加“, hr”后缀,此时查看具体的错误信息。、
4 .数组
当我们数组使用指针表示的时候:int * intArray,在watch窗口查看intArray,看到的是intArray的地址用intArray[0],只能看到一个值.这个时候我们可以用intArray,10
更多watch窗口语法规则
格式化数据和表达式赋值语句.
常用变量格式化符(表达式的值后跟逗号,接格式化符,如"(int)0xFFFF,d"):
d,I:有符号的十进制数.
u
o
x,X:十六进制数.
l,h:d,i,u,o,x,X的长前缀或短前缀.
f
e
g
c
s
su
st
hr
wm
常用内存转储对象的格式化符(用法同变量格式化符):
ma
m
mb
mw
md
mq
mu
#