Debugging Mozilla on Linux FAQ

by 3 contributors:

Linux における Mozilla のデバッグ FAQ です。ここで解説している方法を使うと、デバッグがしやすくなり、GDB が抱えている問題点への対応も楽になります。

GDB の問題点の中には Mozilla によって悪化するものがあります。そのうち最も深刻な問題は、GDB のメモリの使い方で、Mozilla コンポーネントのデバッグ中に発生します。GDB は、Mozilla デバッグ中に何百メガにもなることがあります。この問題を回避するために必要なことは、Mozilla のコンポーネント・ライブラリを 1 つづつ必要な時にだけロードすることです。このプロセスについては、この FAQ で 解説 しています。このような問題が発生するのは、コンピュータが 256 メガ以下の RAM しか積んでいない時です。

ディストリビューションの多くが使っている GDB のバージョンは、少し古くなっています。このドキュメント執筆時点での GDB の最新バージョンは 6.8 です。バージョン 5.0 以降は、以前のバージョンよりも Mozilla のデバッグにずっと便利になっています。これらのバージョンでは、シンボルをロードするのが遅いという問題が解決されていて、さらに、以前のバージョンよりもスレッドの機能が改善されています。しかし、GDB が Mozilla との組み合わせでメモリを大量に使用するという問題については、5.0 リリースの GDB でも解決されていません。

GDB の最新のコピーは sourceware の GDB サイト にあります。

Linux で Mozilla をデバッグするにはどうしたらいいのですか?

firefox スクリプトは、ブラウザを起動するものですが、デバッガの起動にも使うことができます。以下のようにしてください。

[blizzard@gunhead bin]$ cd mozilla/dist/bin
[blizzard@gunhead bin]$ ./firefox -g

こうすると実際には ddd が起動しますが、これは GDB のグラフィカルなフロントエンドです。もし ddd がインストールされていないか、gdb を利用したければ、

[blizzard@gunhead bin]$ ./firefox -g -d gdb

GDB の使い方についてはこのドキュメントの範囲を超えています。GDB のドキュメントは、GDB のあるシステムであれば info ページ形式で提供されています。gnome ヘルプブラウザを使って読むといいでしょう。Linux の info リーダーは使いにくいという人が多いからです。

さらに、グラフィカルなフロントエンドを GDB に使うこともできます。dddinsight のようなものです。

以下のサイトにはもっと詳しい情報があります。

Firefox のデバッグ中にこの FAQ を見るにはどうしたらいいですか?

既定では、Firefox のプロセスはすべて「default」という名前の同じプロファイルを使用します。Firefox のプロセスがすでに実行されている場合、次に実行したプロセスはそのプロファイルが使用中であることに気付いて、起動することを拒みます。

そのため、デバッグ用に別のプロファイルを使用してください。これはいずれにしても良い選択です。なぜなら、プロファイルには様々な重要なデータも含まれていますが、デバッグのためのセッションがこれらを削除してしまう可能性があるためです。コマンドラインで以下のようにしてプロファイルを指定できます。

$ ./firefox -no-remote -P MyDebugProfile

(引数 -no-remote はリモート用コードを無効にします。いくつかのプラットフォームでは、リモーティングが一度に二つのプロファイルを利用することを妨げます。)

デバッガがメモリをたくさん食ってしまいます。どうやって解決したらいいのですか?

この FAQ のはじめに触れたように、GDB は Mozilla の共有ライブラリをロードする時にたくさんのメモリを使います。これを解決するには、共有ライブラリを本当に必要な時になって初めてロードするようにします。

しかし、ここで重要なことがあります。libc や pthreads のようなベース・ライブラリをロードしてから、GDB が共有ライブラリをロードするのを止めるようにしてください。こういったベース・ライブラリがロードされていないと、GDB が Linux でスレッドをきちんとデバッグすることができなくなります。Mozilla は、pthreads をネットワーク・ライブラリに使うため、スレッド化された環境で動作する必要があります。

そのためには次のようにするのが一番です。main にブレークポイントを設定し、プログラムを main まで実行し、この時点でライブラリの自動ロードをオフにします。ここからは、プログラムを走らせておくことができます。以下に例を挙げます。

[blizzard@gunhead mozilla]$ cd dist/bin/
[blizzard@gunhead bin]$ ./mozilla -g
.//run-mozilla.sh -g ./mozilla-bin
MOZILLA_FIVE_HOME=/home/blizzard/src/mozilla/mozilla/dist/bin
  LD_LIBRARY_PATH=/home/blizzard/src/mozilla/mozilla/dist/bin
       SHLIB_PATH=/home/blizzard/src/mozilla/mozilla/dist/bin
          LIBPATH=/home/blizzard/src/mozilla/mozilla/dist/bin
      MOZ_PROGRAM=./mozilla-bin
      MOZ_TOOLKIT=
        moz_debug=1
     moz_debugger=
