2013-05-24 7 views
12

में पते की व्याख्या कैसे करें मेरे पास लिनक्स डिवाइस ड्राइवर में एक कर्नेल ओप्स है। मैं यह निर्धारित करना चाहता हूं कि ओओएस के लिए कौन सी रेखा जिम्मेदार है। मेरे पास निम्न आउटपुट है, लेकिन मुझे नहीं पता कि इसकी व्याख्या कैसे करें।कर्नेल ओप्स

क्या इसका मतलब है कि मेरा कोड write_func + 0x63 पर निर्देश पर क्रैश हो गया है? मैं अपने स्वयं के कार्य में ईआईपी में मूल्य कैसे जोड़ सकता हूं? बैकस्लैश के बाद मूल्य क्या हैं?

[10991.880354] BUG: unable to handle kernel NULL pointer dereference at (null) 
[10991.880359] IP: [<c06969d4>] iret_exc+0x7d0/0xa59 
[10991.880365] *pdpt = 000000002258a001 *pde = 0000000000000000 
[10991.880368] Oops: 0002 [#1] PREEMPT SMP 
[10991.880371] last sysfs file: /sys/devices/platform/coretemp.3/temp1_input 
[10991.880374] Modules linked in: nfs lockd fscache nfs_acl auth_rpcgss sunrpc hdrdmod(F) coretemp(F) af_packet fuse edd cpufreq_conservative cpufreq_userspace cpufreq_powersave acpi_cpufreq mperf microcode dm_mod ppdev sg og3 ghes i2c_i801 igb hed pcspkr iTCO_wdt dca iTCO_vendor_support parport_pc floppy parport ext4 jbd2 crc16 i915 drm_kms_helper drm i2c_algo_bit video button fan processor thermal thermal_sys [last unloaded: preloadtrace] 
[10991.880400] 
[10991.880402] Pid: 4487, comm: python Tainted: GF   2.6.37.1-1.2-desktop #1 To be filled by O.E.M. To be filled by O.E.M./To be filled by O.E.M. 
[10991.880408] EIP: 0060:[<c06969d4>] EFLAGS: 00210246 CPU: 0 
[10991.880411] EIP is at iret_exc+0x7d0/0xa59 
[10991.880413] EAX: 00000000 EBX: 00000000 ECX: 0000018c EDX: b7837000 
[10991.880415] ESI: b7837000 EDI: 00000000 EBP: b7837000 ESP: e2a81ee0 
[10991.880417] DS: 007b ES: 007b FS: 00d8 GS: 0033 SS: 0068 
[10991.880420] Process python (pid: 4487, ti=e2a80000 task=df940530 task.ti=e2a80000) 
[10991.880422] Stack: 
[10991.880423] 00000000 0000018c 00000000 0000018c e5e903dc e4616353 00000009 df99735c 
[10991.880428] df900a7c df900a7c b7837000 df80ad80 df99735c 00000009 e46182a4 e2a81f70 
[10991.880433] e28cd800 e09fc840 e28cd800 fffffffb e09fc888 c03718c1 e4618290 0000018c 
[10991.880438] Call Trace: 
[10991.882006] Inexact backtrace: 
[10991.882006] 
[10991.882012] [<e4616353>] ? write_func+0x63/0x160 [mymod] 
[10991.882017] [<c03718c1>] ? proc_file_write+0x71/0xa0 
[10991.882020] [<c0371850>] ? proc_file_write+0x0/0xa0 
[10991.882023] [<c036c971>] ? proc_reg_write+0x61/0x90 
[10991.882026] [<c036c910>] ? proc_reg_write+0x0/0x90 
[10991.882031] [<c0323060>] ? vfs_write+0xa0/0x160 
[10991.882034] [<c03243c6>] ? fget_light+0x96/0xb0 
[10991.882037] [<c0323331>] ? sys_write+0x41/0x70 
[10991.882040] [<c0202f0c>] ? sysenter_do_call+0x12/0x22 
[10991.882044] [<c069007b>] ? _lock_kernel+0xab/0x180 
[10991.882046] Code: f3 aa 58 59 e9 5a f9 d7 ff 8d 0c 88 e9 12 fa d7 ff 01 d9 e9 7b fa d7 ff 8d 0c 8b e9 73 fa d7 ff 01 d9 eb 03 8d 0c 8b 51 50 31 c0 <f3> aa 58 59 e9 cf fa d7 ff 01 d9 e9 38 fb d7 ff 8d 0c 8b e9 30 
[10991.882069] EIP: [<c06969d4>] iret_exc+0x7d0/0xa59 SS:ESP 0068:e2a81ee0 
[10991.882072] CR2: 0000000000000000 
[10991.889660] ---[ end trace 26fe339b54b2ea3e ]--- 
+0

यही वही है जिसका अर्थ है। इस मामले में आप एक इंटरप्ट की सेवा करते समय क्रैश हो गए हैं, जो आपके 'write_func() 'के साथ कुछ करने के लिए हो सकता है या नहीं। एक पूर्ण ट्रेस या स्रोत कोड अधिक उपयोगी होगा। –

+0

मैंने एक पूर्ण स्टैक ट्रेस जोड़ा है। बैकस्लैश के बाद मूल्य क्या है? जैसे write_func + 0x63/_0x160_ –

+1

@ हंसहेन write_func + 0x63/0x160 प्रतीक + ऑफ़सेट/लंबाई है। इस आलेख को देखें: http://www.linuxforu.com/2011/01/understanding-a- कर्नेल-oops/ –

उत्तर

24

सभी जानकारी की आवश्यकता वहीं है:

[10991.880354] BUG: unable to handle kernel NULL pointer dereference at (null) 

कारण नहीं है यही कारण है कि।

[10991.880359] IP: [<c06969d4>] iret_exc+0x7d0/0xa59 

यह गलती के समय निर्देश सूचक है। हम इस क्षण वापस आ जाएंगे।

[10991.880365] *pdpt = 000000002258a001 *pde = 0000000000000000 

ये भौतिक पृष्ठ तालिका प्रविष्टियां हैं। वर्णनकर्ता तालिका, और पृष्ठ वर्णनकर्ता प्रविष्टि। स्वाभाविक रूप से, उत्तरार्द्ध नल है, क्योंकि यह एक पूर्ण सूचक है। उपरोक्त मान शायद ही कभी उपयोगी होते हैं (केवल उन मामलों में जहां भौतिक मेमोरी मैपिंग आवश्यक है)

[10991.880368] Oops: 0002 [#1] PREEMPT SMP 

ओह कोड है। PREEMPT एसएमपी आपको दिखाता है कि कर्नेल पूर्ववत है, और यूपी के बजाए एसएमपी के लिए संकलित है। यह मामलों के लिए महत्वपूर्ण है, जहां बग कुछ रेस स्थिति से, आदि

[10991.880371] last sysfs file: /sys/devices/platform/coretemp.3/temp1_input 

कि जरूरी अपराधी नहीं है, लेकिन अक्सर है। sys फ़ाइलों को विभिन्न कर्नेल मॉड्यूल द्वारा निर्यात किया जाता है, और कई बार sys फ़ाइल पर I/O ऑपरेशन दोषपूर्ण मॉड्यूल कोड निष्पादन की ओर जाता है।

[10991.880374] Modules linked in: ... [last unloaded: preloadtrace] 

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

[10991.880402] Pid: 4487, comm: python Tainted: GF   2.6.37.1-1.2-desktop #1 To be filled by O.E.M. To be filled by O.E.M./To be filled by O.E.M. 

यदि दोषपूर्ण धागा उपयोगकर्ता मोड थ्रेड है, तो आपको पीआईडी ​​और कमांड लाइन मिलती है। "दागी" झंडे हुए कहा कि यह एक कर्नेल गलती नहीं है की गिरी का तरीका है (कर्नेल स्रोत खुला है और "शुद्ध"। "कलंक" निंदात्मक गैर जीपीएल मॉड्यूल, और दूसरों से आता है।

[10991.880408] EIP: 0060:[<c06969d4>] EFLAGS: 00210246 CPU: 0 
[10991.880411] EIP is at iret_exc+0x7d0/0xa59 

कि देता है आप दोषयुक्त अनुदेश सूचक, दोनों सीधे और प्रतीक में + ऑफसेट प्रपत्र। स्लैश के बाद भाग समारोह का आकार है।

[10991.880413] EAX: 00000000 EBX: 00000000 ECX: 0000018c EDX: b7837000 
[10991.880415] ESI: b7837000 EDI: 00000000 EBP: b7837000 ESP: e2a81ee0 
[10991.880417] DS: 007b ES: 007b FS: 00d8 GS: 0033 SS: 0068 

रजिस्टरों यहां दिए गए हैं। आपका शून्य संभावना EAX है।

[10991.880420] Process python (pid: 4487, ti=e2a80000 task=df940530 task.ti=e2a80000) 
[10991.880422] Stack: 
[10991.880423] 00000000 0000018c 00000000 0000018c e5e903dc e4616353 00000009 df99735c 
[10991.880428] df900a7c df900a7c b7837000 df80ad80 df99735c 00000009 e46182a4 e2a81f70 
[10991.880433] e28cd800 e09fc840 e28cd800 fffffffb e09fc888 c03718c1 e4618290 0000018c 

स्टैक पॉइंटर के पास का क्षेत्र प्रदर्शित होता है। कर्नेल को पता नहीं है कि इन मानों का क्या अर्थ है, लेकिन वे वही आउटपुट हैं जो आप $ आरएसपी प्रदर्शित करने वाले जीडीबी से प्राप्त करेंगे। तो यह आप पर निर्भर है कि वे क्या हैं। (उदाहरण के लिए, c03718c1 एक कर्नेल रिटर्न पता है, संभवतः - ताकि आप इसे समझने के लिए/proc/kallsyms पर जा सकें, या ट्रेस में होने पर भरोसा कर सकते हैं, जैसा कि अगला है)।यह आपको बताता है कि यह करने के लिए सभी डेटा स्टैक फ्रेम

है अब, क्योंकि आप उन्हें कॉल ट्रेस है, तो आप टुकड़े को एक साथ रखा जा सकता है:

[10991.880423] 00000000 0000018c 00000000 0000018c e5e903dc e4616353 --> back to write_func 

[   ] ..................................................... 00000009 df99735c 
[10991.880428] df900a7c df900a7c b7837000 df80ad80 df99735c 00000009 e46182a4 e2a81f70 
[10991.880433] e28cd800 e09fc840 e28cd800 fffffffb e09fc888 c03718c1 --> back to proc_file_write 

[10991.882046] Code: f3 aa 58 59 e9 5a f9 d7 ff 8d 0c 88 e9 12 fa d7 ff 01 d9 e9 7b fa d7 ff 8d 0c 8b e9 73 fa d7 ff 01 d9 eb 03 8d 0c 8b 51 50 31 c0 <f3> aa 58 59 e9 cf fa d7 ff 01 d9 e9 38 fb d7 ff 8d 0c 8b e9 30 

फिर, कर्नेल के लिए एकत्रित न नहीं कर सकते आप (यह ओपिंग है, और बहुत अच्छी तरह से घबराहट हो सकता है, इसे एक ब्रेक दें!)। लेकिन आप इन मानों को अलग करने के लिए जीडीबी का उपयोग कर सकते हैं।

तो अब आप सबकुछ जानते हैं। आप वास्तव में अपने मॉड्यूल को अलग कर सकते हैं और यह पता लगा सकते हैं कि वास्तव में write_func में NULL पॉइंटर को संदर्भित किया गया है। (आप शायद इसे कुछ फ़ंक्शन के लिए तर्क के रूप में पास कर रहे हैं)।

+0

+1: उत्कृष्ट और पूरी तरह से प्राइमर! – wallyk

+0

Thx बहुत अधिक। बस वह जानकारी जो मैं ढूंढ रहा था। –

+0

अब तक का सबसे अच्छा स्पष्टीकरण धन्यवाद –

संबंधित मुद्दे