VS调试方式
一、使用ANSI C标准预定义宏
C标准指定了一些预定义宏,编程中常常用到。
__DATE__ 进行预处理的日期
__FILE__ 代表当前源代码文件名的字符串
__LINE__ 代表当前源代码文件中行号的整数常量
__STDC__ 设置为1时,表示该实现遵循C标准
__STDC_HOSTED__ 为本机环境设置为,否则设为0
__STDC_VERSION__ 为C99时设置为199901L
__TIME__ 源文件的编译时间
__func__ C99提供的,为所在函数名的字符串
对于__FILE__,__LINE__,__func__这样的宏,在调试程序时是很有用的,因为你可以很容易的知道程序运行到了哪个文件的那一行,是哪个函数.
二、使用断言
三、使用异常和返回值
GetLastError
在Visual C++ 中,可以在监视窗口添加 $err,hr 一行来实时显示错误。调试过程中,该项相当于在每次调用API函数之后调用GetLastError函数。其值由两部分组成,一个是错误代码(十六进制),另一个是错误代码所对应的文本提示。该方法支持多语言。
四、使用跟踪语句与日志
只在MFC的情况下使用
在MFC中,你可以使用TRACE和AfxOutputDebugString宏、CObject::Dump虚拟函数和AfxDumpStack函数。TRACE宏由AfxDump实现,AfxDump由AfxOutputDebugString实现。AfxOutputDebugString宏和AfxDumpStack函数可以在所有版本中编译,其他只能在调试版本中编译。
五、异常的定位与调试
定位程序在某句出问题的最快的方式就是使用断点。
断点包括位置断点、条件断点、命中次数、筛选器、命中条件、数据断点
六、VS调试输出窗口
内存窗口、模块窗口、线程窗口等
七、VS在Release下的调试
1.工程项目上右键 -> 属性、
2.c++ -> 常规 -〉调试信息格式 选 程序数据库(/Zi)或(/ZI), 注意:如果是库的话,只能(Zi)
3.c++ -> 优化 -〉优化 选 禁止(/Od)
4.连接器 -〉调试 -〉生成调试信息 选 是 (/DEBUG)
下表描述了这些选项。
-
None
-
不产生任何调试信息,因此编译较快。
-
/Z7
-
生成包含用于调试器的完整符号调试信息的 .obj 文件。符号调试信息包括变量的名称和类型以及函数和行号。不会生成任何 .pdb 文件。
对于第三方库的发布者,不生成 .pdb 文件是一个优点。但是,在链接和调试期间,用于预编译头的 .obj 文件是必需的。如果 .pch 对象文件中只有类型信息(没有代码),则还必须使用 /Yl(为调试库插入 PCH 引用)进行编译。
-
/Zi
-
产生包含用于调试器的类型信息和符号调试信息的程序数据库 (PDB)。符号调试信息包括变量的名称和类型以及函数和行号。
类型信息放置在 .pdb 文件而不是 .obj 文件中。
可以将 /Gm(启用最小重新生成)和 /Zi 结合使用,但使用 /Z7 编译时不能使用 /Gm。
使用 /Zi 和 /clr 编译时,DebuggableAttribute 属性将不会被放入程序集元数据中;如果要使用该属性,则必须在源代码中指定它。该属性可影响应用程序的运行时性能。有关 Debuggable 属性如何影响性能以及如何减轻性能影响的更多信息,请参见令映像更易于调试。
-
/ZI
-
以支持“编辑并继续”功能的格式产生如上所述的程序数据库。如果想使用“编辑并继续”调试,则必须使用此选项。因为大多数优化与“编辑并继续”不兼容,所以使用 /ZI 会禁用代码中的所有
#pragma optimize
语句。/ZI 会导致在编译中使用 /Gy(启用函数级链接)。
/ZI 与 /clr(公共语言运行库编译)不兼容。
找到VS 2010中的远程调试工具的目录。可以从开始中找到VS 2010,再选择“Visual Studio Tools”- "Visual Studio 2010 Remote Debugger"。此时会打开该工具的目录
调试的软件是32位的程序,压缩一下,传给被调试的机器上,启动远程调试软件msvsmon.exe程序。打开远程调试软件的配置对话框,“工具-选项”。
这里我只说几个要值得注意的地方
1、附加进程调试又分为两种:(1)Window身份验证远程调试 (2)匿名远程调试
- Windows身份远程调试在调试主机上VS里的附加进程要用默认模式,这里请注意不要被远程模式的字面意思欺骗了,“远程(无身份验证时仅限本机)”这个模式实际上指的是匿名远程调试需要输入被调试的主机名和端口号
- Windows身份验证远程调试必须要在调试机和被调试机上使用相同用户名和密码的Windows账户,这样做是为了验证调试机的身份。
- 将远程调试作为被调试机的服务可以免除“Windows身份验证远程调试必须要在调试机和被调试机上使用相同用户名和密码的Windows账户”这个限制,因为在设置windows服务的时候会要求输入允许进行调试的机器的登录名和密码,只要调试者在他的系统上使用该用户名和密码就可以使用远程调试。
- 直接远程调试只支持Visual Studio 远程调试器上的windows身份验证调试模式,不支持将远程调试作为被调试机的服务和匿名远程调试
- 使用匿名远程调试有个问题,附加进程上的被调试机进程没有用户名,导致VS上设置的断点全不起作用,感觉匿名远程调试如同虚设.....至今没有找到解决办法........
- 使用匿名远程调试的时候如果在msvsmon上没有选择“允许任何用户进行调试”复选框,那么仍然有:“调试机和被调试机上使用相同用户名和密码的Windows账户”这个限制,但是就算是在匿名远程调试下使用相同的用户名和密码你还是会发现附加进程里出现的被调试机进程还是没有用户名,这仍然说明设置断点不起作用
2、设置
前提条件:
调试机和被调试机都在一个局域网内,且必须在一个网段
调试机和被调试机必须登录相同的用户,用户名必须一直
关闭防火墙或打开相应的端口,一般是4015
调试机和被调试机的本地安全策略中的网络访问必须改为“经典,本地用户以自己的身份验证”,路径为控制面板->用户管理->本地安全设置->本地策略->安全选项->网络访问
调试方法:
至此有2种调试方法:一种是匿名调试,无需验证,一种是Window身份验证调试:
匿名调试:
1.被调试机的msvsmon下选择工具->选项,点击无身份验证模式(只限本机)
2.之后可以看到主机名和IP,一般是hostname:4015的形式
3.调试机打开VS,选择附加到进程
4.传输选择远程(无身份验证时仅限本机)
5.限定符选择hostname:4015,之后刷新就可以看到进程列表了
Window身份验证调试:这种方法需要调试机和被调试机的用户名和密码完全一致
1.被调试机的msvsmon下选择工具->选项,点击windows身份验证
2.调试机打开VS,选择附加到进程
3.传输选择默认
4.限定符选择username@:hostname,之后刷新就可以看到进程列表
九、捕捉异常信息进行定位
SetUnhandledExceptionFilter / MiniDumpWriteDump
参考链接:
1、http://baike.baidu.com/link?url=8phgcbAy8dAy4MPJqMbHA9ml0BX2uAEfiPMW_Tky7MZrIH-toPLdm9PfApdvpD3xCy01KoYuXOkQAV7D_fp5GK
2.http://blog.csdn.net/hellochenlian/article/details/11895213
3.http://www.cnblogs.com/OpenCoder/archive/2010/02/17/1668983.html
4.http://www.cnblogs.com/cswuyg/archive/2013/07/22/3207576.html
5.http://blog.sina.com.cn/s/blog_7a2d82980101l698.html
6.http://blog.csdn.net/blackboyofsnp/article/details/7218488