11

私のFirefoxは今日からクラッシュし始めました。システムやFirefoxの設定は何も変更していません。

問題を追跡するために使用します。それは大きな助けではありません。
strace -ff -o dumpfile.txt firefox

生成された 2 つのプロセス ダンプに segfault が表示されますが、原因を突き止めるにはどうすればよいですか?

10 秒間実行してクラッシュした後、strace によって 22MB のデータが生成されます。

これは出力のスニペットで、実際の SIGSEGV が真ん中に表示されています。

読み取り (19、「\372」、1) = 1
gettimeofday({1245590019, 542231}, NULL) = 0
read(3, "\6\0[Qmy\26\0\3\1\0\0Y\0\200\2\0\0\0\0\323\3A\0\323\3(\0 \20\0\1\0", 4096) = 32
read(3, 0xf5c55058, 4096) = -1 EAGAIN (リソースが一時的に利用不可)
gettimeofday({1245590019, 542813}, NULL) = 0
poll([{fd=4, events=POLLIN}, {fd=3, events=POLLIN}, {fd=8, events=POLLIN|POLLPRI}, {fd=12, events=POLLIN|POLLPRI}, {fd= 13、イベント=POLLIN|POLLPRI}、{fd=14、イベント=POL
read(3, 0xf5c55058, 4096) = -1 EAGAIN (リソースが一時的に利用不可)
gettimeofday({1245590019, 543161}, NULL) = 0
gettimeofday({1245590019, 546672}, NULL) = 0
gettimeofday({1245590019, 546761}, NULL) = 0
read(3, 0xf5c55058, 4096) = -1 EAGAIN (リソースが一時的に利用不可)
gettimeofday({1245590019, 546936}, NULL) = 0
poll([{fd=4, events=POLLIN}, {fd=3, events=POLLIN}, {fd=8, events=POLLIN|POLLPRI}, {fd=12, events=POLLIN|POLLPRI}, {fd= 13、イベント=POLLIN|POLLPRI}、{fd=14、イベント=POL
poll([{fd=3, events=POLLIN|POLLOUT}], 1, 4294967295) = 1 ([{fd=3, revents=POLLOUT}])
writev(3, [{"5\30\4\0006\21\200\2\266\n\200\2\17\0]\3\230\4\5\0007\21\200\0026\ 21\200\2\317\0\0\0"..., 1624}, {NULL, 0}, {"", 0}], 3) = 1624
poll([{fd=3, events=POLLIN}], 1, 4294967295) = 1 ([{fd=3, revents=POLLIN}])
read(3, "\1\30\224Q\17\17\0\0\0\0\0\0\0\0\0\0000\235\273\0\0\0\0\0o\ 264Q\0\0\0\0\0"..., 4096) = 4096
read(3, "\375\240f\0\376\242j\0\377\261\200\0\271a+\0\271a+\0\377\261\200\0\376\252w\0\376\ 250 秒\0"..., 11356) = 11356
read(3, 0xf5c55058, 4096) = -1 EAGAIN (リソースが一時的に利用不可)
poll([{fd=3, events=POLLIN|POLLOUT}], 1, 4294967295) = 1 ([{fd=3, revents=POLLOUT}])
writev(3, [{"\230\32\7\0\1\21\200\2?\21\200\2\377\377\377\377\377\377\377\377\0\0 \0\0\17\0\1\0015\10\4\0"..., 956}, {NULL, 0}, {"", 0}], 3) = 956
poll([{fd=3, events=POLLIN}], 1, 4294967295) = 1 ([{fd=3, revents=POLLIN}])
read(3, "\1\30\256Q\17\17\0\0\0\0\0\0\0\0\0\0000\235\273\0\0\0\0\0o\ 264Q\0\0\0\0\0"..., 4096) = 4096
read(3, "\375\240f\0\376\242j\0\377\261\200\0\271a+\0\271a+\0\377\261\200\0\376\252w\0\376\ 250 秒\0"..., 11356) = 11356
read(3, 0xf5c55058, 4096) = -1 EAGAIN (リソースが一時的に利用不可)
--- SIGSEGV (セグメンテーション違反) @ 0 (0) ---
unlink("/home/userrrr/.mozilla/firefox/mvbnkitl.default/lock") = 0
rt_sigaction(SIGSEGV, {SIG_DFL, ~[HUP INT QUIT ABRT BUS FPE KILL PIPE CHLD CONT TTOU URG XCPU WINCH RT_1 RT_2 RT_3 RT_4 RT_8 RT_11 RT_14 RT_17 RT_22], SA_NOCLDSTOP},
rt_sigprocmask(SIG_BLOCK, ~[ILL ABRT BUS FPE SEGV RTMIN RT_1], ~[KILL STOP RTMIN RT_1], 8) = 0
open("/home/userrrr/.mozilla/firefox/mvbnkitl.default/minidumps/56b30367-5ee2-0495-32646b7f-59dc87e9.dmp", O_WRONLY|O_CREAT|O_EXCL, 0600) = 63
クローン (child_stack = 0xf5bfffe4、フラグ = CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_UNTRACED) = 18929
waitpid(18929, NULL, __WALL) = 18929
オープン (「/proc/18913/タスク」、O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|O_CLOEXEC) = 64
fstat64(64, {st_mode=S_IFDIR|0555, st_size=0, ...}) = 0
getdents64(64, /* 12 エントリ */, 1024) = 368
ptrace(PTRACE_DETACH, 18913, 0, SIG_0) = -1 ESRCH (そのようなプロセスはありません)
閉じる (64) = 0
ftruncate(63, 91256) = 0
閉じる (63) = 0
rt_sigprocmask(SIG_SETMASK, ~[KILL STOP RTMIN RT_1], ~[KILL STOP RTMIN RT_1], 8) = 0
時間 (NULL) = 1245590020
open("/home/userrrr/.mozilla/firefox/Crash Reports/LastCrash", O_WRONLY|O_CREAT|O_TRUNC, 0600) = 63
書き込み (63、「1245590020」、10) = 10
4

2 に答える 2

25

Ivan、あなたの本当の質問は「SIGSEGV をデバッグするにはどうすればよいですか?」です。

ここでstraceが役立つことはめったにありません。SIGSEGV は、割り当てられていない (または、さまざまな理由で参照解除が許可されていない) メモリ内の場所をアプリケーションが参照解除 (アクセス) しようとしたことを意味します。strace がキャプチャしているシステム コール アクティビティに関連していない可能性が高いです。クラッシュの原因を突き止めるには、逆参照されているアドレスと、逆参照を試みている関数を理解することから始めます。デバッガーは、このタスクに適したツールです。

必要な作業は次のとおりです。

 gdb <your_app_name> <your_coredump_file>

そこで、最後に実行された命令を分析し、「情報レジスタ」を使用すると、問題のアドレスが表示されます。「bt」コマンドを使用すると、コールスタックが表示されます。コールスタックをたどっていくと、間違ったアドレスがどのように計算されているかがわかります。この住所計算に含まれる手順の 1 つが問題の原因です。

デバッグは楽しいものであり、深く掘り下げる良い機会です。良い本やオンラインの記事が役に立ちます。グーグルで頑張ってください!

于 2009-06-21T19:45:25.677 に答える
8

これを使用して、Firefox をデバッグモードで起動できます: firefox -d gdb

これにより、gdb 内で Firefox が起動します。

gdb コマンド 'run' を発行すると、Firefox がクラッシュしたときにトレースバックを取得できます。Firefox にはストリップされたライブラリが同梱されており、関数名ではなく、コードが含まれているライブラリとオフセットのみが表示されるため、これは難しい場合があります。

もう 1 つの方法は、firefox をセーフモードで起動することです。

最後の代替手段は、Firefox の開発者モードを有効にして、Firefox クラッシュ セッションを mozilla サーバーに送信できるようにすることです。その後、mozilla サイトに移動して、失敗した Firefox セッションの詳細なトレースバックを確認できます。

于 2009-06-22T02:22:45.343 に答える