2009-06-21 39 views
7

Firefox của tôi đã bắt đầu gặp sự cố kể từ hôm nay. Tôi đã không thay đổi bất cứ điều gì trên hệ thống hoặc trên cấu hình firefox.Linux: Làm cách nào để gỡ lỗi SIGSEGV? Làm cách nào để theo dõi nguồn lỗi?

tôi sử dụng
strace -ff -o dumpfile.txt firefox
để theo dõi vấn đề. Nó không phải là một trợ giúp lớn.

Tôi thấy segfault, trong hai bãi xử lý được tạo, nhưng làm cách nào tôi có thể theo dõi chúng là nguyên nhân của chúng?

Sau khi chạy trong 10 giây và bị lỗi, 22MB dữ liệu được tạo bởi strace.

Đây là một đoạn đầu ra, nơi bạn có thể nhìn thấy SIGSEGV thực tế ở giữa .:

 
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 

Trả lời

20

Ivan, câu hỏi thực sự của bạn là "làm thế nào để gỡ lỗi một SIGSEGV?"

strace hiếm khi là trợ giúp tốt ở đây. SIGSEGV có nghĩa là ứng dụng đã cố gắng dereference (truy cập) một vị trí trong bộ nhớ chưa được phân bổ (hoặc không được phép tham gia vì nhiều lý do khác). Rất có thể là nó không liên quan đến hệ thống gọi là hoạt động mà strace đang nắm bắt. Để khám phá nguyên nhân gây ra sự cố của bạn, hãy bắt đầu bằng cách hiểu địa chỉ nào bị bỏ qua và chức năng nào cố gắng thực hiện điều đó. Trình gỡ lỗi là công cụ thích hợp cho tác vụ này.

Đây là những gì bạn cần làm:

gdb <your_app_name> <your_coredump_file> 

trong đó, phân tích các hướng dẫn thực hiện cuối cùng và sử dụng "Thông tin đăng ký" bạn sẽ thấy địa chỉ trong câu hỏi. Sử dụng lệnh "bt" bạn sẽ thấy callstack. Bằng cách thực hiện cuộc gọi, bạn sẽ khám phá cách tính địa chỉ không chính xác. Một trong các bước liên quan đến tính toán địa chỉ này là nguyên nhân của vấn đề của bạn.

Gỡ lỗi thật thú vị và đây là cơ hội tốt để nghiên cứu kỹ. Một cuốn sách hay một số bài báo trực tuyến có thể giúp bạn ở đó. Google đi và may mắn!

+0

tệp kết xuất lõi là gì và làm cách nào để tạo tệp kết xuất đó? – Craig

7

Bạn có thể khởi động firefox trong chế độ gỡ lỗi với điều này: firefox -d gdb

này sẽ bắt đầu firefox bên trong gdb.

Bạn có thể phát hành lệnh gdb 'chạy' và nhận được truy xuất khi firefox gặp sự cố. Điều này có thể khó khăn, vì firefox gửi kèm với các thư viện bị tước mà chỉ hiển thị thư viện và mã bù vào, không phải tên hàm.

Một cách khác là khởi động firefox trong chế độ an toàn: firefox-safe mode và tắt bất kỳ plugin nào bạn có thể đã cài đặt cho đến khi nó không bị lỗi nữa.

Cách thay thế cuối cùng là bật chế độ nhà phát triển của firefox và cho phép gửi phiên gặp sự cố firefox tới máy chủ mozilla. Sau đó, bạn có thể truy cập trang mozilla và xem phần truy nguyên chi tiết về phiên firefox không thành công của bạn.

Các vấn đề liên quan