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) 之 调试程序的更多相关文章

  1. 第十五章 调试及安全性(In .net4.5) 之 管理程序集

    1. 概述 本章将介绍 什么是程序集.如何强命名程序集.如何把程序集放入GAC.程序集版本 以及 WinMD程序集. 2. 主要内容 2.1 什么是程序集 程序集(Assembly)概念的出现,是为了 ...

  2. 第十四章 调试及安全性(In .net4.5) 之 对称及非对称加密

    1. 概述 本章内容包括:对称及非对称加密算法..net中的加密类.使用哈希操作.创建和管理签名认证.代码访问权限 和 加密字符串. 2. 主要内容 2.1 使用对称和非对称加密 ① 对称加密:使用同 ...

  3. 第十三章 调试及安全性(In .net4.5) 之 验证程序输入

    1. 概述 本章介绍验证程序输入的重要性以及各种验证方法:Parse.TryParse.Convert.正则表达式.JavaScriptSerializer.XML Schemas. 2. 主要内容 ...

  4. 第十七章 调试及安全性(In .net4.5) 之 程序诊断

    1. 概述 生产环境中的程序,也是不能保证没有问题的.为了能方便的找出问题,.net提供了一些特性来进行程序诊断. 这些特性包括:logging.tracing .程序性能分析(profiling) ...

  5. 鸟哥的linux私房菜——第十六章学习(程序管理与 SELinux 初探)

    第十六章.程序管理与 SE Linux 初探 在 Linux 系统当中:"触发任何一个事件时,系统都会将他定义成为一个程序,并且给予这个程序一个 ID ,称为 PID,同时依据启发这个程序的 ...

  6. 《Linux命令行与shell脚本编程大全》 第十六章 学习笔记

    第十六章:创建函数 基本的脚本函数 创建函数 1.用function关键字,后面跟函数名 function name { commands } 2.函数名后面跟空圆括号,标明正在定义一个函数 name ...

  7. Gradle 1.12 翻译——第十六章. 使用文件

    有关其它已翻译的章节请关注Github上的项目:https://github.com/msdx/gradledoc/tree/1.12,或訪问:http://gradledoc.qiniudn.com ...

  8. 第十六章——处理锁、阻塞和死锁(3)——使用SQLServer Profiler侦测死锁

    原文:第十六章--处理锁.阻塞和死锁(3)--使用SQLServer Profiler侦测死锁 前言: 作为DBA,可能经常会遇到有同事或者客户反映经常发生死锁,影响了系统的使用.此时,你需要尽快侦测 ...

  9. CSS3秘笈复习:十三章&十四章&十五章&十六章&十七章

    第十三章 1.在使用浮动时,源代码的顺序非常重要.浮动元素的HTML必须处在要包围它的元素的HTML之前. 2.清楚浮动: (1).在外围div的底部添加一个清除元素:clear属性可以防止元素包围浮 ...

随机推荐

  1. 《Code Complete》ch.7 高质量的子程序

    WHAT? 子程序(routines)是为实现一个特定目的而编写的可被调用的方法或过程.在C++中是函数(function),在Java中是方法(method),在VB中是函数过程(function ...

  2. Kendo UI - Observable

    在 Kendo 中,基类 Class 第一个重要的派生类就是 Observable, 顾名思义,就是一个可观察的对象,也就是观察者模式的基础. 对于观察者模式来说,应该有主题和观察者,这里我们讨论的其 ...

  3. 检测网页是否可以打开, 再使用IE打开网页

    //检测是否能连接网页 BOOL CanLinkWebPage(string strUrl) { /*clock_t start, finish; double duration; start = c ...

  4. android 数据存储----文件方式 总结

    在android中的文件放在不同位置,它们的读取方式也有一些不同. 本文对android中对资源文件的读取.数据区文件的读取.SD卡文件的读取及RandomAccessFile的方式和方法进行了整理. ...

  5. 003.ASP.NET MVC集中管理Session

    原文链接:http://www.codeproject.com/Tips/790387/Session-in-ASP-NET-MVC 1.前言 今天有得有失啊,看到这篇,专心记下里面的精华吧 2.一般 ...

  6. Spring缓存注解@Cache使用

    参考资料 http://www.ibm.com/developerworks/cn/opensource/os-cn-spring-cache/ http://swiftlet.net/archive ...

  7. C++学了这么多年,你仍不知道的事

    C++学了这么多年你知道为什么定义类时,类的定义放在.h文件中,而类的实现放在cpp文件中.它们为什么能够关联到一起呢?你知道什么东西可以放在.h文件中,什么不能.什么东西又可以放在cpp文件中.如果 ...

  8. JavaScript常用代码段

    总结一下在各种地方看到的还有自己使用的一些实用代码 1)区分IE和非IE浏览器 if(!+[1,]){ alert("这是IE浏览器"); } else{ alert(" ...

  9. C# 发送邮件方法

    发送邮件所用的核心知识点 微软封装好的MailMessage类:主要处理发送邮件的内容(如:收发人地址.标题.主体.图片等等) 微软封装好的SmtpClient类:主要处理用smtp方式发送此邮件的配 ...

  10. 将Eclipse项目导入Android Studio出现中文乱码的问题

    以前一直以Eclipse开发项目,最近正在研究Android Studio的使用,首先想到到的是将Eclispe项目导入AS. 可以方便查看以前写过的代码,然后出现了中文乱码的问题,通过搜索了一些资料 ...