- 主题:miscd killuser出现问题
./miscd killuser
Segmentation fault
不知道为什么, 我这里bbs启动都没有问题,查询用户也没问题,flush也可以,但是就是killuser不行:
Breakpoint 1, main (argc=2, argv=0xbfa342c4) at miscd.c:687
687 if (strcasecmp(argv[1], "killuser") == 0) {
(gdb) n
688 if (resolve_ucache() != 0)
(gdb) n
690 return dokilluser();
(gdb) s
dokilluser () at miscd.c:165
165 newbbslog(BBSLOG_USIES, "Started kill users\n");
(gdb) n
166 apply_users(killauser, NULL);
(gdb) s
apply_users (func=0x804aa62 <killauser>, arg=0x0) at ucache.c:773
773 for(count=0,i=0;i<uidshm->number;i++){
(gdb) n
774 if(func){
(gdb)
775 switch((*func)(&uidshm->passwd[i],arg)){
(gdb)
Program received signal SIGSEGV, Segmentation fault.
0x08059258 in apply_utmp (fptr=0x80598b9 <kickuser_count>, maxcount=0, userid=0xb6a116c4 "sabbath", arg=0xbfa34144)
at utmp.c:555
555 i = utmphead->hashhead[hashkey];
--
FROM 222.171.7.*
我再进一步调试是到了utmp.c
这个是怎么回事呢?共享内存访存冲突?
Breakpoint 4, apply_utmp (fptr=0x80598b9 <kickuser_count>, maxcount=0, userid=0xb6af46c4 "sabbath", arg=0xbfddc4f4)
at utmp.c:553
553 num = 0;
(gdb) n
554 hashkey = utmp_hash(userid);
(gdb)
555 i = utmphead->hashhead[hashkey];
(gdb)
Program received signal SIGSEGV, Segmentation fault.
0x08059258 in apply_utmp (fptr=0x80598b9 <kickuser_count>, maxcount=0, userid=0xb6af46c4 "sabbath", arg=0xbfddc4f4)
at utmp.c:555
555 i = utmphead->hashhead[hashkey];
(gdb) p hashkey
$16 = 9340
(gdb) p utmphead->hashhead[hashkey]
Cannot access memory at address 0xc0f8
【 在 luckwithme (Marvel) 的大作中提到: 】
: ./miscd killuser
: Segmentation fault
: 不知道为什么, 我这里bbs启动都没有问题,查询用户也没问题,flush也可以,但是就是killuser不行:
: ...................
--
FROM 222.171.7.*
这个站点是测试用得,用户数据不一定全,测试用到的几个用户的home和mail都有,其他都没有放进去,不过这个问题应该不大吧
utmp是登录信息,这个怎么会出现这种访问错误呢?
其中
88 #define MAXUSERS 40000
89 #define MAXCLUB 1024
90 #define MAXBOARD 1024
91 #define MAXACTIVE 3000
3000确实比9340大了,但是这是怎么回事呢
【 在 luckwithme (Marvel) 的大作中提到: 】
: 我再进一步调试是到了utmp.c
: 这个是怎么回事呢?共享内存访存冲突?
: Breakpoint 4, apply_utmp (fptr=0x80598b9 <kickuser_count>, maxcount=0, userid=0xb6af46c4 "sabbath", arg=0xbfddc4f4)
: ...................
--
修改:luckwithme FROM 222.171.7.*
FROM 222.171.7.*
没有改过
如何在gdb中attach进程后查看MAXACTIVE的值是多少?呵呵
【 在 atppp (Big Mouse) 的大作中提到: 】
: 你改过 MAXACTIVE 么,改过以后有没有全部make; make install然后完全重启动
--
修改:luckwithme FROM 222.171.7.*
FROM 222.171.7.*
确实是从smth1.2升级过来的,不过site/xxx.h文件没有动过,一直就是上面的那个
40000/3000,而且以前一切都运行正常,只不过加了SAVELIFE的宏定义,现在准备杀用户,
去掉之后就有问题了……
我找了一下
MAXACTIVE是3000
USHM_SIZE (MAXACTIVE + 10)是3010
UTMP_HASHSIZE (USHM_SIZE*4)是12040>9340应没问题
问题貌似出在这里:
Program received signal SIGSEGV, Segmentation fault.
0x08059258 in apply_utmp (fptr=0x80598b9 <kickuser_count>, maxcount=0, userid=0xb6a7dbf8 "fhm", arg=0xbfde9504)
at utmp.c:555
555 i = utmphead->hashhead[hashkey];
(gdb) p i
$13 = -20
(gdb) p hashkey
$14 = 7383
(gdb) p utmphead->hashhead
Cannot access memory at address 0x2f08
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
(gdb) p utmphead
$15 = (struct UTMPHEAD *) 0x0
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
hashhead为什么无法访问呢?
【 在 fancyrabbit (兔兔猫★Initial F★Changing ...) 的大作中提到: 】
: 标 题: Re: miscd killuser出现问题
: 发信站: 水木社区 (Thu Feb 28 23:08:39 2008), 转信
:
:
: 【 在 luckwithme (Marvel) 的大作中提到: 】
: : 这个站点是测试用得,用户数据不一定全,测试用到的几个用户的home和mail都有,其他都没有放进去,不过这个问题应该不大吧
: : utmp是登录信息,这个怎么会出现这种访问错误呢?
: : 其中
: : 88 #define MAXUSERS 40000
: : 89 #define MAXCLUB 1024
: : 90 #define MAXBOARD 1024
: : 91 #define MAXACTIVE 3000
: : 3000确实比9340大了,但是这是怎么回事呢
: -_- 问你自己啊 ... 你是从别的正常站挪过来的?
: 原来什么样?
:
: --
:
※ 修改:·luckwithme 于 Feb 29 11:25:50 修改本文·[FROM: 222.171.7.*]
: ※ 来源:·水木社区 newsmth.net·[FROM: 221.219.11.*]
--
修改:luckwithme FROM 222.171.7.*
FROM 222.171.7.*
会不会是没有resolve_utmp的关系?
直接用miscd killuser有这个问题?
我看了smth1.2的代码,其中没有出问题的那句kick_user_utmp(getuser(theuser->userid, NULL), NULL, SIGKILL);
【 在 luckwithme (Marvel) 的大作中提到: 】
: 确实是从smth1.2升级过来的,不过site/xxx.h文件没有动过,一直就是上面的那个
: 40000/3000,而且以前一切都运行正常,只不过加了SAVELIFE的宏定义,现在准备杀用户,
: 去掉之后就有问题了……
: ...................
--
修改:luckwithme FROM 222.171.7.*
FROM 222.171.7.*
我想是不是这样的,如果miscd daemon启动的话,在miscd_dodaemon中有:
568 resolve_boards();
569 resolve_utmp();
570 resolve_guest_table();
所以没问题,但是如果单独命令行执行miscd killuser的话,貌似从
main->dokilluser->killauser->kick_user_utmp->apply_utmp
都没有resove_utmp(),所以这样会出错
//可能大家都是默认的daemon启动杀用户,所以都没有遇到这个问题,我猜的对吗,呵呵
【 在 luckwithme (Marvel) 的大作中提到: 】
: 会不会是没有resolve_utmp的关系?
: 直接用miscd killuser有这个问题?
: 我看了smth1.2的代码,其中没有出问题的那句kick_user_utmp(getuser(theuser->userid, NULL), NULL, SIGKILL);
: ...................
--
FROM 222.171.7.*
# ps aux |grep miscd :00 grep miscd
root 8209 0.0 0.0 3904 712 pts/0 S+ 13:10 0:00 grep miscd
bbs 23569 0.0 0.0 35792 408 ? Ss 12:47 0:00 ./miscd timed
bbs 23570 0.0 0.0 35792 488 ? S 12:47 0:00 ./miscd killd
bbs 23571 0.0 0.0 35792 432 ? S 12:47 0:00 ./miscd userd
bbs 23572 0.0 0.0 35792 372 ? S 12:47 0:00 ./miscd flushd
【 在 fancyrabbit (兔兔猫★Initial F★Changing ...) 的大作中提到: 】
: ft .. 你 miscd 现在跑着没有?
: ps aux |grep miscd 贴结果
--
FROM 222.171.7.*
启动了miscd daemon
然后再手动启动miscd killuser的
mvision:/home/bbshome/bin# ./miscd daemon
mvision:/home/bbshome/bin# ./bbslogd
mvision:/home/bbshome/bin# ./bbsd
mvision:/home/bbshome/bin# ./miscd killuser
Segmentation fault
【 在 foxban (未毕业的码农) 的大作中提到: 】
: 你没启动miscd直接kill的?
--
FROM 222.171.7.*
可能是miscd daemon和miscd killuser不是一个进程,所以不能共享连接到的共享内存。
本来我既然提供的args有killuser,所以想先试一下,每天自动杀要在4点吧,怕出问题,呵呵。
【 在 fancyrabbit (兔兔猫★Initial F★Changing ...) 的大作中提到: 】
: 看起来没问题,你在miscd里手动加上resolve_utmp试试看吧 ..
我刚刚加了这句了,没有问题,是否需要更新一下svn
: 我还真没手杀过人
--
FROM 222.171.7.*