2010年11月26日金曜日

(FreeBSD) USBキーボード/マウスを抜き差しするとたまにXサーバーがsegmentation faultで落ちる (2)

(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方面で見かけました。ただ落ちる場所が違うので、まだよく読んでいませんが、調べておこうかな。

Bug 483297 - X server crash on USB HUB random reset 
https://bugzilla.redhat.com/show_bug.cgi?id=483297



20101125





0 件のコメント:

コメントを投稿