2009-06-21 122 views
7

我的Firefox從今天開始崩潰。我沒有改變任何系統或Firefox上的配置。Linux:如何調試SIGSEGV?我如何追蹤錯誤來源?

我用
strace -ff -o dumpfile.txt firefox
追查問題。這不是一個很大的幫助。

我看到segfault,在兩個生成的進程轉儲, 但我怎麼能跟蹤他們到他們的原因?

運行10秒後崩潰, 通過strace生成22MB的數據。

這是輸出,在那裏你可以看到在中間:

 
read(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 (Resource temporarily unavailable) 
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, events=POLLIN|POLLPRI}, {fd=14, events=POL 
read(3, 0xf5c55058, 4096)    = -1 EAGAIN (Resource temporarily unavailable) 
gettimeofday({1245590019, 543161}, NULL) = 0 
gettimeofday({1245590019, 546672}, NULL) = 0 
gettimeofday({1245590019, 546761}, NULL) = 0 
read(3, 0xf5c55058, 4096)    = -1 EAGAIN (Resource temporarily unavailable) 
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, events=POLLIN|POLLPRI}, {fd=14, events=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\250s\0"..., 11356) = 11356 
read(3, 0xf5c55058, 4096)    = -1 EAGAIN (Resource temporarily unavailable) 
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\250s\0"..., 11356) = 11356 
read(3, 0xf5c55058, 4096)    = -1 EAGAIN (Resource temporarily unavailable) 
--- SIGSEGV (Segmentation fault) @ 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 
clone(child_stack=0xf5bfffe4, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_UNTRACED) = 18929 
waitpid(18929, NULL, __WALL) = 18929 
open("/proc/18913/task", 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 entries */, 1024) = 368 
ptrace(PTRACE_DETACH, 18913, 0, SIG_0) = -1 ESRCH (No such process) 
close(64)        = 0 
ftruncate(63, 91256)     = 0 
close(63)        = 0 
rt_sigprocmask(SIG_SETMASK, ~[KILL STOP RTMIN RT_1], ~[KILL STOP RTMIN RT_1], 8) = 0 
time(NULL)        = 1245590020 
open("/home/userrrr/.mozilla/firefox/Crash Reports/LastCrash", O_WRONLY|O_CREAT|O_TRUNC, 0600) = 63 
write(63, "1245590020", 10)    = 10 

回答

20

伊萬實際SIGSEGV的片段,你真正的問題是「我怎麼調試SIGSEGV?」

strace在這裏很少有很好的幫助。 SIGSEGV意味着應用程序試圖解除引用(訪問)內存中尚未分配的位置(或因各種其他原因而不允許取消引用)的位置。機會很大,它與系統調用活動無關,而這些活動正在捕獲。爲了發現崩潰的原因,首先了解哪些地址被解除引用,以及哪個函數嘗試這樣做。調試器是完成此任務的正確工具。

這裏有您需要做什麼:

gdb <your_app_name> <your_coredump_file> 
在那裏

,分析最後執行的指令,並使用「信息登記」,你會看到有問題的地址。使用「bt」命令,您將看到callstack。通過將callstack向上走,您會發現如何計算不正確的地址。計算地址所涉及的步驟之一就是問題的原因。

調試很有趣,這是一個深入研究的好機會。一本好書或一些在線文章可以幫助你。谷歌走了,祝你好運! 火狐-d GDB

這將啓動Firefox裏面GDB:

+0

什麼是核心轉儲文件,以及如何生成它? – Craig 2018-02-16 11:17:21

7

您可以在調試模式下與該啓動Firefox瀏覽器。

當firefox崩潰時,您可以發出gdb命令'run'並獲取回溯。 這可能是困難的,因爲firefox附帶了剝離庫,它只顯示哪個庫和代碼所在的位置,而不是函數名稱。

另一種替代方法是在安全模式下啓動firefox:firefox -safe-mode 並關閉所有可能已安裝的插件,直到它不再崩潰。

最後一種方法是啓用firefox的開發者模式,並允許它將Firefox的崩潰會話發送到mozilla服務器。然後你可以去mozilla網站 並查看失敗的firefox會話的詳細回溯。