一文搞懂C#工程中程序数据库文件.pdb(符号文件)的作用,延伸搞懂Debug/Release、AnyCPU(首选32位)/x86/x64/ARM的区别

news2024/9/25 13:23:28

一、准备工作


MS引用:在 Visual Studio 调试器(C#、C++、Visual Basic、F#)中指定符号 (.pdb) 和源文件

MS引用:为 C#、ASP.NET 或 Visual Basic 项目 (.NET Framework) 生成符号文件

MS引用:用于控制编译器输出的 C# 编译器选项


1、首先,我们需要一个控制台程序,代码很简单,ConsoleApp1控制台程序在主程序中,调用ClassLibrary1类库中Class1下的Do方法,如下:

2、生成AnyCPU或任意目标平台,代码的目录结构如下:

3、然后在bin/Debug目录下,双击运行控制台程序,按照代码逻辑,程序堆栈会停在“Console.ReadLine();”这一行;

4、(验证正常调试过程.pdb的用处)打开VS,通过“继续但无需代码”进入,选择“调试”-“附加到进程”,输入程序集名称,找到该进程,选择“附加”;

 5、附加进程ok后,点击调试的“全部中断”,看到断点停留在了“Console.ReadLine();”这一行:

二、移除.pdb会如何

 6、保持程序状态,需要做的是:

①将“..\bin\Debug\ConsoleApp1.pdb”重命名为“ConsoleApp1_Temp.pdb”

②将“..\obj\Debug\ConsoleApp1.pdb”重命名为“ConsoleApp1_Temp.pdb”

(obj下的是源.pdb文件,bin中的是源.pdb文件的副本;同样obj和bin下的exe也是如此;此处可以去了解下编译的过程,是先生成obj下的内容,再将运行时需要的文件拷贝到bin下)

(编译时,.pdb的路径会在被记录在exe程序中,这也是为什么要做②的原因)

7、VS重新进行附加进程,点击“全部中断”,会得到“处于中断模式”的结果,但由于缺少.pdb所以无法定位具堆栈:

 三、移除本地代码会如何

7、保持程序状态,恢复在步骤6中所做的,对obj和bin下.pdb的重命名,然后需要做的是:

①将源代码文件“Program.cs”重命名为“Program_Temp.cs”

8、VS重新进行附加进程,点击“全部中断”,会得到“未找到源”的结果,能够在“局部变量”和“调用堆栈”选项卡中看到内容,却没有对应源代码定位:

 四、总结

        首先,为什么选择附加到进程,而不是在工程中将“活动解决方案平台配置”设置为“Debug”进行启动?

——Debug模式每次启动时,obj下的源.pdb会默认生成,并拷贝到bin输出目录中。

        实际上述步骤,更加接近的是在“生产环境下使用.pdb加上源码进行调试”的场景。


五、拓展——Debug和Relase的区别

五-一、正常调试Relase

1、右键“ConsoleApp1”工程-“属性”-“生成”-“高级”;

2、在默认情况下,将“配置”设置为Debug和Relase时,我们能看到的区别在于优化编码这一项,Debug时默认“不选中”即“不优化编码”;Release时默认“选中”即“优化编码”。

3、此时,按上述流程同样对Relase下的exe进行调试,会得到提示,并选择“继续调试”:

 4、点击“全部中断”,并不会命中当前堆栈“Console.ReadLine();”这一行,且“局部变量”和“调用堆栈”标签页中并无内容。

 五-二、取消“优化编码”调试Relase

        不再贴图,直接放出结果,如同我们调试Debug一样

五-三、结论

        Debug和Relase在使用VS调试时,主要区别在于是否进行了“优化编码”(实际上即使配置完全一致,对比16进制仍会返现两者不尽相同,比如生成时间戳、代码段地址)。

        而优化导致的结果,个人理解就是:

是否能够通过.pdb和源码,在正常的生产环境中,附加到进程并命中断点,即是否支持实时调试。

 

六、拓展——AnyCPU(首选32位)/x86/x64/ARM的区别

(以下引用MS原文)        

PlatformTarget

指定 CLR 的哪个版本可以运行程序集。

XML复制

<PlatformTarget>anycpu</PlatformTarget>
  • anycpu(默认值)将程序集编译成可在任意平台上运行。 您的应用程序将尽可能作为 64 位进程运行;当只有 32 位模式可用时,才会回退到 32 位。
  • anycpu32bitpreferred 将程序集编译成可在任意平台上运行。 在同时支持 64 位和 32 位应用程序的系统上,您的应用程序将以32 位模式运行。 只能为面向 .NET Framework 4.5 或更高版本的项目指定此选项。
  • ARM 将程序集编译成可以在具有高级 RISC 计算机 (ARM) 处理器的计算机上运行。
  • ARM64 编译程序集以在由 64 位 CLR 在具有支持 A64 指令集的高级 RISC 计算机 (ARM) 处理器的计算机上运行。
  • x64 将程序集编译成可由支持 AMD64 或 EM64T 指令集的计算机上的 64 位 CLR 运行。
  • x86 将程序集编译成可由 32 位、x86 可兼容 CLR 运行。
  • Itanium 将程序集编译成可由配有 Itanium 处理器的计算机上的 64 位 CLR 运行。

在 64 位 Windows 操作系统上:

  • 用 x86 编译的程序集将在 WOW64 下运行的 32 位 CLR 上执行。
  • 用 anycpu 编译的 DLL 将在加载它的进程所在的同一 CLR 上执行。
  • 用 anycpu 编译的可执行文件将在 64 位 CLR 上执行。
  • 用 anycpu32bitpreferred 编译的可执行文件将在 32 位 CLR 上执行。

anycpu32bitpreferred 设置只对可执行文件 (.EXE) 有效,并且需要 .NET Framework 4.5 或更高版本。 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ASP.NET动态Web开发技术第6章续

第6章续ASP.NET内置对象一.预习笔记 1.ASP.NET提供了七大内置对象&#xff0c;Page、Request、Response、Application、Session、Server和Cookies。这些对象使用户更容易收集通过浏览器请求发送的信息、响应浏览器以及存储用户信息&#xff0c;以实现其他特定的状态管理和页面…

【动力节点】杜老师Vue笔记——Vue程序初体验

目录 一、Vue程序初体验 1.1 下载并安装vue.js 1.2 第一个Vue程序 1.3 Vue的data配置项 1.4 Vue的template配置项 一、Vue程序初体验 可以先不去了解Vue框架的发展历史、Vue框架有什么特点、Vue是谁开发的&#xff0c;对我们编写Vue程序起不到太大的作用&#xff0c;…

云HIS源码 基层卫生健康云HIS源码

云HIS全称为基于云计算的医疗卫生信息系统&#xff08;Cloud-BasedHealthcareInformationSystem&#xff09;&#xff0c;是运用云计算、大数据、物联网等新兴信息技术&#xff0c;按照现代医疗卫生管理要求&#xff0c;在一定区域范围内以数字化形式提供医疗卫生行业数据收集、…

正版软件 Directory Opus 12 Pro Windows 平台上的资源管理器,定是功能完全、可定制化程度高的那款。

Directory Opus 是一款 Windows 平台上的资源管理器&#xff0c;定是功能最完全、可定制化程度最高的那款。你可以通过它完成几乎所有操作&#xff0c;包括查看图片元信息、预览图片、阅读文本文件内容、批量重命名、操作压缩文件以及 FTP 同步请求等。 Directory Opus 是一款由…

QGIS数据可视化学习笔记00——为什么用QGIS以及QGIS设置中文界面

一、为什么用QGIS&#xff1f; 1、qgis的概念 qgis原称Quantum GIS&#xff0c;是开源的桌面地理信息系统软件。 qgis是一款桌面版gis软件&#xff0c;他是基于qt平台使用c开发出来gis软件。 2、qgis的主要特点 1.支持多种GIS数据文件格式 2.集成或支持其他开源GIS&#…

rust的并发以及kv server网络处理和网络安全部分

理解并发和并行 Golang 的创始人之一&#xff0c;对此有很精辟很直观的解释&#xff1a;并发是一种同时处理很多事情的能力&#xff0c;并行是一种同时执行很多事情的手段。 我们把要做的事情放在多个线程中&#xff0c;或者多个异步任务中处理&#xff0c;这是并发的能力。在多…

postman同时传递文件和对象参数

属性 required true 意思为 必填对象属性 /*** descroptions: 再保临分请求* author: c* date: 2023/1/9 14:26* version: 1.0*/public class UwReinsureReportReqDTO extends BaseInfoReqDTO implements Serializable {private static final long serialVersionUID -59047…

No message available问题解决

概述 在EFK日志查询平台断断续续看到若干个应用的报错信息&#xff1a; 排查 上述截图里报错的类&#xff08;省略掉Import语句后&#xff09;&#xff1a; Slf4j RestController public class FilterErrorController extends BasicErrorController {public FilterErrorC…

Pytorch安装与测试

1.Anaconda安装 官方网址:www.anaconda.com 找到anaconda的历史安装版本,我安装的是此版本 一直使用默认安装下来即可 1.1安装下来打开终端&#xff0c;创建python环境 1.2创建完成后 创建完成后&#xff0c;通过pip list发现没有torch 2.pytorch安装 进入pytorch官网:PyTor…

C语言 字符串解析strchr/strrchr/strtok//strtok_r函数使用

在程序中&#xff0c;解析用户输入的参数&#xff08;命令行参数&#xff09;是很常见的操作&#xff0c;本文将讲解C语言中常见的一些解析字符串函数使用方法。 1 strchr 1.1 描述 strchr() 用于查找字符串中的一个字符&#xff0c;并返回该字符在字符串中第一次出现的位置…

【数学知识】一文学会算法中的数学知识(1.1)

目录 一.数论 1.质数 (1)质数的判断 (2)分解质因数&#xff08;数几个质数相乘&#xff09; (3)求1-n的所有质数 2.约数 (1)试除法求所有约数 (2)约数个数和约数之和 (3)最大公约数&#xff08;欧几里得算法 &#xff09; 一.数论 1.质数 在大于1 的整数&#x…

全回显SSRF测试两则

之前遇到可回显SSRF&#xff0c;并没有怎么去深入&#xff0c;可能漏洞点支持file协议更偏向于任意文件读取&#xff0c;不会去思考可回显SSRF的深入利用&#xff1b;直到读了pmiaowu师傅的可回显SSRF直接搭建成了代理进行内网渗透&#xff0c;后面遇到了两个可回显SSRF&#x…

【Kafka】Kafka为什么快?

Kafka之所以快的原因有三个&#xff1a;顺序读写、页缓存、零拷贝。 顺序读写 Kafka依赖磁盘来存储和缓存消息。 在我们的印象中&#xff0c;磁盘的读写速度会比内存的读写速度慢&#xff0c;但这是在随机读写场景下的比较。 实际上&#xff0c;磁盘的顺序读写能力不容小觑&am…

Spring IoC注解开发

Component 组件 Controller 控制器 Service 业务 Repository 仓库 其实他们四个本质都一样&#xff0c;只不过另外三个是Component的别名&#xff0c;在不同层使用容易区分 首先需要加入aop依赖&#xff0c;如果你事先加入spring-context依赖&#xff0c;则会关联加入ao…

亚马逊、temu、速卖通、国际站卖家如何利用好测评补单这张王牌?

大家好我是亚马逊测评珑哥。 现在越来越多的跨境电商平台入局&#xff0c;目前跨境电商平台亚马逊、TEMU、ozon、ebay、wish、lazada、敦煌、shopee、速卖通、poshmark、阿里国际站、沃尔玛、newegg、美客多等跨境平台的卖家都在递增&#xff0c;大家都知道&#xff0c;随着各…

javaEE 初阶 — 第一个 servlet 程序

文章目录 Servlet 是什么第一个 Servlet 程序1 创建项目2 引入依赖3 创建目录结构4 代码编写5 打包程序6 部署7 验证 如何使用 tomcat 插件打包及部署1 什么是插件2 插件的安装3 插件的使用4 可能会出现的问题 Servlet 是什么 Servlet 是一种实现 动态页面 的技术&#xff0c;是…

DataX和MongoDB之间的数据导入导出案例

DataX和MongoDB之间的数据导入导出案例 文章目录DataX和MongoDB之间的数据导入导出案例0. 写在前面1. MongoDB前置知识1.1 基础概念详解1.1.1 数据库1.1.2 集合1.1.3 文档&#xff08;Document&#xff09;2. DataX 导入导出案例2.1 读取 MongoDB 的数据导入到 HDFS2.1.1 编写配…

模板的分离编译

目录 &#xff1a; 1.分离编译概念 2.模板是不支持分离编译的 3.报链接错误的原因 4.如何解决 ----------------------------------------------------------------------------------------------------------------------- 1.分离编译概念 一个程序由若干个源文件共同实现&a…

java版工程项目管理系统源码 Spring Cloud+Spring Boot+Mybatis+Vue+ElementUI+前后端分离 功能清单

ava版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下&#xff1a; 首页 工作台&#xff1a;待办工作、消息通知、预警信息&#xff0c;点击可进入相应的列表 项目进度图表&#xff1a;选择&#xff08;总体或单个&#xff09;项目显示1…

Eureka单机搭建

Eureka简介 Eureka Spring Cloud Eureka 是Netflix 开发的注册发现组件&#xff0c;本身是一个基于 REST 的服务。提供注册与发现&#xff0c;同时还提供了负载均衡、故障转移等能力 Eureka3个角色 服务中心&#xff0c;服务提供者&#xff0c;服务消费者 Eureka Server&a…