2016-04-14 4 views
5

पर असमर्थ करने में असमर्थ मैं क्यूमू पर्यावरण में जीडीबी का उपयोग करके चरण के अनुसार कर्नेल बूटअप अनुक्रम चरण को समझने की कोशिश कर रहा हूं।क्यूमू में जीडीबी का उपयोग कर लिनक्स कर्नेल डिबगिंग फ़ंक्शन या दिए गए एड्रेस

नीचे मेरी सेटिंग है: -

में चल रहे एक टर्मिनल im

~/Qemu_arm/bin/qemu-system-arm -M vexpress-a9 -dtb ./arch/arm/boot/dts/vexpress-v2p-ca9.dtb -kernel ./arch/arm/boot/zImage -append "root=/dev/mmcblk0 console=ttyAMA0" -sd ../Images/RootFS.ext3 -serial stdio -s -S 

दूसरे टर्मिनल

arm-none-linux-gnueabi-gdb vmlinux 
Reading symbols from vmlinux...done. 
(gdb) target remote :1234 
Remote debugging using :1234 
0x60000000 in ??() 

मेरा प्रश्न में है कि कैसे इन/चाप/बांह कोड के लिए सेटअप ब्रेकप्वाइंट/बूट/संपीड़ित/* फाइलें।

उदाहरण के लिए मैंने misc.c में परिभाषित decompress_kernel के लिए ब्रेक पॉइंट सेट करने का प्रयास किया।

केस 1:

(gdb) b decompress_kernel 
Function "decompress_kernel" not defined. 
Make breakpoint pending on future shared library load? (y or [n]) y 
Breakpoint 2 (decompress_kernel) pending. 
(gdb) c 
Continuing. 

ऊपर एक समारोह qemu बूटिंग है हिट करने के लिए सक्षम नहीं है।

केस 2:

(gdb) b *0x80008000 
Breakpoint 1 at 0x80008000: file arch/arm/kernel/head.S, line 89. 
(gdb) c 
Continuing. 

इस मामले में भी इसकी बजाय हिट करने के लिए सक्षम नहीं qemu बूट है।

केस 3:

(gdb) b start_kernel 
Breakpoint 1 at 0x8064d8d8: file init/main.c, line 498. 
(gdb) c 
Continuing. 

Breakpoint 1, start_kernel() at init/main.c:498 
498 { 
(gdb) 

इस मामले समारोह में मार रहा है और मैं कदम से सक्षम डिबग कदम हूँ।

नोट: मैं डिबग, अर्ली printk सक्षम है और

hbreak की कोशिश की है तो मेरी क्वेरी है

1)why some funtions are not able to hit break points? 
2)Is this qemu limitation or do i need enable something more ? 
3)do i need to append any extra parameters ? 
4)how to Debug early kernel booting 
+0

बस सोच रहा है कि फ़ंक्शन को कॉल किया गया है या नहीं। क्या आप एक प्रिंटक जोड़ सकते हैं और पुष्टि कर सकते हैं कि फ़ंक्शन कहा जाता है ?? – Jeyaram

+0

@ जेयराम स्पष्ट रूप से फ़ंक्शन को कॉल किया जाना चाहिए, एक बार कर्नेल बूटअप, "लिनक्स को असंप्रेषित करना ......., कर्नेल को बूट करना"। यह decompress_kernel() फ़ंक्शन –

+0

सहमत द्वारा किया गया था। यही वह है जो मैं उलझन में हूं। लेकिन क्या होता है यदि कर्नेल छवि संपीड़ित नहीं है ?? क्या आप "असम्पीडित लिनक्स ....... कर रहे हैं, कर्नेल को बूट कर रहे हैं" संदेश ?? – Jeyaram

उत्तर

0

आप start_kernel पूर्ववर्ती क्योंकि आप के लिए प्रतीकों लोड हो रहा है नहीं कर रहे हैं किसी भी समारोह पर breakpoints डाल करने के लिए सक्षम नहीं हैं उन्हें। वास्तव में आप कर्नेल के zImage के साथ qemu शुरू कर रहे हैं लेकिन vmlinux से प्रतीकों को लोड कर रहे हैं। वे समान नहीं हैं: zImage मूल रूप से एक डेटा पेलोड के रूप में संपीड़ित vmlinux है जिसे तब एक स्टब से जोड़ा जाता है जो इसे स्मृति में डिकंप्रेस करता है और फिर start_kernel पर कूदता है।

start_kernel vmlinux का एंट्री पॉइंट है, डीकंप्रेस_कर्नल समेत किसी भी फ़ंक्शन, स्टब का हिस्सा हैं और vmlinux में मौजूद नहीं हैं।

मुझे नहीं पता कि "arm-none-linux-gnueabi-gdb zImage" करने के बजाय आपको स्टब को डीबग करने की अनुमति मिलती है, मैंने हमेशा वास्तविक हार्डवेयर पर जेएफई डिबगर्स के साथ एआरएम कर्नेल के प्रारंभिक डीबग किए हैं, और कभी भी उपयोग नहीं किया जाता इसके लिए qemu, क्षमा करें

+0

धन्यवाद, मैं इसे "आर्म-नो- लिनक्स-gnueabi-gdb zImage "। जिज्ञासा के लिए मैं vmlinux का उपयोग/arm/boot/compressed/vmlinux में कर्नेल उचित (vmlinux) के बजाय उपस्थित कर सकता हूं ताकि इस vmlinux में eveything है? –

+0

बीटीडब्लू System.map पता देखकर मैं ब्रेकपॉइंट डालने की कोशिश कर रहा हूं उदा। 0x80008000 पर ब्रेकपॉइंट 1: फ़ाइल आर्क/आर्म/कर्नेल/हेड। इस पते को मारने के बिना यहां क्यूमू बूट कर रहा है क्यों ऐसा है? –

+0

नहीं,/बांह/बूट/संपीड़ित/vmlinux संकलन का सिर्फ एक मध्यवर्ती उत्पाद है। यह एक एल्फ बाइनरी है जिसमें प्रतीकों और स्थानांतरण जानकारी शामिल हैं, कच्चे बाइनरी नहीं। आप इसके साथ सिस्टम को बूट नहीं कर सकते हैं। –

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