关于如何判断程序和类库是Debug 还是 Release 的问题
在發(fā)布程序時(shí)不小心把一部分Debug的dll文件和一部分Release的dll文件混合發(fā)布了,最后導(dǎo)致整個(gè)生產(chǎn)環(huán)境癱瘓(內(nèi)存和cpu使用量很高,同時(shí)網(wǎng)站訪問無響應(yīng))。到現(xiàn)在我還搞不懂為什么會這樣,也許是代碼中有些地方用了一下比較不穩(wěn)定的東西,也或許是dotnet的framework在Debug和Release混合下就會發(fā)生問題。但是就解決問題角度來說,最快速的應(yīng)該是把這堆混合后的dll文件再次區(qū)分開,然后重新發(fā)布一個(gè)統(tǒng)一了版本的dll。
isDebug:
在http://www.sliver.com/dotnet/IsDebug/作者有一個(gè)用于做這方面檢測的程序isDebug。這個(gè)程序能分辨exe和dll文件是Debug 還是 Release 。但是該程序不是十分準(zhǔn)確,部分的dll不能真實(shí)分辨,而且只適合使用在dotnet程序下。ps:本程序的作者就是Reflector的作者。
在也談判斷一個(gè)程序是Debug 還是 Release 的一篇文章里面找到了另一個(gè)判斷程序是否Debug的方法。該方法是直接通過讀取程序文件中的標(biāo)記來作判斷的,因此該方法合適使用在各種執(zhí)行文件和類庫上。其結(jié)果也比isDebug準(zhǔn)確,很多isDebug分辨錯(cuò)誤的,它也能準(zhǔn)確分辨。
其核心代碼如下:
?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????????????}?
因此我使用該方法做了一個(gè)類似isDebug的程序。下載
該程序還有兩個(gè)主要的問題:
1、對可執(zhí)行文件和類庫只使用后綴作判斷,總覺得這很不妥;
2、沒有找到判斷托管執(zhí)行文件和非托管文件的辦法。
?最后說一下前面提到的系統(tǒng)癱瘓,Debug和Release混合不是這個(gè)問題的根源,而一般僅僅是導(dǎo)火線。
轉(zhuǎn)載于:https://www.cnblogs.com/baoli/archive/2008/02/19/1073108.html
總結(jié)
以上是生活随笔為你收集整理的关于如何判断程序和类库是Debug 还是 Release 的问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 让你成为有钱人的25种方法!
- 下一篇: C#读写注册表