(FreeBSD) USBキーボード/マウスを抜き差しするとたまにXサーバーがsegmentation faultで落ちる
のつづき。
またしても、SIGSEGVが出ました。
コードの場所は同じところで
Program received signal SIGSEGV, Segmentation fault.
0x0000000813008164 in MouseCtrl (device=0x801e2dc00, ctrl=0x814aafbc8)
at mouse.c:1571
1571 pMse->num = ctrl->num;
(gdb) p pMse
$1 = 0xffffffff00000001
(gdb) p ctrl
$2 = (PtrCtrl *) 0x814aafbc8
(gdb) l 1556,1575
1556
1557 static void
1558 MouseCtrl(DeviceIntPtr device, PtrCtrl *ctrl)
1559 {
1560 InputInfoPtr pInfo;
1561 MouseDevPtr pMse;
1562
1563 pInfo = device->public.devicePrivate;
1564 pMse = pInfo->private;
1565
1566 #ifdef EXTMOUSEDEBUG
1567 ErrorF("MouseCtrl pMse=%p\n", pMse);
1568 #endif
1569
1570 if ( pMse != NULL ) {
1571 pMse->num = ctrl->num;
1572 pMse->den = ctrl->den;
1573 pMse->threshold = ctrl->threshold;
1574 }
1575 }
pMseが変な値になっています。この前はNULLだったので、NULLかどうかチェックしていたのですが、今度は「変な値」なので、これは困った・・・
だれがどこでこんな値を設定しているんだろう。もっとコード全体を調べないといけないのでしょうか[E:shock]
鍵のひとつは、InputInfoPtrなpInfoの中身。
(gdb) p *pInfo
$4 = {next = 0x10000000006, name = 0x0, flags = 32644096, device_control = 0,
read_input = 0x81506aa20, control_proc = 0x2, close_proc = 0x81506aa50,
switch_mode = 0, conversion_proc = 0x1,
reverse_conversion_proc = 0x460640 <acceleratePointerPredictable>,
set_device_valuators = 0x8199d19a0, fd = 4582592, atom = 0, dev = 0x1,
private = 0xffffffff00000001, private_flags = -1, first = 0, last = 1,
old_x = 0, old_y = 1,
type_name = 0xffffffff <Error reading address 0xffffffff: Bad address>,
always_core_feedback = 0x409e000000000000, conf_idev = 0x4080e00000000000,
drv = 0x801f66cc0, module = 0x814c33880, options = 0x8163e07f0,
history_size = 256}
privateと、private_flagsというのがたぶん、なんだかな~、なんだと思うんですが、コードを読んでないのでわかりません。[E:coldsweats01]
とりあえず、
if ( pMse != NULL )
を、
if ( pMse != NULL && pInfo->private_flags == 0 )
とかにしてみました。まったく根拠ないですが!!
☆
似たような症例をFedora方面で見かけました。ただ落ちる場所が違うので、まだよく読んでいませんが、調べておこうかな。
☆
0 件のコメント:
コメントを投稿