第十六章 调试及安全性(In .net4.5) 之 调试程序
1. 概述
本章内容包括 如何选择合适的构建类型、创建和管理编译指令、管理程序数据文件(pdb)和指令。
2. 主要内容
2.1 构建类型
.net中默认的两种生成模式是 发布(Release)模式 和 调试(Debug)模式。
2.2 创建和管理编译指令
① 预编译指令:C#中的预编译指令,用于在编译过程中调整逻辑。
public void DebugDirective()
{
#if DEBUG
Console.WriteLine(“Debug mode”);
#else
Console.WriteLine(“Not debug”);
#endif
}
* DEBUG 指令是系统自带的,用户还可以使用#define来自定义预编译指令。使用自定义预编译指令会降低程序的可读性,一般不建议使用。
预编译指令比较常见的一个应用场景是 编写一个面向多平台的类库时。
public Assembly LoadAssembly<T>()
{
#if !WINRT
Assembly assembly = typeof(T).Assembly;
#else
Assembly assembly = typeof(T).GetTypeInfo().Assembly;
#endif return assembly;
}
系统自带的预编译指令还有:#undef, #warning, #error, #line, #pragma.
#warning This code is obsolete #if DEBUG
#error Debug build is not allowed
#endif
#line 200 “OtherFileName”
int a; // line 200
#line default
int b; // line 4
#line hidden
int c; // hidden
int d; // line 7
#pragma warning disable 0162, 0168
int i;
#pragma warning restore 0162
while (false)
{
Console.WriteLine(“Unreachable code”);
}
#pragma warning restore
想要只在调试模式执行特定的方法,除了#ifdebug之外,还可以用 ConditionalAttribute。
[Conditional(“DEBUG”)]
private static void Log(string message)
{
Console.WriteLine(“message”);
}
DebuggerDisplayAttribute 可用于在调试模式按指定的格式输出字符串。
[DebuggerDisplay(“Name = {FirstName} {LastName”)]
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
2.3 管理程序数据文件和符号
编译程序时,可以选择创建一个程序数据文件(.pdb),这个文件中保存了一些对调试有用的附加信息。
一个pdb文件包含两部分信息:① 源程序文件名和行号;② 本地变量名。
* 可以使用微软提供的Microsoft Symbol Server来解决系统pdb文件缺失的问题。
* 可以使用Team Foundation Server(TFS)来创建自己的Sympol Server,这样就可以在没有源码的情况下调试各个版本的程序。
* 建议将每次编译好的pdb文件都保存下来。发布到公共位置时,可以使用PDBCopy工具来移除PDB文件中的私有信息。
pdbcopy mysymbols.pdb publicsymbols.pdb –p
3. 总结
① Visual Studio的构建配置功能可以用来配置编译器。
② 用debug模式生成的程序,是没有经过代码优化的,包含额外的调试信息。
③ 用release模式生成的程序,是经过代码优化的,可以发布到生产环境。
④ 编译指令可以给编译器提供额外的说明信息。可以用来在特定的生成模式引入代码或者发出警告。
⑤ 一个PDB文件包含在调试时需要用到的附加信息。
第十六章 调试及安全性(In .net4.5) 之 调试程序的更多相关文章
- 第十五章 调试及安全性(In .net4.5) 之 管理程序集
1. 概述 本章将介绍 什么是程序集.如何强命名程序集.如何把程序集放入GAC.程序集版本 以及 WinMD程序集. 2. 主要内容 2.1 什么是程序集 程序集(Assembly)概念的出现,是为了 ...
- 第十四章 调试及安全性(In .net4.5) 之 对称及非对称加密
1. 概述 本章内容包括:对称及非对称加密算法..net中的加密类.使用哈希操作.创建和管理签名认证.代码访问权限 和 加密字符串. 2. 主要内容 2.1 使用对称和非对称加密 ① 对称加密:使用同 ...
- 第十三章 调试及安全性(In .net4.5) 之 验证程序输入
1. 概述 本章介绍验证程序输入的重要性以及各种验证方法:Parse.TryParse.Convert.正则表达式.JavaScriptSerializer.XML Schemas. 2. 主要内容 ...
- 第十七章 调试及安全性(In .net4.5) 之 程序诊断
1. 概述 生产环境中的程序,也是不能保证没有问题的.为了能方便的找出问题,.net提供了一些特性来进行程序诊断. 这些特性包括:logging.tracing .程序性能分析(profiling) ...
- 鸟哥的linux私房菜——第十六章学习(程序管理与 SELinux 初探)
第十六章.程序管理与 SE Linux 初探 在 Linux 系统当中:"触发任何一个事件时,系统都会将他定义成为一个程序,并且给予这个程序一个 ID ,称为 PID,同时依据启发这个程序的 ...
- 《Linux命令行与shell脚本编程大全》 第十六章 学习笔记
第十六章:创建函数 基本的脚本函数 创建函数 1.用function关键字,后面跟函数名 function name { commands } 2.函数名后面跟空圆括号,标明正在定义一个函数 name ...
- Gradle 1.12 翻译——第十六章. 使用文件
有关其它已翻译的章节请关注Github上的项目:https://github.com/msdx/gradledoc/tree/1.12,或訪问:http://gradledoc.qiniudn.com ...
- 第十六章——处理锁、阻塞和死锁(3)——使用SQLServer Profiler侦测死锁
原文:第十六章--处理锁.阻塞和死锁(3)--使用SQLServer Profiler侦测死锁 前言: 作为DBA,可能经常会遇到有同事或者客户反映经常发生死锁,影响了系统的使用.此时,你需要尽快侦测 ...
- CSS3秘笈复习:十三章&十四章&十五章&十六章&十七章
第十三章 1.在使用浮动时,源代码的顺序非常重要.浮动元素的HTML必须处在要包围它的元素的HTML之前. 2.清楚浮动: (1).在外围div的底部添加一个清除元素:clear属性可以防止元素包围浮 ...
随机推荐
- HDU 1043 八数码 Eight A*算法
Eight Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- 解决:对 PInvoke 函数的调用导致堆栈不对称问题 <转载>
问题描述: 在使用托管代码调用非托管代码时,发生“对 PInvoke 函数“UseTwiHikVisionDllTest!UseTwiHikVisionDllTest.TwiHikVision::Ge ...
- java.lang.Exception: Socket bind failed: [730013] An attempt was made to acc
在CMD命令行中启动运行startup.bat,启运程序总是闪退,查看日志发现如下错误: 26-Jan-2016 18:12:34.463 SEVERE [main] org.apache.coyot ...
- 完成《Java编程入门》初稿
Java编程入门 现在的运维工程师不但要懂得集合网络.系统管理而且要和开发人员一起调试系统,社会上也需要"复合性"的运维人员,所以需要做运维的也要懂一些开发,知道软件系统接口的调试 ...
- MySQL:MySQL和SQL Server的区别
导读:接下来的网上商城的项目,需要用到MySQL数据库了.这个对于我来说,是一个新接触的东西,按照惯例,在刚开始学习一个东西的时候,先从宏观上去了解它.本篇博客,先介绍SQL Server的基本内容, ...
- 新安装的ubuntu系统如何设置中文输入法的方案
本文是本人写的第一篇的linux博客,因为很菜,所以就把刚才自己安装中文输入法的过程给大家介绍一下,希望有所帮助. 1.首先,打开命令终端,两种方式,在Dash里面输入terminal然后enter, ...
- Windows下Qt连接MySql数据库
1.设置环境变量,需添加如下的环境变量: 2.打开Qt Command Prompt,输入第一条命令:cd %QTDIR%\src\plugins\sqldrivers\mysql 后按回车 ...
- linux地址空间划分
LDD讲的很明白了: Linux 是一个虚拟内存系统, 意味着用户程序见到的地址不直接对应于硬件使用的物理地址. 虚拟内存引入了一个间接层, 它允许了许多好事情. 有了虚拟内存, 系统重运行的程序可以 ...
- linux ---用uniq实现文件的并集和交集
1. 取出两个文件的并集(重复的行只保留一份) 2. 取出两个文件的交集(只留下同时存在于两个文件中的文件) 3. 删除交集,留下其他的行 1. cat file1 file2 | sort | un ...
- Can Live View boot up images acquired from 64bit OS evidence?
Some said Live View could only boot up images acquired from 32bit OS evidence. I have to say that it ...