最近做一些Kernel方面的工作,從一頭霧水開始,多做些記錄吧。
addr2line也可以根據指令地址定位C代碼對應的行,但是對于Kernel module卻不是很方便,使用gdb就要容易得多。
NOTE:
在使用gdb定位C代碼之前需要開啟-g選項編譯內核或者module
例如有這樣的Call Trace
Call Trace:
[<8033265c>] dump_stack+0x8/0x30
[<8003abbc>] warn_slowpath_common+0x70/0x98
[<80041f10>] local_bh_enable_ip+0x98/0xec
[<c13f1c6c>] ieee80211_alloc_node+0x29c/0x47c [umac]
[<c13f1f70>] ieee80211_reset_bss+0x58/0x154 [umac]
[<c13f7c84>] ieee80211_vap_attach+0x20/0x68 [umac]
[<c14096cc>] ath_vap_create+0x430/0x6b0 [umac]
[<c13f7290>] wlan_vap_create+0x58/0x210 [umac]
[<c14686e8>] osif_ioctl_create_vap+0x268/0x790 [umac]
[<c14597b0>] ath_ioctl+0x134/0x94c [umac]
[<8022db50>] dev_ioctl+0x28c/0x88
現在想定位指令:
[<80041f10>] local_bh_enable_ip+0x98/0xec
可以這樣做:
$ mips-linux-gdb vmlinux
GNU gdb 6.8
Copyright (coffee) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "--host=i386-pc-linux-gnu --target=mips-linux-uclibc"...
輸入命令
(gdb) list *(local_bh_enable_ip+0x98)
gdb返回結果
0x80041f10 is in local_bh_enable_ip (kernel/softirq.c:216).
211
212 EXPORT_SYMBOL(_local_bh_enable);
213
214 static inline void _local_bh_enable_ip(unsigned long ip)
215 {
216 WARN_ON_ONCE(in_irq() || irqs_disabled());
217 #ifdef CONFIG_TRACE_IRQFLAGS
218 local_irq_disable();
219 #endif
220 /*
(gdb)