/usr/bin/gdb ./mozilla-bin -x /tmp/mozargs22288
GNU gdb 19991004
Copyright 1998 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i386-redhat-linux"...
(gdb) b main
Breakpoint 1 at 0x804ec45: file nsAppRunner.cpp, line 811.
(gdb) r
Starting program: /home/blizzard/src/mozilla/mozilla/dist/bin/./mozilla-bin

Breakpoint 1, main (argc=1, argv=0xbffff894) at nsAppRunner.cpp:811
811       InstallUnixSignalHandlers(argv[0]);
(gdb) set auto-solib-add 0
(gdb) c
Continuing.
nsNativeComponentLoader: autoregistering begins.
[...]

GDB に関数を定義して上記の動作を自動的に行なわせるのは簡単です。ホーム・ディレクトリにある <tt>.gdbinit</tt> ファイルにこの関数を追加してください。

def prun
        tbreak main
        run
        set auto-solib-add 0
end
共有ライブラリをロードするにはどうしたらいいのですか?

共有ライブラリ自動ロードをオフにしている場合には、共有ライブラリを随時ロードする必要があります。GDB には、プログラムが立ちあがっている時にライブラリをロードするコマンドがあります。sharedlibrary コマンドです。GDB で使う時には、shar と短縮することもできます。このコマンドの引数は、ロードするライブラリの正規表現です。

バージョン 4.18 のデバッガでは以下のようになります。

^C
Program received signal SIGINT, Interrupt.
0x404ccdeb in __sigsuspend (set=0xbf5ffbc0)
    at ../sysdeps/unix/sysv/linux/sigsuspend.c:48
48      ../sysdeps/unix/sysv/linux/sigsuspend.c: No such file or directory.
Current language:  auto; currently c
(gdb) shar glib
Reading symbols from /usr/lib/libglib-1.2.so.0...done.
(gdb)

バージョン 5.x のデバッガでは以下のようになります。

^C
Program received signal SIGINT, Interrupt.
[Switching to Thread 2051 (runnable)]
0x404ccdeb in __sigsuspend (set=0xbf5ffbac)
    at ../sysdeps/unix/sysv/linux/sigsuspend.c:48
48      ../sysdeps/unix/sysv/linux/sigsuspend.c: No such file or directory.
Current language:  auto; currently c
(gdb) shar gtk
Reading symbols from /usr/lib/libgtk-1.2.so.0...done.
Loaded symbols for /usr/lib/libgtk-1.2.so.0
Reading symbols from /usr/lib/gtk/themes/engines/libthinice.so...done.
Loaded symbols for /usr/lib/gtk/themes/engines/libthinice.so
(gdb)

上記からわかるように、GDB では、2 つ以上のライブラリを同じロード・コマンドでロードすることができます。

どのライブラリがロード済みなのかはどうしたらわかるのですか?

ロード済みのライブラリを調べるには、info sharedlibrary コマンドを使います。

(gdb) info shar
From        To          Syms Read   Shared Object Library
0x4044a000  0x4044d08c  Yes         /lib/libdl.so.2
0x4044e000  0x4048ff90  Yes         /usr/lib/libstdc  -libc6.1-1.so.2
0x40491000  0x404ad9d8  Yes         /lib/libm.so.6
0x404ae000  0x405a285c  Yes         /lib/libc.so.6
0x40000000  0x40013ed0  Yes         /lib/ld-linux.so.2
0x40607000  0x4061554c  No          /usr/lib/libz.so.1
0x40763000  0x4088af74  No          /usr/lib/libgtk-1.2.so.0
0x4088b000  0x408c04d4  No          /usr/lib/libgdk-1.2.so.0
[...]
GDB が共有ライブラリをロードするのにやたらと時間がかかります。一体何が起こっているのですか?

バージョン 5 より古い GDB は、非常に遅いアルゴリズムを使って、ロード済みシンボルのリストを、シンボル・テーブルにシンボルを付け足す度に、検索しています。この問題は GDB のバージョン 5 でフィックスされています。それ以前のバージョンについてはフィックスがありません。

ロードされていないライブラリにブレークポイントをセットするにはどうしたらいいのですか?

残念ながら、ロードされていないライブラリで GDB にブレークポイントを設定する方法はありません。実際のコンポーネントがロードされた時にブレークポイントを設定するのに本当に興味があるという場合には、次の章を読んでください。

ライブラリがロードされた時にどうしてもブレークポイントを設定したいという場合には、_dl_open というシンボルにブレークポイントを設定することができます。この関数は、新しいライブラリがロードされた時に呼び出されます。ブレークポイントを設定するのは、ライブラリがロードされたのを確認してからにしてください。

