2023年12月1日发(作者:)

解决CannotfindoropenthePDBfile问题

今天使⽤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++->optimizationDisabled

因为为了⽣成这个⽂件,需要设定debug信息的格式并关掉O2,还要更改linker⽣成调试信息的开关

在运⾏FBXsample程序时发现提⽰:debug information of 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在运⾏时确实有如下提⽰:

'': Loaded 'C:/Program

Files/Autodesk/FBX/FbxSdk/2012.1/bin/ImportExport/win32/net2010/debug/', 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->generaloutput directory⽬录中(不知道是哪⾥的设置起作⽤),作为运⾏时debug信息。

不过这⼀pdb⽂件包含的信息包括类型信息,但不包括函数定义等符号信息。因此,即使每个源⽂件都包含公共头⽂

件(如 ),这些头⽂件中的 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信息了。

⽅法 + 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 选项被设置为创建⼀个名

PDB

如果使⽤⽣成⽂件创建 C/C++ 应⽤程序,并指定 /ZI /Zi ⽽不指定 /Fd 时,则最终将⽣成两个 PDB ⽂件:

(更笼统地说就是 ,其中 x 表⽰ Visual C++ 的版本。)该⽂件存储各个 OBJ ⽂件的所有调试信息并与项⽬⽣成⽂件

驻留在同⼀个⽬录中。

该⽂件存储 .exe ⽂件的所有调试信息。对于本机 C/C++代码,它驻留在 /debug ⼦⽬录中。对于托管代码,它驻留在

/WINDEBUG ⼦⽬录中。

每当创建 OBJ ⽂件时,C/C++ 编译器都将调试信息合并到 中。插⼊的信息包括类型信息,但不包括函数定义等符号信息。因

此,即使每个源⽂件都包含公共头⽂件(如 ),这些头⽂件中的 typedef 也只存储⼀次,⽽不是在每个 OBJ ⽂件中都存在。

链接器将创建 ,它包含项⽬的 EXE ⽂件的调试信息。 ⽂件包含完整的调试信息(包括函数原型),⽽不仅仅是在

中找到的类型信息。这两个 PDB ⽂件都允许增量更新。链接器还在其创建的 .exe .dll ⽂件中嵌⼊ .pdb ⽂件的路径。

Visual Studio 调试器使⽤ EXE DLL ⽂件中的 PDB 路径查找 ⽂件。如果调试器在该位置⽆法找到 PDB ⽂件或者如果路径⽆

效(例如,如果项⽬被移动到了另⼀台计算机上),调试器将搜索包含 EXE 的路径,即在选项对话框(调试⽂件夹,符号节点)中指

定的符号路径。调试器不会加载与所调试的⼆进制不匹配的 PDB