标题
服务器之王! [坛主CLQ的服务器程序开发日记,综合了众多C/C++程序崩溃的原因,强烈推荐!]
clq
浏览(0) +
2005-01-11 21:43:25 发表
编辑
关键字:
[标题仅供娱乐[s:7] ]
不过下面的内容可没什么娱乐性,您必须有顽强的信念才能得到乐趣。
[2007.3.7] 因为我主要用C/C++开发.维护过的程序也大多使用这两种语言,其中发现程序崩溃是最为常见的一个问题,有些程序崩溃的原因甚至在1年多的时间内都没有人找到.因此我觉得有必要把我自己经历过的崩溃情况都写在这其中,以方便后来人,也方便我自己.
clq
兄弟我“多年前”开发了我们现在的这套邮件服务器系统,心里一直很得意。但最近几个月来所写的服务器却远远超过这几年的总和!话还要从我找工作说起,现在所在的公司实际上是一证券商,大家看到的K线图呀什么的都得有服务器在后台支持,写这些东东虽然还没Apache那么XX,不过也实在没几个人能把这林林总总的写全了。这些东东号称通用并且只用修改逻辑代码,但在我眼前的却是眼花潦乱实现方法,线程代码、锁定代码大模大样的出现在逻辑动态库中(好在这个动态库基本上还能在windows/Linux下通用)。
clq
可想而知我有多狼狈,每天游走于各个服务器BUG之间,不停的查看它们down机的原因、数据不正常的理由...最可怕的是某服务器会在某个时间,突然“不间断”的死机,偏偏它还是投入了使用的,在无法立即找到原因的情况下只能人停的重启它,每当我们“以为”它恢复正常时客户崔命的电话就到来了...(又xx了)...
clq
好了,这个帖子的目的就是要告诉大家这些bug的起因和解决办法(如果有的话,并且我能找出来 [s:7] ) 如果您不辛要写或正在维护一台或几份服务器代码,我我想这里面一定有你要的东西。
clq
首先,要看一个我最吃惊的bug。某服务器,在windows下强壮得不得了。一到linux下“有时”只能启动几分钟,然后就报“段错误”over了。这个有时是指在某些redhat上能欢快地跑,在某些redhat上不行,并且是立即地不行--别指望它能撑一两个小时给你重启蒙混的机会。我找呀找呀找,发现修改map(不要想,就是标准STL中的map)的访问代码能正常。我想大概是迭代器被多线程访问时破坏了,但在windows下怎么又是好的呢?这个..这个..大概微软的STL是线程安全的吧--我只能这样安慰自己。更让我惊讶的是在网上居然有大量的此类帖子,不过好象都没找到原因。最后我不得不仔仔细细地加锁,问题是解决了,但加锁并不是什么好办法,我总觉得是那台linux的库有问题,这些有问题的linux应当是可是通过更新库来解决的,毕竟加锁的任务太艰巨了。而我另一个用java写的就不用在访问容器类时加锁,跑得好得不得了。linux下不但map如此,连hash_map也如此,就是那个号称线程安全的sgi还是sig库也并不安全,不过有人声称他更换了一个STL库后解决了这个问题,可惜不知道他更换了那一个库。如此说来window倒是更优秀?另外再说一个事:windows(应当说VC)对内存操作时出错是不抛出例外的,程序仍然正常运行,有人说它对new的操作失败不抛出例外是不符合XX标准的,我想其他的内存操作也是一样,至于这个特点是它的优点还是缺点,我想仁者见仁智者见智了。
clq
当然我也因此学到了不少东西,比如一同事就教我在调试不到代码时查看堆栈(VC调试状态时有一个按钮可以显示堆栈中调用了哪些函数)。还有new的时候会出错,今天就发现了一个,不过经理认为不可能,我也想不通,因为任务管理器中显示只用了8M,而我的机子是512M的,也许是new后的操作出了错??明天再去查了。
友情提醒 :) VC对new出错是没反映的,您要加一个try块才捉得信它。血泪经验。
clq
我修改了别的地方的分配代码,结果这边的new就没事了。
clq
最近又接了几个旧代码,这些代码的出错惊人的类似。都是在new时发生错误,原因却找不到。这些错我相信是多线程未锁定时操作内存引起的,因为我有相同的代码但正确地加了锁后就没有任何问题出现过--不过这次为什么都是在new的时候出错。我百思不得其解。
不过,无论如何它们肯定是内存操作时出的错。我们的服务器目前是这样的,分配极大量的内存,操作直接在内存中不与文件交互,这样速度很快。这种思想我是很怀疑的,那么多优秀的服务器都没这样做,数据是否在内存决不是速度快慢的真正原因。顺便说一下我们目前的服务器内存占用是200M以上!呵呵,与oracle差不多。
clq
在linux下用fopen()也有可能会导致段错误!比如某个文件不存在时,用fopen的"rb"标志打开时,返回值是NULL,如果不检测这个值就会在后面操作这个文件指针时发生段错误,因为在windows下没问题所以..陷井呀陷井!因为linux我们的代码都得变得比较老实。
clq
完全按标准或在线文档来写程序实在是一种痛苦。调试就更惨了,兄弟我很不情愿的招供:我还只会printf别的懒得用。
不过我总是同步更新windows下的版本,基本上windows下也能找出这些错误,另外就是有不同时也方便更改。所以建议大家尽量同时开发跨平台的版本--其实这并不困难。
NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.