コンポーネントがロードされた時にブレークポイントをセットするにはどうしたらいいのですか?

XPCOM の機能の一つに次のようなものがあります。ある環境変数を設定すると、特定のコンポーネントをロードした時にプログラムをデバッガに落としてくれるというものです。

必ず、XPCOM_BREAK_ON_LOAD という環境変数を設定してから、Mozilla を立ちあげるようにしてください。この変数は、ロードするライブラリの名前を含む文字列で設定してください。例えば、raptor あるいは necko という名前のライブラリがロードされた時に止めたいという場合には、この変数を raptor:necko に設定することができます。以下に例を挙げます。

(gdb) set env XPCOM_BREAK_ON_LOAD raptor:necko
(gdb) prun
こんなこと難しすぎてやってられません。動作する .gdbinit が欲しいんですけど。

了解です。これをコピーしてください。

# .gdbinit file for debugging Mozilla

# run when using the auto-solib-add trick
def prun
  tbreak main
  run
  set auto-solib-add 0
  cont
end

# run -mail, when using the auto-solib-add trick
def pmail
  tbreak main
  run -mail
  set auto-solib-add 0
  cont
end

# define "pu" command to display PRUnichar * strings (100 chars max)
def pu
  set $uni = $arg0 
  set $i = 0
  while (*$uni && $i++<100)
    if (*$uni < 0x80) 
      print *(char*)$uni++
    else
      print /x *(short*)$uni++
    end
  end
end

# define "ps" command to display nsString/nsAutoString/nsCString/nsCAutoString
def ps
  set $ns = $arg0 
  if ($ns->mCharSize)
    pu $ns->mUStr
  else
    print $ns->mStr
  end
end

関数の定義が 4 つ入っています。

  • "prun" は、ブラウザを起動しライブラリのロードを使用不可にします。
  • "pmail" は、メールを起動します。
  • "pu" は、(PRUnichar *) 文字列を 1 つ表示します。
  • "ps" は、nsString を 1 つ表示します。
ブレークポイントをセットできません。どうしてですか?

多分、ブレークポイントを設定できないのは、ブレークポイントが配置されているライブラリがまだロードされていないからです。ライブラリが Mozilla に本当にロードされているのにブレークポイントが設定できないという場合には、上の 共有ライブラリをロードする を読んでください。ライブラリがまだロードされていないという場合には、ロードされるまで待たなければなりません。ブレークポイントを、ライブラリがロードされ次第設定したいという場合には、上の コンポーネントがロードされた時にブレークする および ライブラリがロードされた時にブレークする を見てください。

PRUnichar を表示するにはどうしたらいいのですか?

対応方法が各種提案されています。

(gdb) print ((PRUnichar*)uri.mBuffer)[0]@16
$47 = {114, 100, 102, 58, 110, 117, 108, 108, 0, 0, 8, 0, 0, 0, 37432,
16514}
(gdb) print aURI
$1 = (const PRUnichar *) 0x855e6e0
(gdb) x/32ch aURI
0x855e6e0:      104 'h' 116 't' 116 't' 112 'p' 58 ':'  47 '/'  47 '/'  119 'w'
0x855e6f0:      119 'w' 119 'w' 46 '.'  109 'm' 111 'o' 122 'z' 105 'i' 108 'l'
0x855e700:      108 'l' 97 'a'  46 '.'  111 'o' 114 'r' 103 'g' 47 '/'  115 's'
0x855e710:      116 't' 97 'a'  114 'r' 116 't' 47 '/'  0 '\0'  25 '\031'       0 '\0'
(gdb)

あるいは、<tt>.gdbinit</tt> にヘルパー関数を定義してください。

# "pu"コマンドを定義して PRUnichar * 文字列を (最大 100 文字) 表示する。
 def pu
   set $uni = $arg0
   set $i = 0
   while (*$uni && $i  <100)
     if (*$uni < 0x80)
       print *(char*)$uni
     else
       print /x *(short*)$uni
     end
   end
 end
 
 # "ps" コマンドを定義して nsString/nsAutoString/nsCString/nsCAutoString を表示する。
 def ps
   set $ns = $arg0
   if ($ns->mCharSize)
     pu $ns->mUStr
   else
     print $ns->mStr
   end
 end

あるいは、#ifdef NS_DEBUG コードのどこかに "punichar" という小さなヘルパー関数を定義してください。

nsString を表示するにはどうしたらいいのですか?

ToNewCString() メソッドを、表示したい nsString 上で呼びだすことができます。こうするとメモリーリークが少し起きますが、1 つの GDB セッション中に数回しか呼びださないのであれば問題にはならないはずです。(akkana@netscape.com より)

