欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

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

发布时间:2025/4/16 编程问答 62 豆豆
生活随笔 收集整理的这篇文章主要介绍了 关于如何判断程序和类库是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分辨错误的,它也能准确分辨。
其核心代码如下:

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 的问题的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。