VS大型CPP项目调试,Debug模式,Release模式,附加到进程模式

news/2025/3/11 2:54:16/文章来源:https://www.cnblogs.com/caibucai/p/18759437

visual studio

项目一览

以开源项目 cloudcompare 为例,一个大型项目 肯定会有很多模块,每个模块 根据需求 生成 dll 库 或者 lib 库

image-20250308142049088

主程序

image-20250307172029745

dll 库

image-20250307172951873

lib库

image-20250307173140957

debug 模式调试

编译生成,运行

image-20250307174057596

提示找不到 运行依赖的dll

查找相应项目库的路径

image-20250307174336840

可以看到是已经编译生成了的

只不过 和我们的 exe 不在同文件夹下

此时 我们可以选择安装,或者调整输出目录

中间目录输出

先看一下xx.dir/[debug/release] 下有什么

image-20250307174755839

日志 以及 .obj 文件

方案A 安装法

image-20250307194304089

安装后我们的exe 以及需要的 dll 在同一文件夹下,如下

image-20250307194629239

此时如果调试,会发现仍然启动不了,找不到dll,我们修改调试路径

image-20250308153714390

然后就可以了

方案B 调整输出目录

【另外一种方案 修改各种 dll lib 输出到 和 exe 同级,

普通操作,在vs 里面 一个个修改模块 输出目录 和 中间目录

高级操作(来自deepseek 未测试),在.vcxporj 中修改 deepseek

<!-- 在 .vcxproj 文件中添加 -->
<Target Name="PostBuild" AfterTargets="PostBuildEvent"><Exec Command="xcopy /Y /S "$(TargetPath)" "D:\02-ide\cc_StarEdge\CloudCompare_debug\"" />
</Target>

开始调试

然后 点击debug 调试

image-20250307200743739

在主程序 和 dll 库 打断点 测试

主程序 debug

image-20250307201229923

成功断住

image-20250307201800055

下一行 是 CCAppCommon dll库里面的内容, 断点进入

image-20250307202026171

image-20250307202058826

可以看到 我们由 .exe 进入到 .dll中 此时 就可以调试dll 文件了

可以调试的原因 是 因为 在 debug 模式下 dll 也生成了 pdb 这个pdb可以被加载

【我们使用的dll 是安装目录下的 dll pdb 是在build 目录下 被加载,要保持版本一致,dll 变化了 pdb 也要对应更新(自动),此时要把新的 dll 安装到 安装目录下 保持一致 否则 会提示 符号未加载】

image-20250307174336840

针对 pdb 在 debug下自动生成 验证测试

为了验证 我们删除 pdb 文件 再次debug 看看是否能断住 【信我,我真的删了】

image-20250307203746099

针对 符号未加载原因 测试验证

有时候可能是 DLL 和 .pdb 编译版本不同

测试验证

向 dll 代码 新添加了 一行 此时进行编译 但未进行安装

image-20250307210359288

更新前 时间 20:35

image-20250307210501184

更新后 21:05

image-20250307210540899

image-20250307210602741

未安装,此时启动 是否能断住

image-20250307210707148

没有断住 直接启动成功

我们重新安装后,再测试 是否断住

image-20250307210837266

image-20250307210905312

结果:成功断住!!!

小结

使用这种 在 安装目录下调试 修改代码后 要重新安装 更新相关dll lib 保证调试加载的pdb 和实际使用的 dll lib 版本一致

最佳实践 应该是 编译更新后 自动将 新dll 安装到 安装目录下 ,也是我们省略的另一种方案实现,不展示使用这种方案的原因之一是,有时候 比较多dll lib 需要逐一修改,没有尝试过自动化实现

以上操作都是 在debug 模式下 完成

release 模式调试

release vs debug 配置区别

为什么会出现这个需求,原因就是 加载更快,观察对比 release 和 debug 配置的区别

cpp_debug