(gdb) p string.ToNewCString()
ポインタが指しているオブジェクトの具象タイプをインターフェイスポインタで指定するにはどうしたらいいのですか?

ポインタが指しているオブジェクトの具象タイプを XPCOM インターフェイス・ポインタで指定するには、そのオブジェクトの vtable のシンボルの短縮名を指すようにしてください。

(gdb) p aKidFrame
$1 = (nsIFrame *) 0x85058d4
(gdb) x/wa *(void**)aKidFrame
0x4210d380 <__vt_14nsRootBoxFrame>: 0x0
(gdb) p *(nsRootBoxFrame*)aKidFrame
 [ all the member variables of aKidFrame ]

(gcc 3.x を使っている場合には、出力が上記 (gcc 2.9x でのもの) と少し違ってきますが、ここで注目してほしいのは、最初のバーチャル関数の短縮名ではなく、vtable シンボル (この場合には _ZTV14nsRootBoxFrame) です。最初のバーチャル関数を指定変更しないクラスもあるからです (通常は QueryInterface なので指定変更しますが)。)

注意してほしいのは、指しているオブジェクトの実装を含んだ共有ライブラリがロードされていない場合には、何も得ないことになるということです。上の 共有ライブラリをロードするにはどうしたらいいのですか? および ロード済みのライブラリを調べるにはどうしたらいいのですか? を読んでください。

GDB の "run" や "prun" が "error in loading shared libraries" を吐いて失敗します。

GDB において mozilla-bin を走らせようとすると、以下にあげるようなメッセージと似たエラーを吐いて失敗します。

Starting program: /u/dmose/s/mozilla/mozilla-all/mozilla/dist/bin/./mozilla-bin
/u/dmose/s/mozilla/mozilla-all/mozilla/dist/bin/./mozilla-bin: error in loading shared libraries: libraptorgfx.so: cannot open shared object file: No such file or directory

おそらく、LD_LIBRARY_PATH が、.cshrc あるいは .profile によってリセットされています。GDB マニュアルには次のような記述があります。

警告:GDB は、`SHELL' 環境変数が存在する場合には (存在しなければ `/bin/sh') そこで指定されているシェルを使ってプログラムを実行します。`SHELL' 変数が初期設定ファイル -- C シェルであれば `.cshrc'、BASH であれば `.bashrc' -- を指定している場合には、その初期設定ファイル中に設定した変数が全てプログラムに影響を及ぼします。環境変数の設定を、ログオンした時だけに実行されるファイル、`.login' あるいは `.profile' など、に移すことができます。
GDB/ddd を使ってアプリケーションに引数を渡すにはどうしたらいいのですか?

現時点では引数の受け渡しは ./mozilla -g your-list-of-arguments を使えばできるはずです。例えば、スタートアップ時にメールを立ちあげたい場合には、以下のような Mozilla スクリプトを呼びだすことができます: ./mozilla -g -mail

prun で引数を渡すにはどうしたらいいのですか?

GDB で引数を設定してから prun を呼びだしてください。以下に設定方法の例を挙げます。

(gdb) set args http://www.mozilla.org
(gdb) prun
Mozilla が異常終了しています。どこにブレークポイントをセットすれば Mozilla がどこで終了しているかわかるのですか?

Linux では、2 つのシンボルがこの問題を引き起こしている可能性があります。PR_ASSERT() および NS_ASSERTION() です。プログラムが終了する前にキャッチしてどこで発生しているかを調べるには、2 箇所で中断することができます。

(gdb) b abort
(gdb) b exit
私は Minefield のウィンドウと向き合っているのに、デバッガはあたかもすでにプロセスが終了したかのように振る舞います。なぜでしょう?

Firefox は、特に最近のビルドでは、起動時に新しいプロセスで自らを再起動することがあります。この現象が起きた場合、GDB は自動的に新しいプロセスに付随しません。(これに関しては GDB で設定できますが、より良い方法があります。)

実行中のプロセスに GDB が付随しているかどうかは、以下のようにして調べられます。

(gdb) info task

回復するには、まず実際の Firefox のプロセスの pid を見つけて、GDB の attach コマンドを実行します。

(gdb) attach 533
Attaching to program: `/home/kaitlin/mozilla/obj-ff-debug/dist/bin/firefox-bin', process 533.
Reading symbols for shared libraries ++... done
0x90009cd7 in read ()

必ずひとつのプロセスで Firefox を実行するよう firefox に伝えるには、デバッグを始める前に以下の環境変数を設定します。

$ MOZ_NO_REMOTE=1; export MOZ_NO_REMOTE
$ NO_EM_RESTART=1; export NO_EM_RESTART
$ ./firefox -g

MOZ_NO_REMOTE=1 はコマンドラインオプション -no-remote と同等です (Firefox を含むすべての XULRunner アプリケーションにより認識されます)。既に動作している Firefox のプロセスを使うために見つけようとする、リモート用コードを無効にします。

Firefox 自身の再起動に関する、もう一つの起こり得る理由はプロファイルマネージャです。プロファイルマネージャを避けるためには、-P profileName または -p directory を利用してコマンドライン firefox でプロファイルを指定します。

デバッガに SIG32 が出ています。どうやって解決したらいいのですか?

SIG32 が Mozilla のデバッグ中に出ている場合には、共有ライブラリのロードを pthreads ライブラリがロードされるまえにオフにした可能性があります。例えば、.gdbinit ファイルに set auto-solib-add 0 を指定しているなどです。

こういった場合には、次のいずれかの方法で対処することができます。

  • その指定を削除し、GDB のメモリの使い方 で説明しているメソッドを代わりに使います。
  • GDB あるいは .gdbinit ファイルで handle SIG32 noprint を使います。

あるいは、問題があるのは pthread ライブラリかもしれません。ライブラリのシンボルが除去されていると、GDB はスレッド・イベントにフックすることができず、SIG32 シグナルが出ることになります。libpthread が除去されているかどうかを調べるには、file /lib/libpthread* の出力に 'stripped' があるかどうかを調べてください。この問題点を Gentoo Linux でフィックスするには、"nostrip"/etc/make.confFEATURES に追加してから glibc を再構築してください。

競合状態をデバッグするにはどうすればいいのですか。NS_ASSERTION 時に異る動作をさせるにはどうしたらいいのですか。

Linux は、マルチスレッド・アプリケーションに有用な core ファイルを生成できないので、デバッガでめったに現れない状況を見つけ出すのは少し難しいかもしれません。

--enable-crash-on-assert スイッチを configure に設定していない限り、現時点では、XPCOM_DEBUG_BREAK 環境変数を使って NS_ASSERTION (実際には nsDebug::Break) の動作を変更することができます。

Linux にはどんなパフォーマンスツールがありますか。

Jim Nancejprof という、サンプリングを使ってパフォーマンスを分析するツールを作っています。他のツールは、パフォーマンスツールのページ に載っています。

残念ながら、Linux 用には Quantify のようなツールはありません。Solaris では Quantify を実行することになります。

Mozilla のデバッガを emacs あるいは xemacs で実行するにはどうしたらいいのですか。

Emacs および XEmacs には、視覚的なデバッグ用のモードがあり、これを使っているプログラマがたくさんいます。ですが、環境変数を設定すると、デバッガと Mozilla に、どこからシンボルをロードするのか、および、どこでコンポーネントをみつけるのか、をきちんと知らせることができるようになります。

最も簡単にこういった環境変数を設定するには、ビルドの dist/bin ディレクトリにある run-mozilla.sh スクリプトを使います。このスクリプトで、エディタ、シェルまたはデバッガで実行するのに必要な環境を設定します。その他にも、このスクリプトを使って /bin/bash (またはお好みのシェル) を実行し、適切な構成をしたシェルをセットアップする方法です。こうすると、このシェルでどんなコマンドも実行することができます。

[blizzard@gunhead bin]$ ./run-mozilla.sh /bin/bash
MOZILLA_FIVE_HOME=/home/blizzard/src/mozilla/build/dist/bin
  LD_LIBRARY_PATH=/home/blizzard/src/mozilla/build/dist/bin
     LIBRARY_PATH=/home/blizzard/src/mozilla/build/dist/bin
       SHLIB_PATH=/home/blizzard/src/mozilla/build/dist/bin
          LIBPATH=/home/blizzard/src/mozilla/build/dist/bin
       ADDON_PATH=/home/blizzard/src/mozilla/build/dist/bin
      MOZ_PROGRAM=/bin/bash
      MOZ_TOOLKIT=
        moz_debug=0
     moz_debugger=
[blizzard@gunhead bin]$
GDB 5 が以前は動作していたのに今は Mozilla が起動しなくなってしまいました。どうしたらいいのですか?

最近スレッドが変更になった (といっても 2004 年のこと。詳細は バグ 57051 を見てください) ために問題が生じているシステムがあります。Mozilla の初期化の途中までいくとウインドウを表示する前に失敗します。

最近 GDB が変更になり、この問題は修正されています。Insight の最新バージョン、あるいは、GUI がお好みでないという場合には GDB の最新バージョン を、ダウンロードしてビルドしてください。

Mozilla を Valgrind で走らせるとスタートアップでクラッシュします。どうしたらいいのですか?

