2007年4月12日星期四

GDB 使用技巧 (原创)

这是在实际使用GDB进行内核debug过程中所记录下的一些技巧.

1. 根据Panic的地址查找Source Code 的位置
很多时候, 我们访问了NULL地址, 内核就会Panic, 如下:
BUG: unable to handle kernel NULL pointer dereference at virtual address 00000034
printing eip:
c04d8289
*pde = f0405067
Oops: 0000 [#1]
SMP
last sysfs file: /devices/vscsi0/rescan
Modules linked in: autofs4(U) hidp(U) nfs(U) lockd(U) fscache(U) nfs_acl(U) rfcomm(U) l2cap(U) bluetooth(U) sunrpc(U) ipv6(U) dm_mirror(U) dm_mod(U) video(U) sbs(U) i2c_ec(U) button(U) battery(U) asus_acpi(U) ac(U) parport_pc(U) lp(U) parport(U) sr_mod(U) cdrom(U) sg(U) i2c_piix4(U) i2c_core(U) cfi_probe(U) gen_probe(U) scb2_flash(U) mtdcore(U) chipreg(U) pcspkr(U) serio_raw(U) sd_mod(U) egenera_veth(U) egenera_vscsi(U) scsi_mod(U) egenera_ipmi(U) egenera_console(U) egenera_base(U) egenera_virtual_bus(U) egenera_fs(U) ext3(U) jbd(U)
CPU: 6
EIP: 0060:[] Tainted: P VLI
EFLAGS: 00010013 (2.6.18-8.el5smp #6)
EIP is at cfq_resort_rr_list+0x6d/0x8b
eax: f4e53044 ebx: f50ad6bc ecx: f4ed2fb4 edx: 00000000
esi: f4e53000 edi: f50ad6d0 ebp: 00000000 esp: f7eb28c8
ds: 007b es: 007b ss: 0068
Process egen-vscsi0 (pid: 447, ti=f7eb2000 task=c32fb550 task.ti=f7eb2000)
Stack: f50b33d4 c33018a4 00000000 f50ad6bc c04d90e5 f4e53000 f50b33d4 f50b33d4
c32ff7a4 00000008 c04d91e7 f4277510 00000001 f4e53000 c33018a4 f50ad6bc
c042c98e 00000000 f50b33d4 c32ff7a4 00000008 c04cf6d5 00000003 f50b33d4
Call Trace:
[] cfq_add_crq_rb+0x127/0x13d
[] cfq_insert_request+0x31/0x498
[] lock_timer_base+0x15/0x2f
[] elv_insert+0xfe/0x19d
[] __make_request+0x31d/0x366

我们可以使用info line *address来查找到在那一行访问NULL地址, 操作下:
#gdb vmlinux
(gdb) info line *0xc04d8289
Line 504 of "block/cfq-iosched.c"
starts at address 0xc04d8289
and ends at 0xc04d828c .
(gdb)l cfq_resort_rr_list
这样就可以看到504行是什么了

2. 查看指定地址或Symbol的指令
(gdb) x/60i


60是查询多少行.

3. 反汇编指定地址范围
(gdb)disas


资源:
Debugging with GDB http://davis.lbl.gov/Manuals/GDB/gdb.html#SEC_Top

没有评论: