您的位置:首页 > 其它

Visual Studio 调试技巧

2012-09-09 11:33 141 查看
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 来同时查看多个值用(&intArray[2]),6 可以查看intArray[2]到[7]的值。





更多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 :双字节字符串或ANSI字符串,取决于AUTOEXP.DAT中的Unicode String设置.

hr :Windows类标记.

wm :Windows消息码.



常用内存转储对象的格式化符(用法同变量格式化符):

ma :64个ASCII码字符.

m :以16进制书写的16字节,后跟16个ASCII字符.

mb :以16进制书写的16字节,后跟16个ASCII字符.

mw :8个字长.

md :4个双精度字.

mq :4个四倍字长的字.

mu :2字节字符(Unicode标准).

# :将指针扩展到指定的数值数目的内存存储单元上.(#代表一个数字)

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: