Jadawinの日記: うーん、firefoxがねぇ。 4
日記 by
Jadawin
環境:
FreeBSD 8.2-PRERELEASE/amd64、firefox 3.6.13,1
現象:
firefoxがIllegal instructionで落ちる。例えば、メニューでQuitを選択したとき、ポップアップメニューでCopy Link Locationを選んだとき、Most Visitedから「Jadawinの友達」を選んだとき、、、エトセトラ。
疑い:
Adobeのflashプレイヤー、IPV6、プロセスのリソース。
どうにもわからんです。ヒント下さい。
Illegal Instruction なんだから (スコア:1)
CPU命令としてありえないバイト列を実行しようとしたってことで。
ということはどこかの段階でジャンプ先がオカシイってことだよねぇ。
しかもそのページ、Executable フラグは立っているってことだから、プログラム本体か、.so ファイルか、どっちか。
多分スタック自体は「おかしいところにジャンプする前」のアドレスも知っているだろうから、とりあえず core ファイルを吐かせてみたら?
で、デバッガでスタックを追いかければ、どのライブラリからどのライブラリへと飛んだのか判るはず。
最後にスタックに積んであるアドレスが「おかしいところ」なので、その一歩手前(上から勘定して2つ目)の関数がおかしい奴。そいつがなんというライブラリに所属しているのかを見る。
で、とりあえず、そいつを使わずにいられるかどうか、チェック。
fjの教祖様
Re:Illegal Instruction なんだから (スコア:1)
ありがとうございます。
言われた通りやってみようとしたのですが、、、
(1) makeのオプションでデバッグを選んでも、デバッグシンボル付きのバイナリを作れない。
(2) コアを吐かせてからgdbを起動すると、No stackと言われる。
(3) gdb内で走らせると、メニュー選択した所でフォーカスをつかんだままだんまり。gdbごと叩き殺すことに。
てな状況で、ダルマさんな感じです。
#まだだ。まだ終わらんぞ。
Re:Illegal Instruction なんだから (スコア:1)
まずは、(2)からでしょうか。
core ファイルが「本当は何の core ファイルなのか」から追跡してはどうでしょう?
fork/exec を繰り広げるプログラムの場合(Firefoxもその一つですが)、coreを吐いてもそれが「何の」coreなのかを間違えると何がなんだか判らなくなります。
とやると文字列がずらずらと出てくるかと思いますが、その中に ARGV[0] がいるはずです。つまり実行プログラムの本体を示す文字列がどこかにあるはず。gdb は「本当のバイナリ」相手でなくてはちゃんと動けませんから(そして実行バイナリの方を優先して解釈しますから)、ここが間違っていると No stack と言われることもあります。
fjの教祖様
Re:Illegal Instruction なんだから (スコア:1)
どうやら正体はdbus-launchでした。で、firefoxがdbusを要求しているのに、
dbusサービスが動いていない(/etc/rc.confにdbus_enable="YES"が
なかったので)という状況でした。
サービスを起動したら、現象は治まったのでこれで解決とします。おおまぬけにお
つきあいありがとうございました。
#今までよく他で問題がでなかったもんだ。