kbs web 使用当中,有的时候 IE 会突然出来一个无法找到服务器的页面,
如果别的浏览器可能就会明明点了链接但是没有反应。这种情况,往往
就是程序有 bug 了,察看出错时间点附近的 apache error log,应该会
有类似这样的错误:
[时间] [notice] child pid **** exit signal Segmentation fault (11)
下面讲一下这种类型的问题的对付方法。举例来说,
bbs2www/phplib/phpbbslib.c:3434行
if (clen > 0) {
f_append(fp, unix_string(content));
}
如果没有这个 clen > 0 的判断,发空文就会这样的错误。假设我们
不知道为什么会出错,希望定位这个错误。
首先,我们要在 kbs 编译的时候加上 -g 参数,方便调试。
可以使用的方法是在 kbs configure 命令末尾加上一个参数:CFLAGS=-g
重新 configure 之后,重新 make; make install;
然后假设我们的 apache 1.3.x 装在 /home/www/ 目录下。
(我这里假设你的站点只有你自己在使用)
首先把 apache 停掉:/home/www/bin/apachectl stop
然后执行 gdb /home/www/bin/httpd
在 (gdb) 提示符下输入:
run -X -f /home/www/conf/httpd.conf
然后,到浏览器里面登录,然后发空文,这个时候浏览器会停住,(gdb) 出现提示:
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread -1209034528 (LWP 10414)]
unix_string (str=0xab9a61 "") at bbslib.c:85
85 *ptr2 = '\0';
这个时候 (gdb) 提示符下输入 bt:
(gdb) bt
#0 unix_string (str=0xab9a61 "") at bbslib.c:85
#1 0x0027a97e in zif_bbs_postarticle (ht=9, return_value=0x9a644c4,
this_ptr=0x0, return_value_used=1) at phpbbslib.c:3435
#2 0x00aa3371 in zend_do_fcall_common_helper (execute_data=0xbff16df0,
opline=0x9a3f3a8, op_array=0x9a56f9c)
at /home/bbs/src/php-5.0.4/Zend/zend_execute.c:2727
... 后面还有一大堆 ...
可以看到,错误在 bbslib.c:85行。并且还能知道是怎么调用到这个函数的。
今后,如果还有人说 kbs www 使用当中出现无法找到服务器的错误,
就按照这个说明来调试,并且把 bt 的输出贴出来,否则该类 bug 本人不予回复...
--
FROM 61.182.213.*