Mozilla の GTK 2 ビルドには ORBit がありますが、これは malloc() が使うメモリ配置に依存します。システム・インプリメンテーションは 8 バイトに位置合わせをしますが、Valgrind はデフォルトでは 4 バイトに位置合わせをします。このことによって ORBit がクラッシュします。

Mozilla を Valgrind で実行するには、Valgrind に --alignment=8 オプションを付けて使うことをお薦めします。

gdb で JavaScript のスタックを見るにはどうしたらいいのですか?

JavaScript スタックはネイティブスタックの中には現れません (例えば、the stuff gdb prints with bt/where)。しかしながら、gdb プロンプトで call DumpJSStack() を入力することで JS スタックを表示するための関数を実行することができます。Mozilla のデバッグビルドを利用する必要があることに注意してください (さもないとシンボルが見つからないエラーが起こります)。また、この関数の出力はブラウザを起動したターミナルに送られることにも注意してください。もし異なるターミナルの中で gdb を起動している場合、そこでなにも起きていないかのように見えるでしょう!

以下にデバッグしているセッションの例を挙げます。

[...Firefox は既に起動しており、gdb で接続します...]

$ gdb -p `pgrep firefox-bin`
[...大量の出力...]

(gdb) break nsSecretDecoderRing::Encrypt
Breakpoint 1 at 0xb25bb780: file /home/dolske/ff/ff-trunk/mozilla/security/manager/ssl/src/nsSDR.cpp, line 139.

(gdb) c
Continuing.

[...Gmail に移動し、無作為なユーザ名とパスワードを入力、それを Firefox に覚えさせる...]

Breakpoint 1, nsSecretDecoderRing::Encrypt (this=0x8febf30, data=0x8ea1620 "fakeuser", dataLen=8,
    result=0xbff16a10, _retval=0xbff16a0c)
    at /home/dolske/ff/ff-trunk/mozilla/security/manager/ssl/src/nsSDR.cpp:139
139       nsNSSShutDownPreventionLock locker;

(gdb) bt

#0  nsSecretDecoderRing::Encrypt (this=0x8febf30, data=0x8ea1620 "fakeuser", dataLen=8, result=0xbff16a10,
    _retval=0xbff16a0c) at /home/dolske/ff/ff-trunk/mozilla/security/manager/ssl/src/nsSDR.cpp:139
#1  0xb25bb268 in nsSecretDecoderRing::EncryptString (this=0x8febf30, text=0x8ea1620 "fakeuser",
    _retval=0xbff16bc8) at /home/dolske/ff/ff-trunk/mozilla/security/manager/ssl/src/nsSDR.cpp:232
#2  0xb7ddb729 in NS_InvokeByIndex_P ()
    at /home/dolske/ff/ff-trunk/mozilla/xpcom/reflect/xptinfo/src/xptiInterfaceInfo.cpp:73
#3  0xb698890b in XPCWrappedNative::CallMethod (ccx=@0xbff16d00, mode=XPCWrappedNative::CALL_METHOD)
    at /home/dolske/ff/ff-trunk/mozilla/js/src/xpconnect/src/xpcwrappednative.cpp:2346
#4  0xb699595c in XPC_WN_CallMethod (cx=0x8408d40, obj=0xaeca2e60, argc=1, argv=0x8fd7b54, vp=0xbff16e14)
    at /home/dolske/ff/ff-trunk/mozilla/js/src/xpconnect/src/xpcwrappednativejsops.cpp:1467
#5  0xb7e67d71 in js_Invoke (cx=0x8408d40, argc=1, vp=0x8fd7b4c, flags=0)
    at /home/dolske/ff/ff-trunk/mozilla/js/src/jsinterp.c:1386
#6  0xb7e72cf9 in js_Interpret (cx=0x8408d40, pc=0x8ecfc2e ":", result=0xbff172d0)
    at /home/dolske/ff/ff-trunk/mozilla/js/src/jsinterp.c:4146
#7  0xb7e67de8 in js_Invoke (cx=0x8408d40, argc=1, vp=0x8fd798c, flags=2)
    at /home/dolske/ff/ff-trunk/mozilla/js/src/jsinterp.c:1406
#8  0xb69828a0 in nsXPCWrappedJSClass::CallMethod (this=0x8ed0c50, wrapper=0x8ed1a00, methodIndex=5,
    info=0x89b2800, nativeParams=0xbff175a4)
    at /home/dolske/ff/ff-trunk/mozilla/js/src/xpconnect/src/xpcwrappedjsclass.cpp:1441
#9  0xb697b27b in nsXPCWrappedJS::CallMethod (this=0x8ed1a00, methodIndex=5, info=0x89b2800, params=0xbff175a4)
    at /home/dolske/ff/ff-trunk/mozilla/js/src/xpconnect/src/xpcwrappedjs.cpp:567
