[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[debian-devel:14736] Re: Bug#117685: xpostit: reproducable segfaults



佐野@浜松です。これも続報。

  on "Tue, 6 Nov 2001 01:45:54 +0900', I wrote:

> xpostit を Debian に upload したんですが、
> 「新規メモ作成」→「消滅」を二回繰り返すと
> Segmentation Fault で落ちるというバグレポートを
> もらいました。

 Bug#117685 です。

> で、ちょっと調べてみたんですが、2.2 (potato) の 3.3.6 環境では
> 同じ操作をしても全然問題ありません。が、たしかに unstable/sid の
> 4.1.0 環境で試してみると、libxaw6/libxaw7 のどちらでコンパイル
> しても落ちます。ただし落ちる場所はライブラリによって違うようです。
> 
> gdb で step 実行して追いかけてみると、xpostit のコード自体を
> 実行している時ではなく、ライブラリのコードを実行している時に
> 落ちているようなので、どうも X 関係のライブラリに問題の原因が
> あるのではないかと疑っているのですが、ちょっとまだ正体を
> 突き止めるところまでいっていません。

 XFree86 の 3.3.6 と 4.1.0 をソースから build して
 libXaw と libXt を -ggdb オプション付けて生成したものと
 xpostit をリンクして調べてみたところ、

 1) 落ちる箇所は Xaw7 の場合 TextAction.c の TextFocusOut() で

    while (shell) {
        if (XtIsShell(shell))
           break;
        shell = XtParent(shell);
    }

   として XtIsShell(shell) で
      shell->core.widget_class->core_class.class_inited
   を調べようとするが、この時何故か shell->core 以下が
   破壊されていて、widget_class にアクセスできず、その
   ために SegFault する

 2) 試しに xpostit の note.c で ConfirmDestroy() の
    中から呼び出している
      XtDestroyWidget(pn->pn_shellwidget);
    をコメントアウトすると、SegFault は発生しない。
    しかし、この場合
     「新規メモ作成」→「保存せずに destroy」
    を繰り返すと、使用メモリーが増えていく。
    たぶん memory leak しているものと思われる。

 3) XFree86 v3.3.6 の libXaw とリンクしていた場合、
    libXt など他のライブラリについては unstable/sid の
    環境で通常のパッケージから提供されるものとリンク
    していても、Segfault は発生しない。しかし、この時
     「新規メモ作成」→「保存せずに destroy」
    を繰り返すと、上記のように XtDestroyWidget() を
    コメントアウトした時ほど顕著ではないが、やはり
    徐々に使用メモリーが増えていく。
    確証は無いが v3.3.6 の時から既に memory leak していた ?

というところまでは追いかけました
 (先日の NLUG 勉強会で野首さんと雑談しながら :)

で、そのあと時間が取れなくてタッチしてないんですが、
上記を眺めて何か思い出したことがあるとか、思い当たる
節があるという方がいらっしゃいましたら、情報をお願いします。

 (元の職場の本棚を探したら、Motif 版の "X Toolkit 
  Intrinsics Programming Manual" (ただし対象は X11R4) と
  "The X Window System in a Nutshell" (対象は X11R4&5) が
  見つかったので、これでも読んで勉強しようかと借りては
  きたものの、時間が取れずに積ん読状態 ^^;;)

-- 
 # (わたしのおうちは浜松市、アカウミガメのふるさとの街)
   <kgh12351@xxxxxxxxxxx> : Taketoshi Sano (佐野 武俊)