2011-06-07 6 views
5

के माध्यम से मॉड्यूल डीबगिंग मैं अपने कर्नेल मॉड्यूल को डीबग करना चाहता हूं। कि मैं बस से पहले मेरी init_modulekernel/module.c में do_one_initcall पर एक ब्रेकपाइंट डाल करने के लिए कहा जाता हो जाता है कोशिश कर रहा हूँ, लेकिन यहकेजीडीबी

प्रदर्शित है

पते पर स्मृति तक नहीं पहुंच पा 0x802010a0

नीचे Makefile जो मैं कर रहा हूँ है का उपयोग कर:

obj-m := hello.o 

KDIR=/lib/modules/$(shell uname -r)/build 
PWD=$(shell pwd) 

EXTRA_CFLAGS += -g 

all: 
     make -C $(KDIR) M=$(PWD) modules 

clean: 
     make -C $(KDIR) M=$(PWD) clean 

कृपया मुझे बताएं कि समस्या क्या हो सकती है।

उत्तर

9

स्मृति में लोड करने योग्य कर्नेल मॉड्यूल का स्थान केवल मॉड्यूल के सम्मिलन पर सेट होता है। जब आप मॉड्यूल फ़ंक्शन पर ब्रेकपॉइंट सेट करते हैं, तो gdb पते के लिए मॉड्यूल फ़ाइल (.ko) का समर्थन करता है, जो गलत है। आपको मॉड्यूल के वास्तविक स्थान के जीडीबी को सूचित करने की आवश्यकता है।

अधिक जानकारी के लिए आप this book (अध्याय 4, डिबगर्स और संबंधित टूल अनुभाग) से परामर्श ले सकते हैं, लेकिन यहां एक छोटी प्रक्रिया है जिसे मैंने करने के लिए तैयार किया है।

  • मशीन 1 डीबग मशीन है।
  • मशीन 2 मशीन डीबगर चलाने वाली मशीन है।

  1. machine1 पर, modpbrobe your_module_name
  2. machine1 पर चलाने के लिए, निम्न खोल कमांड चलाने:
    add-symbol-file /lib/modules/.../your_module_name.ko 0xffffffffa0110000 -s .bss 0xffffffffa011b948 -s .data 0xffffffffa011b6a0
  3. machine2 पर, gdb vmlinux चलाएँ:
    MODULE_NAME=your_module_name 
    MODULE_FILE=$(modinfo $MODULE_NAME| awk '/filename/{print $2}') 
    DIR="/sys/module/${MODULE_NAME}/sections/" 
    echo add-symbol-file $MODULE_FILE $(cat "$DIR/.text") -s .bss $(cat "$DIR/.bss") -s .data $(cat "$DIR/.data")
    आप एक आउटपुट निम्न के समान मिलना चाहिए।
  4. machine2 पर, gdb कंसोल पर, अंतिम आदेश के उत्पादन चरण 2.
  5. machine2 पर में, चलाने gdb कंसोल पर, target remote /dev/ttyS0 चलाकर machine1 को (यह मानते हुए अपने सीरियल पोर्ट ttyS0 पर है) कनेक्ट
  6. मशीन 1 पर, echo g > /proc/sysrq-trigger चलाएं। मशीन
  7. मशीन 2 पर, जीडीबी कंसोल पर, ब्रेकपॉइंट को अपनी इच्छानुसार सेट कर देगा।
  8. डिबगिंग जारी रखें। जब इसे करने की आवश्यकता होती है तो ब्रेकपॉइंट ट्रिगर किया जाना चाहिए।
अन्य मुद्दे भी हो सकते हैं जो आपको ब्रेकपॉइंट सेट करने से रोकते हैं, लेकिन यह पार करने का मुख्य बाधा है।
+0

मेरा 'insmod' सफल होता है और मैं अपने 'module_init' kprints int वह' dmesg' देखता हूं। लेकिन मेरा 'modprobe' विफल रहता है। और इस प्रकार 'modinfo' भी विफल रहता है। क्या आप कुछ अंतर्दृष्टि प्रदान कर सकते हैं? –

+1

कई कारण हो सकते हैं। सबसे छोटा यह है कि मॉडप्रोब आपके मॉड्यूल को नहीं जानता है, क्योंकि यह डेटाबेस का उपभोग करता है, इसलिए आप 'modprobe my_module_file.ko' नहीं कर सकते हैं। इसके बजाय, आपको 'depmod -a' के साथ डेटाबेस में डालने के बाद' modprobe my_module_name' करना होगा। हालांकि इस उद्देश्य के लिए, यह वास्तव में कोई फर्क नहीं पड़ता। आप अपना नाम और फ़ाइल नाम जानते हैं, ताकि आप उत्तर देने के बजाए बस उनका उपयोग कर सकें। जैसे 'MODULE_NAME = my_module_name; MODULE_FILE = my_module_file.ko' – Nir

+0

एक त्वरित युक्ति: आपको बिल्ली/sys/मॉड्यूल/मॉड्यूल-नाम-यहां/अनुभाग/प्राप्त करने के लिए रूट की आवश्यकता है।* काम करने के लिए सामान .. (अन्यथा यह सिर्फ 0x0 मान प्रदर्शित करता है)। – kaiwan