Visual Studio 调试技巧

来源:互联网 发布:家具下料软件 编辑:程序博客网 时间:2024/05/17 04:56

      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:有符号的十进制数.  
    :无符号的十进制数.  
    :无符号的八  
x,X:十六进制数.  
l,h:d,i,u,o,x,X的长前缀或短前缀.  
    :有符号浮点数.  
    :有符号的科学计数法.  
    :有符号的浮点或有符号的科学计数法,用其中较短的一个.  
    :单字符.  
    :字符串.  
su   :双字节字符串.  
st   :双字节字符串或ANSI字符串,取决于AUTOEXP.DAT中的Unicode   String设置.  
hr   :Windows类标记.  
wm   :Windows消息码.  
   
常用内存转储对象的格式化符(用法同变量格式化符):  
ma   :64个ASCII码字符.  
    :以16进制书写的16字节,后跟16个ASCII字符.  
mb   :以16进制书写的16字节,后跟16个ASCII字符.  
mw   :8个字长.  
md   :4个双精度字.  
mq   :4个四倍字长的字.  
mu   :2字节字符(Unicode标准).  
    :将指针扩展到指定的数值数目的内存存储单元上.(#代表一个数字)  

 

 


 

原创粉丝点击