- 主题:[kbs] web seg fault 调试方法
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.*
前辈我太崇拜你了
是不是./configure最后面直接加 -g 就可以了?
【 在 atppp (Big Mouse) 的大作中提到: 】
: kbs web 使用当中,有的时候 IE 会突然出来一个无法找到服务器的页面,
: 如果别的浏览器可能就会明明点了链接但是没有反应。这种情况,往往
: 就是程序有 bug 了,察看出错时间点附近的 apache error log,应该会
: ...................
--
FROM 80.5.160.*
在浏览器里登陆BBS站点,然后发空文怎么回事?
我每次点在线人数察看谁在线也是该页无法显示
在 (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
【 在 atppp (Big Mouse) 的大作中提到: 】
: kbs web 使用当中,有的时候 IE 会突然出来一个无法找到服务器的页面,
: 如果别的浏览器可能就会明明点了链接但是没有反应。这种情况,往往
: 就是程序有 bug 了,察看出错时间点附近的 apache error log,应该会
: ...................
--
FROM 80.5.160.*
真不认真
看着原文还问
【 在 ukbee (小蜜蜂) 的大作中提到: 】
: 前辈我太崇拜你了
: 是不是./configure最后面直接加 -g 就可以了?
--
FROM 221.14.201.*
885 886
不过还是a core解说详尽 hehe
--
FROM 211.151.90.87
猪头...我就是照着你那个扩展了一下,其实...
【 在 FreeWizard ( ) 的大作中提到: 】
: 885 886
: 不过还是a core解说详尽 hehe
--
FROM 61.182.213.*
上次写过的web调试方法,理论上适用所有情况,因为启动之后可以自由设置断点,
但是坏处是必须单独起进程或者重新写配置文件,某些情况下不方便。
这里再写一个调试方法,只适用调试seg fault的情况:
1. httpd.conf设置CoreDumpDirectory
2. 启动apache的环境保证设置ulimit -c unlimited
之后启动之后如果有seg fault,core会写入那个目录,直接可以拿来调试。
水木服务器上很多小概率的web seg fault就是用这个方法找出来的。
更多可google Apache Debugging Guide
【 在 atppp (Big Mouse) 的大作中提到: 】
: kbs web 使用当中,有的时候 IE 会突然出来一个无法找到服务器的页面,
: 如果别的浏览器可能就会明明点了链接但是没有反应。这种情况,往往
: 就是程序有 bug 了,察看出错时间点附近的 apache error log,应该会
: ...................
--
FROM 128.12.150.*
啊?看不懂,一般apache不出问题
【 在 atppp (Big Mouse) 的大作中提到: 】
: 上次写过的web调试方法,理论上适用所有情况,因为启动之后可以自由设置断点,
: 但是坏处是必须单独起进程或者重新写配置文件,某些情况下不方便。
: 这里再写一个调试方法,只适用调试seg fault的情况:
: ...................
--
FROM 218.26.243.*
看了一下原始帖子
最麻烦的就是编译加-g参数
然后停进程
不好不好
【 在 sxdxsimple (雾里龙虾) 的大作中提到: 】
: 啊?看不懂,一般apache不出问题
--
FROM 218.26.243.*