关于如何判断程序和类库是Debug 还是 Release 的问题
在发布程序时不小心把一部分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分辨错误的,它也能准确分辨。
其核心代码如下:
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 的问题的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 让你成为有钱人的25种方法!
- 下一篇: 用axis开发webservice实践