#10 0xb7ddc4fb in PrepareAndDispatch (methodIndex=<value optimized out>, self=0x8ed04d0,
    args=<value optimized out>)
    at /home/dolske/ff/ff-trunk/mozilla/xpcom/reflect/xptcall/src/md/unix/xptcstubs_gcc_x86_unix.cpp:95
#11 0xb7ddb729 in NS_InvokeByIndex_P ()
    at /home/dolske/ff/ff-trunk/mozilla/xpcom/reflect/xptinfo/src/xptiInterfaceInfo.cpp:73
#12 0xb698890b in XPCWrappedNative::CallMethod (ccx=@0xbff17914, mode=XPCWrappedNative::CALL_METHOD)
    at /home/dolske/ff/ff-trunk/mozilla/js/src/xpconnect/src/xpcwrappednative.cpp:2346
#13 0xb699595c in XPC_WN_CallMethod (cx=0x8408d40, obj=0xafdfe8e0, argc=1, argv=0x8fd7974, vp=0xbff17a28)
    at /home/dolske/ff/ff-trunk/mozilla/js/src/xpconnect/src/xpcwrappednativejsops.cpp:1467
#14 0xb7e67d71 in js_Invoke (cx=0x8408d40, argc=1, vp=0x8fd796c, flags=0)
    at /home/dolske/ff/ff-trunk/mozilla/js/src/jsinterp.c:1386
#15 0xb7e72cf9 in js_Interpret (cx=0x8408d40, pc=0x89ac0ab ":", result=0xbff17ee4)
    at /home/dolske/ff/ff-trunk/mozilla/js/src/jsinterp.c:4146
#16 0xb7e67de8 in js_Invoke (cx=0x8408d40, argc=1, vp=0x8fd7944, flags=2)
    at /home/dolske/ff/ff-trunk/mozilla/js/src/jsinterp.c:1406
#17 0xb69828a0 in nsXPCWrappedJSClass::CallMethod (this=0x89b5200, wrapper=0x89b5320, methodIndex=3,
    info=0x89b2b38, nativeParams=0xbff181b8)
    at /home/dolske/ff/ff-trunk/mozilla/js/src/xpconnect/src/xpcwrappedjsclass.cpp:1441
#18 0xb697b27b in nsXPCWrappedJS::CallMethod (this=0x89b5320, methodIndex=3, info=0x89b2b38, params=0xbff181b8)
    at /home/dolske/ff/ff-trunk/mozilla/js/src/xpconnect/src/xpcwrappedjs.cpp:567
#19 0xb7ddc4fb in PrepareAndDispatch (methodIndex=<value optimized out>, self=0x89b5168,
    args=<value optimized out>)
    at /home/dolske/ff/ff-trunk/mozilla/xpcom/reflect/xptcall/src/md/unix/xptcstubs_gcc_x86_unix.cpp:95
#20 0xb7ddb729 in NS_InvokeByIndex_P ()
    at /home/dolske/ff/ff-trunk/mozilla/xpcom/reflect/xptinfo/src/xptiInterfaceInfo.cpp:73
#21 0xb698890b in XPCWrappedNative::CallMethod (ccx=@0xbff18528, mode=XPCWrappedNative::CALL_METHOD)
    at /home/dolske/ff/ff-trunk/mozilla/js/src/xpconnect/src/xpcwrappednative.cpp:2346
#22 0xb699595c in XPC_WN_CallMethod (cx=0x8408d40, obj=0xaec97e00, argc=1, argv=0x8fd7938, vp=0xbff1863c)
    at /home/dolske/ff/ff-trunk/mozilla/js/src/xpconnect/src/xpcwrappednativejsops.cpp:1467
#23 0xb7e67d71 in js_Invoke (cx=0x8408d40, argc=1, vp=0x8fd7930, flags=0)
    at /home/dolske/ff/ff-trunk/mozilla/js/src/jsinterp.c:1386
#24 0xb7e72cf9 in js_Interpret (cx=0x8408d40, pc=0x8ebf995 ":", result=0xbff18af8)
    at /home/dolske/ff/ff-trunk/mozilla/js/src/jsinterp.c:4146
#25 0xb7e67de8 in js_Invoke (cx=0x8408d40, argc=1, vp=0x8fd77d4, flags=2)
    at /home/dolske/ff/ff-trunk/mozilla/js/src/jsinterp.c:1406
#26 0xb7e7bf6c in js_InternalInvoke (cx=0x8408d40, obj=0xaec960a0, fval=-1361882496, flags=0, argc=1,
    argv=0x8fd77d0, rval=0xbff18bfc) at /home/dolske/ff/ff-trunk/mozilla/js/src/jsinterp.c:1462
