标题
服务器之王! [坛主CLQ的服务器程序开发日记,综合了众多C/C++程序崩溃的原因,强烈推荐!]
clq
前面我们说过,如果STL的迭代器没有受到锁定保护的话在linux下的某些版本会发生段错误。在windows下也有很多莫名奇妙的东西,比如new操作的出错。今天终于证实了别的地方对内存操作失误会使后面的new操作出错。(这里的例子是指在VC下,别的编译器我还没试过,不过虽然不一定new的时候报错,但肯定会在别的地方报错)今天碰到的实际例子是,先分配了1000个字节的空间,然后用memcpy复制2000个字节的数据给它,在赋值的时候是不报错的,当我在另一个地方再new数据时,程序报错了。我觉得这实在是太恐怖了,程序员根本就追踪不到出错的地方!我在《windows游戏编程大师》中看到某作者说出错时调试器是不一定指到正确的地方的,必须要查看反汇编后的代码。而我们现在的这种情况更糟,当你下一次new的时候,鬼知道已经离出错的地方多远了--怎么看汇编代码呀,再说我又看不懂。 [s:7] 唯一的解决办法似乎是用STL来代替数组,这样至少在操作越界时会异常--当然有些STL类不是理会越界的,再说了STL也是要人来写的,把错误推给别人解决总是有代价的。
clq
报错对delphi等程序员来说是无所谓的,因为delphi会自动跳过出错的代码,而c/c++则是立即终止程序!这可是标准规定的!这是一种非常可怕的行为,我很不以为然,但很多人深以为然。
clq
公司写服务器的人又要走一个。以后就要由我负责写几乎全部的服务器程序了(当然会有新人进来)。虽然走了一个“兄弟”我心里面还是比较高兴的(罪过罪过)。因为能更多的按自己的想法去做,象他们原来那样把指针也在网络上传送的方法,我实在是很不以为然。当着他们我当然不会说,不过这种写法实在是有点恶劣。
clq
[code]
今天有一个问题[BUG]花了个很长时间(可能超过一小时):
某个信息是用结构的数组表示的。比如 a[10]吧,传给参数就变成了 (a * p) 因为官得太多了,一时忘记了这里 p 是表示数组的,一不小心就在函数里面用 p->xxx 了。实际在应当是写成 p[i].xxx,这是一个普遍的问题,因为用数组来表示一个list是很方便的,所以有很多这样的代码要注意。还有些用(a ** p)来表示,我在很多开源的服务器代码中(好象apache也是这样),不过这就比较难用了,也更容易出错。
再归纳重复一遍:记住把指针当list用时,小心以上的bug.
另外 p->xxx 相当于 p[0].xxx
[/code]
clq
socket给我的感觉一直是在windows与linux间几乎没有差别,今天惊讶的发现linux下的socket的accept函数中的第三个参数必须是socketlen_t类型,虽然我的一本教科书上写的是int类型,但实际上是要强制转换才能编译通过的。吃惊之余查看了一下bnbt的源代码,它也是这样处理的,我方才心安了些。
linux下的socket相对windows的版本还有以下差别:closesocket要用close代替,socket是int型,它的函数调用都是-1为失败,这在移植到windows平台时是要特别注意的,因为windows下是unsigned int类型,这是没有负数的,这也是为什么w下的无效socket的定义那么古怪--它是在模仿int下的-1值(我今天才知道,惭愧惭愧)。
clq
前段试了,异步socket。我记得我刚进公司时还与面试经理说标准socket中没有异步,结果他让我去查查资料。虽然如此我还是被录取了,其实我也没说错,确实“标准”都没有操作异步socket的函数,不过各个平台下确实都有异步,并且标准socket函数其实是不区分是否异步的。这几句话可能有点费解,也许大家也要去查查资料 [s:7] 总之一句话:socket是直接支持异步的。
异步的效率确实高一些,不过具体高多少我没“科学地验证”过。
clq
当某个目录没有写入权限时,以"a+b"标志打开的文件也会出错。
FILE * 会为NULL,导致后面的fwrite()调用产生段错误,程序因此退出。
服务器之王
呵呵。我说上几句,斑主不会介意吧?VC在debug状态下访问数组越界时(实际上就是越界访问内存时)是不会报错的。这样程序会在某个夜里的3点钟崩溃。在release状态下也不会立即报错,不过要好一点,好象是用一个/GZ编译参数可以消除它们间的这种区别(不太记得了,请查MSDN)。不过二者没有解决本质的区别,只是一个会立即崩溃一个很久之后崩溃,这时查看堆栈也是没有用的,堆栈中显示的只是诱发它崩溃的原因。能解决这个问题的人不多(好象包括斑主:) ),其实方法也很简单,就是在release状态下将诱发崩溃的代码向前移,直到没有发生崩溃为止,那么这附近就是有内存越界访问了。代码前移的位置倒是可以查看堆栈的,release下也是可以调试的,这个斑主应该是会的吧,我就不多说了。
NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.