设置调试目录
问题
解决方案的配置分为release和debug版本,主要是release进行了代码优化。默认下会生成release和debug文件夹,包括编译的中间文件以及最终的生成文件。启动调试和开始运行,指定的调试或者运行的目录是不一样的,调试的时候启动的并不是debug文件夹下面的可执行程序,除非指定了调试的目录,默认情况下,是以工程目录$(ProjectDir)定义的目录为调试目录,这个是vc.proj文件所在的目录。如果程序依赖其他的文件或者dll,都必须拷贝到当前的目录下,否则执行出错。所以很自然的想到手动设置调试目录,而不是由系统指定,毕竟软件项目中依赖很多用户指定的dll
解决VS2005
在链接器常规中指定输出文件,这个时候就会以当前的目录作为调试的目录
解决VS2010 VS2012
配置属性常规中指定输出目录,这个目录是调试的时候启动程序的目录,在VS05中的
设置链接器的输出文件目录,在这里已经不起作用,所以在输出目录中指定调试程序的生成目录
解决VS2015
配置属性中链接器的常规配置项中,虽然指定了输出文件,但是这个并不是VS调试的时候,会调用的目录可执行程序,需要在调试中填写输出文件的所在目录
比如,工程中设置输出文件..\outputs\mytest.exe,在调试中的工作目录必须设置为..\outputs,然后在常规页面上填写目标文件名mytest,同时指定输出目录..\outputs\(常规页面的设置是告诉调试器去×××到exe可执行程序,然后作为程序的当前目录进行执行)
提醒
在配置属性中经常可以看到一些宏定义变量,例如:$(SolutionDir),$(ProjectDir),$(OutDir),可以通过编辑文件路径,查看宏可以看到对应的值.非常容易理解
$(SolutionDir)就是工程解决方案sln文件所在的目录
$(ProjectDir)就是vc.proj文件所在的目录,一般跟源码是同一级目录
设置调试异常触发
说明
默认情况下,VS2005,VS2010没有设置启动调试的异常触发,可在菜单调试下,选择异常,然后勾选上所有的异常中断的情况:
C++ Exceptions
Common Language Runtime Exceptions
...
作用
准确定位程序已有的问题,而不是程序崩溃直接退出
注意
用户设置的调试异常的信息,保存在.suo(Solution User Operation解决方案用户操作)文件,如果该文件没有上传到svn服务器,其他人下载代码的时候,必须重新设置调试异常的选项。如果没有进行用户的修改,默认可能不会生成.suo文件,该文件同时保存了用户的布局设置
实际应用场景中的效果
1)
在模块实现了动态加载的工程里面,能够在调用异常的时候,准确定位到异常出错的情况,一般是空指针
2)
在处理0xfeeefeee指针错误的时候,能够准确定位到错误的代码
3)
char szTestString[3600*1058*3] = {0};
实际上默认的栈只有2M的空间,上述代码超出了栈的范围导致程序崩溃,开启异常设置之后出现提示:0xC00000FD: Stack overflow
4)Run-Time Check Failure #2 - Stack around the variable 'szError' was corrupted
_TCHAR szError[32] = { 0 };
wsprintf(szError, _T("avcodec_send_packet:%d\n"), nRet);
OutputDebugString(szError);
原因:如果nRet是一个非常大的整型,会导致数组越界,从而程序崩溃提示如上
影响
现象:在使用VS2005 c++调试程序时,无法使用文件对话框打开文件,只要执行打开文件对话框,就报0x7703c54f 处最可能的异常: 0x000006BA: RPC 服务器不可用的错误。
解决方法
由于调试需要将调试菜单中的异常都打上勾,将勾都去掉,问题解决
release版本单步调试设置
场景
debug模式下自动选择已禁用 (/Od);release模式下自动选择 使速度最大化 (/O2) 。
这种速度最大化,会导致Release版本调试出现有些代码被精简掉,有些代码变量在前后之间
不一致的问题,例如传递指针,指针的地址可能会发生改变。而且在调用第三方库的时候,是没有办法获取到debug版本下的动态或者静态库,因此只能够选择release版本,本章的主要内容是如何设置在release版本下进行调试
分析
Release模式下的设置主要是应用于软件的发布,是不携带任何的调试信息,并且程序进行了优化,有的语句已经被优化掉,所以无法进行调试。所以只要关闭优化以及允许生成调试信息即可
修改
1)属性》》配置属性》》C/C++>>优化,优化选项:禁用(/Od)
优化之后的代码,有些断点调试的代码已经被编译器优化了,无法调试
2) 属性》》配置属性》》链接器》》 调试,生成调试信息:(是/DEBUG),生成程序数据库文件:$(TargetDir)$(TargetName).pdb
调试模式 当前不会命中断点 解决方案
场景
VS2017环境Debug配置调试海康ClientDemo,断点提示:
当前不会命中断点。还没有为该文档加载任何符号
解决方案
注意
VS2015生成调试没有像VS2017存在一个生成调试信息 (/DEBUG)的调试选项,因此可以填写true代替