在发布程序时不小心把一部分Debug的dll文件和一部分Release的dll文件混合发布了,最后导致整个生产环境瘫痪(内存和cpu使用量很高,同时网站访问无响应)。到现在我还搞不懂为什么会这样,也许是代码中有些地方用了一下比较不稳定的东西,也或许是dotnet的framework在Debug和Release混合下就会发生问题。但是就解决问题角度来说,最快速的应该是把这堆混合后的dll文件再次区分开,然后重新发布一个统一了版本的dll。

isDebug:
在http://www.sliver.com/dotnet/IsDebug/作者有一个用于做这方面检测的程序isDebug。这个程序能分辨exe和dll文件是Debug 还是 Release 。但是该程序不是十分准确,部分的dll不能真实分辨,而且只适合使用在dotnet程序下。ps:本程序的作者就是Reflector的作者。

在也谈判断一个程序是Debug 还是 Release 的一篇文章里面找到了另一个判断程序是否Debug的方法。该方法是直接通过读取程序文件中的标记来作判断的,因此该方法合适使用在各种执行文件和类库上。其结果也比isDebug准确,很多isDebug分辨错误的,它也能准确分辨。
其核心代码如下:

Code
 1String szName = filePath; 
 2            FileStream fs = null; 
 3            BinaryReader r = null; 
 4            bool bDebug = false; 
 5
 6            try 
 7            
 8                fs = new FileStream(szName, FileMode.Open, FileAccess.Read); 
 9                r = new BinaryReader(fs); 
10
11                fs.Seek(0x3c, SeekOrigin.Begin); // pe heaher offset 
12                int i = r.ReadInt32(); 
13
14                fs.Seek(i + 0x18, SeekOrigin.Begin); // magic number offset 
15                int iMagicNumber = r.ReadInt16(); 
16                if(iMagicNumber == 0x010b) 
17                
18                    // pe32 
19                    fs.Seek(i + 0xa8, SeekOrigin.Begin);// debug data directories info offset 
20                } 
21                else if(iMagicNumber == 0x020b) 
22                
23                    // pe32+ 
24                    fs.Seek(i + 0xb8, SeekOrigin.Begin);// debug data directories info offset 
25                } 
26
27                else 
28                
29                    throw new SystemException("impossible! nnd, it is not a pe file! fk u"); 
30                } 
31
32                bDebug = r.ReadInt32() != 0; 
33            } 
34            catch(SystemException e) 
35            
36                Console.WriteLine(e.Message); 
37            } 
38            finally 
39            
40                if(fs != null) 
41                
42                    fs.Close(); 
43                } 
44
45                if(r != null) 
46                
47                    r.Close(); 
48                } 
49            } 

因此我使用该方法做了一个类似isDebug的程序。下载
该程序还有两个主要的问题:
1、对可执行文件和类库只使用后缀作判断,总觉得这很不妥;
2、没有找到判断托管执行文件和非托管文件的办法。

最后说一下前面提到的系统瘫痪,Debug和Release混合不是这个问题的根源,而一般仅仅是导火线。

转载于:https://www.cnblogs.com/baoli/archive/2008/02/19/1073108.html