#27 0xb7e286d4 in JS_CallFunctionValue (cx=0x8408d40, obj=0xaec960a0, fval=-1361882496, argc=1, argv=0x8fd77d0,
...

(gdb) call DumpJSStack()

[...出力を見る Firefox を起動したターミナルの中を読みに行く...]

0 [native frame]
1 anonymous(plainText = "fakeuser") ["file:///home/dolske/ff/ff-trunk/mozilla/obj-ff/dist/bin/components/storage-Legacy.js":865]
    cipherText = null
    userCanceled = false
    converter = [xpconnect wrapped nsIScriptableUnicodeConverter @ 0x8fc9c60 (native @ 0x8f5c110)]
    plainOctet = "fakeuser"
    this = [object Object]
2 anonymous(sortByRealm = [function]) ["file:///home/dolske/ff/ff-trunk/mozilla/obj-ff/dist/bin/components/storage-Legacy.js":719]
    writeLine = [function]
    hostname = "https://www.google.com"
    lastRealm = null
    firstEntry = false
    userCanceled = false
    login = [xpconnect wrapped nsILoginInfo @ 0x8e6c398 (native @ 0x8ed5680)]
    hostrealm = "https://www.google.com"
    encUsername = undefined
    encPassword = "MDIEEPgAAAAAAAAAAAAAAAAAAAEwFAYIKoZIhvcNAwcECKV3kVgnFYFtBAgbBsB+kXooKQ=="
    outputStream = [xpconnect wrapped (nsISupports, nsIFileOutputStream, nsISafeOutputStream) @ 0x8fce5a0 (native @ 0x903bb10)]
    this = [object Object]
3 anonymous(login = [xpconnect wrapped nsILoginInfo @ 0x8e6c398 (native @ 0x8ed5680)]) ["file:///home/dolske/ff/ff-trunk/mozilla/obj-ff/dist/bin/components/storage-Legacy.js":197]
    clone = undefined
    key = "https://www.google.com"
    rollback = [xpconnect wrapped nsILoginInfo @ 0x8edfa20 (native @ 0x8eddcc8)],[xpconnect wrapped nsILoginInfo @ 0x8ee0708 (native @ 0x8edfb58)],[xpconnect wrapped nsILoginInfo @ 0x8ee0d30 (native @ 0x8ee06f8)]
    ok = undefined
    this = [object Object]
4 [native frame]
5 anonymous(login = [xpconnect wrapped nsILoginInfo @ 0x885c2c0 (native @ 0x8ed5680)]) ["file:///home/dolske/ff/ff-trunk/mozilla/obj-ff/dist/bin/components/nsLoginManager.js":364]
    logins = [xpconnect wrapped nsILoginInfo @ 0x8f8fd30 (native @ 0x8eddcc8)],[xpconnect wrapped nsILoginInfo @ 0x8fe6430 (native @ 0x8edfb58)],[xpconnect wrapped nsILoginInfo @ 0x8ff6318 (native @ 0x8ee06f8)]
    this = [object Object]
6 [native frame]
7 anonymous(aNotificationBar = [object XULElement @ 0x8f7e920 (native @ 0x8a4e638)], aButton = [object Object]) ["file:///home/dolske/ff/ff-trunk/mozilla/obj-ff/dist/bin/components/nsLoginManagerPrompter.js":360]
    this = [object BackstagePass @ 0x86e03b8 (native @ 0x811a87c)]
8 _doButtonCommand(aEvent = [object XULCommandEvent @ 0x8674298 (native @ 0x8fdea24)]) ["chrome://global/content/bindings/notification.xml":393]
    button = [object Object]
    callback = [function]
    result = undefined
    this = [object XULElement @ 0x8f7e920 (native @ 0x8a4e638)]
9 oncommand(event = [object XULCommandEvent @ 0x8674298 (native @ 0x8fdea24)]) ["chrome://browser/content/browser.xul":1]
    this = [object XULElement @ 0x8f34b20 (native @ 0x8a5c0e0)]
質問があるのですが、誰に聞けばいいのですか。

かつては netscape.public.mozilla.unix というニュースグループがありましたが、今は存在しません。irc.mozilla.org の #developers チャンネル で質問を投げてみてください。

原文書の情報

  • 著者: blizzard@mozilla.org, Bruce Mitchener, Dan Mosedale, and others
  • 最終更新日: December 28, 2004
  • 著作権: Portions of this content are © 1998–2007 by individual mozilla.org contributors; content available under a Creative Commons license | 詳細

ドキュメントのタグと貢献者

タグ: 
Contributors to this page: drry, Marsf, kohei.yoshino
最終更新者: drry,