
Visual Studio 2010 调试小技巧.docx
5页Visual Studio 调试小技巧(1)-根据字符串内容添加断点在用Visual Stud调试程序时,我们经常需要根据数值添加断点比如需要当 i == 2 时中断运行,我们可以添加如下的断点:有些时候,我们需要根据字符串的内容来添加断点比如我们在调试如下代 码:void CVSDebugTricksDlg::OnBnClickedButton1(){char* string;for(int i = 0; i < 5; ++i) {string = GetString(i);TRACE(string);}}char* CVSDebugTricksDlg::GetString(int number) {switch (number) {case 0:return "Zero";case 1:return "One";case 2:return "Two";default:return "Other";我们希望当运行到Trace(string)时,如果字符串string为”Two”时能中断运行如果我们和根据数值添加断点一样的方法,添加如下断点:当我们运行上述代码时,会发现即使string的内容”Two”时,运行并没有 中断。
这是因为==运算符比较的是两个字符串的地址而不是内容,因此上述断 点并不能满足我们的需求Visual Stud考虑到程序员经常会根据字符串的内容添加断点,因此在添加断 点这个功能上为字符串做了特殊的支持我们在根据字符串内容添加断点时,可 以使用strcmp等函数来设置断点于是在上述示例中,我们可以用 strcmp 函数来添加如下断点:Visual Studio 中的添加断点功能中支持的字符串函数有: strlen, wcslen, strnlen, wcsnlen, strcmp, wcscmp, _stricmp, _wcsic mp, strncmp, wcsncmp, _strnicmp, _wcsnicmp, strchr, wcschr, strstr , wcsstr .在使用Visual Studio开发调试程序时,我们经常需要打开查看窗口 (Watch)来分析变量有时在查看窗口显示的内容不是很直观为了能从查看 窗口的变量中得到更多的信息,我们需要一些小的技巧下面是几个例子1. Windows 消息 在开发调试界面程序时,我们经常需要查看消息的内容当在查看窗口中仅仅只显示出消息对应的整数值,我们并不能直观地知道究竟是什么消息。
比如:为了能让查看窗口显示出消息内容,我们只需要在变量名添加“,wm”的 格式化后缀,就能显示消息的名字:2.句柄返回值Windows 有很多 API 返回一个 HANDLE 类型的值来表示操作是否成功当 操作失败时,返回一个特定的值来表示操作失败的原因通常我们不可能记住所 有的错误代码对应的失败类型比如在下面的例子中,我们就不一定能看出 0x80070005 表示的错误原因:为了能方便我们从句柄的错误代码中直观地发现出错原因,Visual Studio 在查看窗口中提供了一个“,hr”后缀在变量名后添加该后缀,查看窗口就能 显示出具有可读性的信息比如,我们在上述返回值后添加“,hr”之后,就能 得到:从这个句柄值的名字看来,很有可能是访问权限出问题了3.错误代码Windows 中有很多 API 在操作失败时,会设置一个错误代码,程序员可以 调用函数GetLastError得到该错误代码在调试时,如果代码中没有调用 GetLastError,那么我们就不能很方便地得到给错误代码由于这个错误代码是设置在一个叫$ERR的寄存器里我们可以在查看窗 口中显示出该寄存器的值从而得到错误代码例如,我们运行如下代码:HANDLE hFile = CreateFile(_T("temp2.txt"), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);如果我们之前没有新建temp2.txt这个文件,那么我们就能得到如下的错 误代码:我们可能不能从错误代码0x0002看出出错的原因。
有了前面句柄的经验, 我们可以在后面添加“,hr”后缀,此时查看窗口显示为:现在我们就知道出错的原因是系统不能找到文件4.数组数组是我们使用最为频繁的一种数据结构但当数组是以一个指针和其长度来表示时,查看窗口并不能直观地显示出数组中每个元素的值,而只能显示出该数组的起始地址以及它的第一个元素下面就是一个例子:为了显示出数组中所有元素的内容,我们可以在数组名的后面添加一个“,#”(#表示数组的长度)如果我们在上面的数组名添加该后缀名就得到:。
