vs 生成pdb调试

本文详细解析了Visual Studio中pdb文件的作用及配置问题,针对找不到pdb文件导致无法调试的问题,给出了具体的排查步骤和解决方案。

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信息了。

 

 

以下作为参考:

 

              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。



文章转自:http://blog.youkuaiyun.com/zkzk12345/article/details/6560545
<think> 嗯,用户的问题是关于Visual Studio中配置PDB文件生成位置的方法。根据之前的引用内容,用户已经提供了两个相关引用[^1][^2],其中引用[2]特别提到了C/C++和C#项目的配置方法。 用户可能正在开发项目时需要调试,或者遇到了调试信息缺失的问题。ta特意提到"配置生成位置",说明可能对默认路径不满,比如需要统一管理调试文件,或是多项目协作时需要规范输出路径。 从技术角度看,PDB文件配置涉及不同语言项目的差异: 对于C/C++项目,路径配置在链接器设置里更直观。引用[2]提到的$(OutDir)$(TargetName).pdb模板很实用,用户可以直接复制使用。而C#项目需要手动编辑csproj文件这点可能需要特别提醒,因为不像C++那样有可视化界面。 考虑到用户可能是中级开发者,在回答时要区分语言场景,避免混淆。同时要强调"重新生成"的必要性——单纯修改设置不重新编译是无效的。 安全提示也值得补充:PDB包含敏感调试信息,生产环境部署时通常需要分离存放。不过用户当前问题集中在开发配置阶段,这点作为补充即可。 </think> 在Visual Studio中配置PDB文件生成位置的方法因项目类型而异,以下是具体操作步骤: ### 一、C/C++ 项目配置 1. **打开项目属性** 右键点击项目 → 选择 **“属性”** 2. **进入链接器设置** `配置属性` → `链接器` → `调试` 3. **启用调试信息生成** - 在 **“生成调试信息”** 中选择 `是 (/DEBUG)` 4. **指定PDB路径** (关键步骤) - 在 **“程序数据库文件名”** 中输入自定义路径,例如: ```path $(OutDir)$(TargetName).pdb // 默认输出到生成目录 ``` - 或自定义路径:`D:\DebugSymbols\$(ProjectName).pdb` *(路径支持VS宏变量如`$(SolutionDir)`)* ![C++ PDB配置路径示意图](https://via.placeholder.com/400x200?text=C%2B%2B+PDB+%E8%AE%BE%E7%BD%AE%E7%95%8C%E9%9D%A2) ### 🔧 二、C# / VB.NET 项目配置 1. **打开项目属性** 项目右键 → **“属性”** → 切换到 `生成` 或 `编译` 标签页 2. **修改高级设置** - 点击 **“高级”** 按钮 → 找到 **“调试信息”** 3. **指定PDB路径** - 需手动编辑项目文件 `.csproj` 或 `.vbproj`: 在`<PropertyGroup>`内添加: ```xml <PdbOutputPath>D:\Symbols\</PdbOutputPath> <DebugSymbols>true</DebugSymbols> ``` *(修改后需重新加载项目)* ### 三、通用注意事项 1. **路径权限**:确保目标目录有写入权限 2. **生成操作**:修改后需 **重新生成解决方案** (非普通生成) 3. **调试依赖**:调试器默认在以下位置查找PDB: - 可执行文件同级目录 - 项目设置的输出路径 - 符号服务器路径(需额外配置) > 📌 **调试场景**:若需远程调试,需将PDB文件同步到目标设备对应路径[^2]。 --- ### ❓相关问题 1. 如何解决Visual Studio调试时提示"未加载符号"的问题? 2. PDB文件包含哪些调试信息?能否安全分发? 3. Release模式下为何仍需生成PDB文件? 4. 如何配置Visual Studio的符号服务器以实现集中调试? 5. C#项目中使用`<PdbOutputPath>`后为何未生效? [^1]: VS编译PDB文件的作用与基础配置 [^2]: C/C++与C#项目PDB路径设置方法
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值