今天使用opencv里的mat想要保存数据里边的像素的平均值和标准差;
但是编程好了之后会出现下面的问题,不能找到pdb file 。下面将提供三种解决方法以及产生问题的原因。
程序也运行不出来,整个人都不好了。后来上贴吧和网上搜,有很多种解决办法,但是对我最用的是第1个:
方法1.首先确认是不是建立的空项目而不是win32位控制台项目,如果建立的是空项目,建议把空项目改成win32位控制台项目,问题一下子就解决了。
方法2.还有种说法是其实问题在于,在空项目中不生成调试文件pdb,所以无法调试。
要让项目生成pdb文件,需要更改:
项目属性,configuration properties->linker->Generate Debug Info 从 no 改为 yes
但这样还是不够的,还需要更改:
项目属性,configuration properties->c/c++->debug information format为/ZI
项目属性,configuration properties->c/c++->optimization为Disabled
因为为了生成这个文件,需要设定debug信息的格式并关掉O2,还要更改linker生成调试信息的开关
在运行FBX的sample程序时发现提示:debug information of xxx.exe cannot be found or not match ,于是首先在网上找了下相关资料,得到如下建议:
1) Goto Project->HelloWorld Properties
2) On the left expand "Configuration Properties"
3) Expand "C/C++"
4) On the left, Select "General"
5) On the right, change "Debug Information Format" to "Program Database For Edit And Continue (/ZI)"
5) On the left, Select "Optimization"
6) On the right, change "Optimization" to "Disabled (/Od)"
7) On the left, expand "Linker"
8) On the left, select "Debugging"
9) On the right, change "Generate Debug Info" to "Yes"
10) Click ok
11) Set your breakpoints
12) Rebuild your application
实际上按照以上操作以后,问题仍然存在,因为对Visual配置不是很熟,于是继续看其他人的文章,觉得有可能是.pdb文件的原因,因为pdb文件是Visual存储调试信息的地方,而visual在运行时确实有如下提示:
'ImportExport.exe': Loaded 'C:/Program Files/Autodesk/FBX/FbxSdk/2012.1/bin/ImportExport/win32/net2010/debug/ImportExport.exe', Cannot find or open the PDB file
即找不到pdb文件,因此无法调试。
在visual里找到pdb相关的配置选项,共2个如下:
configuration property->c/c++->output files->program database file name
这是编译时产生的pdb文件的输出位置,vs在编译后会将该位置符合$(TargetName).pdb格式的文件复制到configuration property->general的output directory目录中(不知道是哪里的设置起作用),作为运行时debug信息。不过这一pdb文件包含的信息包括类型信息,但不包括函数定义等符号信息。因此,即使每个源文件都包含公共头文件(如 <windows.h>),这些头文件中的 typedef 也只存储一次,而不是在每个 OBJ 文件中都存在(见下面的定义)。因此这个pdb文件是不足以做调试之用的。
configuration property->linker->debugging->generate program database file
这是链接时链接器产生的pdb文件的输出位置,它包含项目的 EXE 文件的调试信息。该 文件包含完整的调试信息(包括函数原型),而不仅仅是在 上一个.PDB 中找到的类型信息。
这两个 PDB 文件都允许增量更新。链接器还在其创建的 .exe 或 .dll 文件中嵌入 .pdb 文件的路径。
对照项目配置,很快发现问题所在。output files->program database file name里设置的文件名符合$(TargetName).pdb的格式,因此被复制到output directory目录中,而linker->debugging->generate program database file设置的文件名也刚好是这个位置,因此就没有被复制进来,所以“鹊巢鸠占”引起的后果是,包含完整调试信息的9mb大的pdb文件没有被如约创建,而1mb大的pdb文件被错误的复制倒了不该放的地方,自然.exe文件就找不到debug信息了。
方法3.Ctrl + F5运行就可以了。或者在cmd命令行下执行程序。或者"Microsoft Symbol Servers"勾上(Tools -> Options -> Debugging -> Symbols).
以下作为参考:
VISUAL c+中的pdb文件及其作用
程序数据库 (PDB) 文件保存着调试和项目状态信息,使用这些信息可以对程序的调试配置进行增量链接。当以 /ZI 或 /Zi(用于 C/C++)生成时,将创建一个 PDB 文件。
在 Visual C++ 中,/Fd 选项用于命名由编译器创建的 PDB 文件。当使用向导在 Visual Studio 中创建项目时,/Fd 选项被设置为创建一个名为 project.PDB 的 PDB。
如果使用生成文件创建 C/C++ 应用程序,并指定 /ZI 或 /Zi 而不指定 /Fd 时,则最终将生成两个 PDB 文件:
VC80.PDB (更笼统地说就是 VCx0.PDB,其中 x 表示 Visual C++ 的版本。)该文件存储各个 OBJ 文件的所有调试信息并与项目生成文件驻留在同一个目录中。
project.PDB 该文件存储 .exe 文件的所有调试信息。对于本机 C/C++代码,它驻留在 /debug 子目录中。对于托管代码,它驻留在 /WINDEBUG 子目录中。
每当创建 OBJ 文件时,C/C++ 编译器都将调试信息合并到 VCx0.PDB 中。插入的信息包括类型信息,但不包括函数定义等符号信息。因此,即使每个源文件都包含公共头文件(如 <windows.h>),这些头文件中的 typedef 也只存储一次,而不是在每个 OBJ 文件中都存在。
链接器将创建 project.PDB,它包含项目的 EXE 文件的调试信息。project.PDB 文件包含完整的调试信息(包括函数原型),而不仅仅是在 VCx0.PDB 中找到的类型信息。这两个 PDB 文件都允许增量更新。链接器还在其创建的 .exe 或 .dll 文件中嵌入 .pdb 文件的路径。
Visual Studio 调试器使用 EXE 或 DLL 文件中的 PDB 路径查找 project.PDB 文件。如果调试器在该位置无法找到 PDB 文件或者如果路径无效(例如,如果项目被移动到了另一台计算机上),调试器将搜索包含 EXE 的路径,即在“选项”对话框(“调试”文件夹,“符号”节点)中指定的符号路径。调试器不会加载与所调试的二进制不匹配的 PDB。