根据上面的区别 我们需要把选项一一打开

  1. C/C++ --> 常规 调试信息格式设置为“程序[数据库(/Zi)
  2. C/C++ --> 优化 ,将右侧优化设置为 已禁用
  3. 选择链接器 --> 调试,将右侧生成调试信息 设置为 是

未启用 选项

首先 在不打开 尝试 运行调试

可以看到 依然提示找不到 依赖的dll ,此时还是和上面一样的方案

  1. 安装
  2. 调整输出目录

仍然以 安装 方案 展示

image-20250308112855074

image-20250308112945970

release 安装 【文件夹后缀没有_debug 以及 dll 没有 d 标志】

继续 设置调试路径在 release 安装目录下

image-20250308113137672

开始调试

断点

image-20250308113231145

尝试点击 运行

image-20250308113323444

提示不会命中,程序直接启动 不会断住,

原因就是 在 release 没有 生成 pdb 文件

cpp_debug_release_vs_debug_pdb_generate

启用 选项

此时 我们 打开主程序项目 上面提到的开关

  1. C/C++ --> 常规 调试信息格式设置为“程序[数据库(/Zi)
  2. C/C++ --> 优化 ,将右侧优化设置为 已禁用
  3. 选择链接器 --> 调试,将右侧生成调试信息 设置为 是

我真的打开了

打开后 点击运行

image-20250308113854046

可以看到 vs 在重新生成 pdb 文件

此时 程序依然直接 运行 没有断住

image-20250308114341400

image-20250308114152361

已经生成了 pdb 文件,why

原因就是我们的 安装目录 dll 和 新生成 pdb 不一致,也就是 你忘记了 重新 安装 同步

重新安装后 就可以了

image-20250308114446641

以上这种方式 适合 主程序相关的调试 是无法进入 依赖的 dll 进行调试的

dll 项目 启用 选项

可以看到 我们无法单步进入了 ,原因是 release下 , dll 没有 生成pdb ,那该如何做,就是对 dll 项目 重复执行 这三步

  1. C/C++ --> 常规 调试信息格式设置为“程序[数据库(/Zi)
  2. C/C++ --> 优化 ,将右侧优化设置为 已禁用
  3. 选择链接器 --> 调试,将右侧生成调试信息 设置为 是

image-20250308122023263

然后重新安装 就可以 调试 dll 项目的代码了

image-20250308122141499

成功进入断住

附加到进程调试

这种场景 特别适用我们提供的代码 封装成dll 给别人调用,有问题调试时,别人把主程序发你 ,然后你就可以用这种方式进行调试

这里 我们 演示 一个插件调试的案例

首先我们要明确 我们有什么

  1. 别人提供的 主程序 exe
  2. 我们开发的 算法dll 工程 / 源码 也就是说 我们是可以生成 pdb 文件(dll 形式提供给别人用)

这种情况 不要从 vs 中运行项目,而是从安装目录下启动项目

启动后,可以看到 这里的pca 就是我们的 提供给别人的算法dll

image-20250308140337682

我们的 dll 工程,并已经打上断点

image-20250308140730726

附加到进程

image-20250308140900355

找到我们运行的 exe 进程【从 vs 启动 这里是灰色 无法选中】

image-20250308141008106

点击 附加 按钮,就启动了调试模式

然后点击前端 算法dll提供的按钮

cpp_debug_attach_to_proccess

可以看到 右侧成功断住

然后你就可以 快乐 debug了

总结

  1. 无法直接启动成功 提示 dll 找不到,要么进行安装 将dll 和 exe 放在一起,要么手动调整 各个模块的 输出目录(没有实现自动化,感觉有点麻烦,如果有自动化方法 欢迎交流),并调整 调试目录

  2. debug 模式下 自动生成 pdb , 但如果采用安装 记得 每次都要重新安装,否则会提示 符号未加载,无法命中断点

  3. release 模式下 启用 三个选项 后 可以生成 pdb 然后重新安装更新,就可以正常调试了

  4. 附加到进程调试, 特别适用于 仅dll 项目开发场景 调试,但是需要提供主程序,同时也需要pdb【好像原因是 生成的dll记录了dll源码的绝对路径,然后调试时 可以找到dll源码】

  5. 注意!!!注意!!!注意!!!当提示 符号未加载,无法命中断点 ,很有可能就是 你修改代码 后 dll 和 pdb 不一致【特别是在 使用安装方式 情况下 不要慌 重新安装即可】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/895534.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ARC191 ~ 193 题解

ARC191 题解 A - Replace Digits简要题意给定一个长为 \(n\) 的字符串 \(a\)。\(m\) 次操作,第 \(k\) 次给定一个字符 \(b_k\),你需要选择一个 \(i \in [1, n]\) 并将 \(a_i\) 替换成 \(b_k\)。 求最后能得到的所有字符串中,字典序最大的是什么。 \(1 \leq n, m \leq 10^6\)…

物理机安装archLinux

从官网下载镜像并通过up启动成功联网后 一、基础配置 1.设置时间 查看时间 timedatectl status 如果时间不对 timedatectl set-ntp true 如果时区不对 timedatectl set-timezone Asia/Shanghai2.磁盘分区 对于 UEFI 需要至少创建三个分区(efi、swap、根)格式化分区 根分区mk…

Maven踩坑记录与反思

本次事件的发生是在我来到一个新的技术初创团队,由于团队中的前同事与我交接代码时候,关于Maven私服这块的账号密码为给我,导致一系列的爱恨情仇。事件的持续花费两天时间进行解决,现在总结一下遇到的问题与解决思路!回顾Mavenue的背景 关于Maven,维基百科给的解释主要有…

解决pyechart模块绘制地图无数据

在绘制地图发现没有数据错误原因: 传入数据中的省份名称不规范 例如: data = [("北京", 99),("上海", 199),("湖南", 299),("台湾", 399),("广东", 499) ]解决办法: 使用此函数,把传入地图的数据传入函数进行处理(返回规…

2025.3.8 考试记录

省流:炸完了!!! 7:35 开考,7:37开始看题。 先看一眼题,没有 DS ,那完了。 按照惯例先试着冲一下 T1 。 有点像二分图最大匹配的题,记不住怎么建图了,睡觉。 T2 是个树上最优解问题,似乎可以冲?先放在一边等着吧。 T3 是序列上的一个问题,序列上的找一个区间 min …

Ubuntu24.04安装Cherry Studio记录

1. 官网下载安装包 在Cherry Studio官网获取Appimage安装包 2. 修改运行权限 下载结束后终端输入chmod 777 AppImage文件路径修改Appimage文件权限为可执行文件。 3. 下载FUSE 直接运行./Cherry-Studio-1.0.6-x86_64.AppImage,发现类似报错:Need to install FUSE 打开FUSE的G…

两块滤膜

“部长通道”上,生态环境部部长掏出了两块滤膜 央视一套2025年03月08日 14:53 北京 ⇧点蓝色字关注“央视一套” 今天(8日),第十四届全国人民代表大会第三次会议第二场“部长通道”集中采访活动举行。生态环境部部长黄润秋、水利部部长李国英、农业农村部部长韩俊接受了媒体…

Windows编程----进程:环境变量

什么是系统环境变量 每台计算机针对当前用户和系统中所有用户分别提供了两个环境变量设置,通过计算机属性>环境变量的界面,我们可以查看当前这台计算机上的所有环境变量,这些环境变量都是key-value键值对。具体如下:上面看到的环境变量其实是存储在注册表中的, 系统环境…

软工作业二:个人项目

| 这个作业属于哪个课程 | 软件工程 | | 这个作业要求在哪里 | 作业要求 | | 这个作业的目标 | 设计一个论文查重算法,给出一个原文文件和一个在这份原文上经过了增删改的抄袭版论文的文件,在答案文件中输出其重复率。 | 一、使用说明📝 1.使用环境:c++;Visual studio 20…

[T.1] 团队项目:团队成员介绍

组一辈子杰队项目 内容这个作业属于哪个课程 2025年春季软件工程(罗杰、任健)这个作业的要求在哪里 [T.1] 团队项目:团队成员介绍我在这个课程的目标是 学习软件工程理论与实践,完成一款高质量的软件项目这个作业在哪个具体方面帮助我实现目标 确定分工,团队破冰,初步确定…

阿里二面:10亿级分库分表,如何丝滑扩容、如何双写灰度?阿里P8方案+ 架构图,看完直接上offer!

本文的 原始地址 ,传送门 本文的 原始地址 ,传送门 尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50+)中,最近有小伙伴拿到了一线互联网企业如阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格,遇到很多很重要的面试题:每天新增100w订单,如何的分库分表? 1…

递归?动态规划?几道题帮你理清楚基本思路!—— 一维动态规划解析

动态规划定义 动态规划(Dynamic Programming,简称 DP)是解决最优化问题的一种重要算法思想。它通过将原问题分解为多个子问题,逐步求解子问题,最终合并子问题的解来解决原问题。动态规划在解决具有重叠子问题和最优子结构性质的问题上非常高效,常用于路径规划、背包问题、…