2009-06-21 23 views
7

मेरा फ़ायरफ़ॉक्स आज से दुर्घटनाग्रस्त हो गया। मैंने सिस्टम या फ़ायरफ़ॉक्स कॉन्फ़िगरेशन पर कुछ भी नहीं बदला है।लिनक्स: एक SIGSEGV कैसे डिबग करें? मैं त्रुटि स्रोत का पता कैसे लगा सकता हूं?

मैं
strace -ff -o dumpfile.txt firefox
का उपयोग समस्या का पता लगाने के। यह एक बड़ी मदद नहीं है।

मैं उत्पन्न उत्पन्न प्रक्रिया डंप, में सेगफॉल्ट देखता हूं, लेकिन मैं उन्हें उनके कारण से कैसे देख सकता हूं?

10 सेकंड के लिए दौड़ने और क्रैश होने के बाद, 22 एमबी डेटा स्ट्रेस द्वारा उत्पन्न होता है।

यह आउटपुट है, जहां आप बीच .:

 
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 डिबग करते हैं?"

स्ट्रेस शायद ही कभी एक अच्छी मदद है। एसआईजीएसईजीवी का मतलब है कि एप्लिकेशन ने मेमोरी में एक स्थान को हटाना (एक्सेस) करने की कोशिश की जिसे आवंटित नहीं किया गया है (या कई अन्य कारणों से संदर्भित नहीं किया गया है)। संभावना अधिक है कि यह सिस्टम कॉल गतिविधि से संबंधित नहीं है जो स्ट्रेस कैप्चरिंग कर रहा है। अपने दुर्घटना के कारण की खोज करने के लिए, यह समझकर शुरू करें कि किस पते को संदर्भित किया जा रहा है और कौन सा फ़ंक्शन ऐसा करने का प्रयास करता है। डीबगर इस कार्य के लिए सही उपकरण है।

यहाँ आप क्या करने की जरूरत है:

gdb <your_app_name> <your_coredump_file> 
वहाँ में

, पिछले निष्पादित अनुदेश का विश्लेषण करने और का उपयोग कर "जानकारी पंजीकृत करता है" आप प्रश्न में पता दिखाई देगा। "बीटी" कमांड का उपयोग करके आप कॉलस्टैक देखेंगे। कॉलस्टैक को चलकर, आप पाएंगे कि गलत पता कैसे गणना की जा रही है। इस पते की गणना में शामिल चरणों में से एक आपकी समस्या का कारण है।

डिबगिंग मजेदार है और यह इसमें शामिल होने का एक अच्छा अवसर है। एक अच्छी किताब या कुछ ऑनलाइन लेख आपकी मदद कर सकते हैं। Google दूर और शुभकामनाएँ! फ़ायरफ़ॉक्स -d gdb

इस gdb के अंदर फ़ायरफ़ॉक्स शुरू कर देंगे:

+0

कोर डंप फ़ाइल क्या है और मैं इसे कैसे उत्पन्न करूं? – Craig

7

आप इस के साथ डिबग मोड में फ़ायरफ़ॉक्स आरंभ कर सकते हैं।

आप gdb कमांड 'रन' जारी कर सकते हैं और फ़ायरफ़ॉक्स क्रैश होने पर ट्रेसबैक प्राप्त कर सकते हैं। यह मुश्किल हो सकता है, क्योंकि स्ट्रिप किए गए पुस्तकालयों के साथ फ़ायरफ़ॉक्स जहाजों जो केवल लाइब्रेरी दिखाता है और कोड ऑफसेट करता है, फ़ंक्शन नाम नहीं।

एक और विकल्प है safemode में फ़ायरफ़ॉक्स शुरू करना: फ़ायरफ़ॉक्स -safe-mode और जब तक यह क्रैश न हो जाए तब तक आपके द्वारा इंस्टॉल किए गए किसी भी प्लगइन को बंद कर दें।

अंतिम विकल्प फ़ायरफ़ॉक्स के डेवलपर मोड को सक्षम करना है, और इसे को मोज़िला सर्वर पर फ़ायरफ़ॉक्स क्रैश सत्र भेजने की अनुमति देता है। फिर आप मोज़िला साइट पर जा सकते हैं और अपने असफल फ़ायरफ़ॉक्स सत्र का विस्तृत पता देख सकते हैं।