关于如何判断程序和类库是Debug 还是 Release 的问题相关推荐

  1. 判断dll是版本(Debug Or Release)[测试通过]

    简单的代码,google搜索提炼和分析,主要是利用反射技术,测试通过,抛砖引玉,自娱自乐,多多指教. public partial class _Default : System.Web.UI.Pag ...

  2. iOS中判断程序是不是第一次运行(新手引导界面用)

    2019独角兽企业重金招聘Python工程师标准>>> 在软件下载安装完成后,第一次启动往往需要显示一个新手操作引导,来告诉用户怎么操作这个app,这就需要在程序一开始运行就判断程序 ...

  3. 【转】程序debug正常release错误

    原文:http://hi.baidu.com/leggle/blog/item/ec0c2e5400c3ed5dd10906a7.html 呵呵,Iris来了!由于最近所做项目接近尾声,想在relea ...

  4. 判断程序是否运行在虚拟机中的代码

    首先我们要了解一下什么是虚拟机, 对虚拟机的通用解释是通过软件模拟的具有完整硬件系统功能的, 运行在一个完全隔离环境中的完整计算机系统. 通过虚拟机软件, 你可以在一台物理计算机上模拟出一台或多台虚拟 ...

  5. Android之通过ActivityLifecycleCallbacks判断程序是否运行在后台

    1.问题 判断程序是否运行在后台运行 2.解决办法 我们可以使用ActivityLifecycleCallbacks,对于ActivityLifecycleCallbacks,看我的这篇博客介绍() ...

  6. 如何判断exe文件是debug还是release编译生成的

    如何判断exe文件是debug还是release编译生成的 结论: 用IDA工具打开exe,然后看Imports里面的依赖库是否有带d或D结尾的,如果有就说明是Debug的 实验:(实验环境 vs20 ...

  7. 判断程序是否已经运行

    近段时间,需要写一个小功能,就是需要判断程序是否已经运行. 某个程序安装后,也许被多个用户运行.那怎样判断当前用户已经运行了此程序了呢? 下面是Insus.NET的做法,就是: <VB.NET ...

  8. [你必须知道的.NET]第三十五回,判断dll是debug还是release,这是个问题

    问题的提出 晚上翻着群里的聊天,发现一个有趣的问题:如何通过编码方式来判断一个dll或者exe为debug build还是release build?由于没有太多的讨论,所以我只好自己找点儿办法,试图 ...

  9. 有经验的面试官都是如何快速判断程序员能力的?

    程序员是一个技术含量特别高的职位,优秀的程序员对每个公司来讲同样可遇不可求.而这就需要技术面试官的火眼精金,为企业挖掘人才. 程序员面试者那么多,如何快速分辨他们的能力,为双方都节省时间和精力,也成为 ...

最新文章

  1. 关于学习Python之后的一点总结(1->符号优先级->for->range())
  2. Android JNI编程(六)——C语言函数指针、Unition联合体、枚举、Typedef别名、结构体、结构体指针...
  3. 高级开发必须理解的Java中SPI机制
  4. 蓝桥杯java第五届决赛第四题--排列序数
  5. 10048 mysql_MySQL 的 10048问题,如何解决?
  6. Smarty目录结构和子目录路径问题
  7. d3.js html显示图片,d3.js v4:如何在鼠标点击节点后显示图像
  8. iOS多线程编程的知识梳理
  9. 基于JAVA+SpringMVC+MYSQL的酒店旅游管理系统
  10. 数据库工作笔记008---pg_hba.conf entry for host “192.168.2.111”, user “gpadmin”, database “template1”, SSL
  11. 使用jquery.form.js实现form表单无刷新提交简单示例
  12. windows优化大师怎么用_软件不能用又卸载不掉怎么办——用Windows自家的卸载工具吧(dos级卸载)...
  13. (转)SQL Server当中生成一定范围的随机数
  14. FoxMail 查看邮件乱码
  15. 合伙人(GP) 有限合伙人(LP)是什么意思?
  16. 富文本编辑器:ckeditor(使用ckeditor4-vue)
  17. 2022年C等级考试九月二级真题E:反反复复
  18. 对「曲线拟合」和「最小二乘法」的个人理解
  19. 中国建设银行宣布:国内第一家无人银行,在上海正式开业!
  20. OpcEnum交互式用户不可选解决办法

热门文章

  1. android如何添加gif,Android加载Gif和ImageView的通用解决方案:android-gif-drawable(1)...
  2. boostrap 鼠标滚轮滑动图片_BootStrap 轮播插件(carousel)支持左右手势滑动的方法(三种)...
  3. linux二进制文件构建mysql_MySQL安装系列:使用通用二进制文件在Unix/Linux安装
  4. php mail函数 附件,[php]mail函数发送邮件(正文+附件+中文)
  5. 安徽工业大学计算机考研调剂,安徽工业大学2019年考研预调剂公告
  6. 创建了联合索引还用在单个字段上创建索引吗_数据库 索引并不是万能的
  7. ubuntu字符界面login_Ubuntu字符界面输入密码始终提示错误 login incorrect 解决办法...
  8. Android WebView 和 javaScript的互相调用(二)
  9. vc2010中开始执行不调试灰的_反编译动态调试smali全过程
  10. linux usb摄像头 源码,Linux USB摄像头驱动实现源码分析