$ ddd --debugger arm-linux-gnueabi-gdb ./vmlinux
截图:
步骤2:
XXX@ubuntu:~/桌面/test/linux-2.6.26_s3c2410$ sudo skyeye -d -e vmlinux
big_endian is false.
arch: arm
cpu info: armv4, arm920t, 41009200, ff00fff0, 2
mach info: name s3c2410x, mach_init addr 0x805f030
lcd_mod:1
dbct info: Note: DBCT not compiled in. This option will be ignored
uart_mod:0, desc_in:, desc_out:, converter:
SKYEYE: use arm920t mmu ops
Loaded RAM ./initrd.img
start addr is set to 0xc0008000 by exec file.
debugmode= 1, filename = skyeye.conf, server TCP port is 12345
------------------------
步骤3:
fqh@ubuntu:~/桌面/test/linux-2.6.26_s3c2410$ arm-linux-gnueabi-gdb vmlinux
GNU gdb 6.8-debian
Copyright (C) 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=i486-linux-gnu --target=arm-linux-gnueabi"...
stext () at arch/arm/kernel/head.S:80
80 msr cpsr_c, #PSR_F_BIT | PSR_I_BIT | SVC_MODE @ ensure svc mode
Current language: auto; currently asm
(gdb) source extendinstr //载入辅助的gdb宏
--------------
用快捷键 ctrl+x+2 打开tui模式后的图示,可看到调试是从第一条指令开始的。这对研究系统启动过程提供了极大的便利。
┌──arch/arm/kernel/head.S────────────────────────────────────────────────────────────────────────────┐
>│80 msr cpsr_c, #PSR_F_BIT | PSR_I_BIT | SVC_MODE @ ensure svc mode │
│81 @ and irqs disabled │
│82 mrc p15, 0, r9, c0, c0 @ get processor id │
│83 bl __lookup_processor_type @ r5=procinfo r9=cpuid │
│84 movs r10, r5 @ invalid processor (r5=0)? │
│85 beq __error_p @ yes, error 'p' │
│86 bl __lookup_machine_type @ r5=machinfo │
│87 movs r8, r5 @ invalid machine (r5=0)? │
│88 beq __error_a @ yes, error 'a' │
│89 bl __vet_atags │
│90 bl __create_page_tables │
└────────────────────────────────────────────────────────────────────────────────────────────────────┘
>│0xc0008000 <stext> msr CPSR_c, #211 ; 0xd3 │
│0xc0008004 <stext+4> mrc 15, 0, r9, cr0, cr0, {0} │
│0xc0008008 <stext+8> bl 0xc00082f8 <__lookup_processor_type> │
│0xc000800c <stext+12> movs r10, r5 │
│0xc0008010 <stext+16> beq 0xc0008190 <__error_p> │
│0xc0008014 <stext+20> bl 0xc0008358 <__lookup_machine_type> │
│0xc0008018 <stext+24> movs r8, r5 │
│0xc000801c <stext+28> beq 0xc00081e8 <__error_a> │
│0xc0008020 <stext+32> bl 0xc00083a0 <__vet_atags> │
│0xc0008024 <stext+36> bl 0xc0008078 <__create_page_tables> │
│0xc0008028 <stext+40> ldr sp, [pc, #240] ; 0xc0008120 <__switch_data> │
└────────────────────────────────────────────────────────────────────────────────────────────────────┘
remote Thread 42000 In: stext Line: 80 PC: 0xc0008000
(gdb) b sys_read //下断点
Breakpoint 1 at 0xc008cc4c: file fs/read_write.c, line 354.
(gdb) c
----------------
调试示意图
效果可能与你机器上看到的不一样。这个例子中,每个gdb单步指令都会自动显示backtrace。这是因为本人使用了章节“gdb宏”中的extendinstr宏。
┌──include/asm/thread_info.h──────────────────────────────────────────────────────────────────────────────────────────────┐
│91 */ │
│92 static inline struct thread_info *current_thread_info(void) __attribute_const__; │
│93 │
│94 static inline struct thread_info *current_thread_info(void) │
│95 { │
│96 register unsigned long sp asm ("sp"); │
>│97 return (struct thread_info *)(sp & ~(THREAD_SIZE - 1)); │
│98 } │
│99 │
│100 /* thread information allocation */ │
│101 #ifdef CONFIG_DEBUG_STACK_USAGE │
│102 #define alloc_thread_info(tsk) \ │
│103 ((struct thread_info *)__get_free_pages(GFP_KERNEL | __GFP_ZERO, \ │
│104 THREAD_SIZE_ORDER)) │
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
│0xc008d480 <fget_light> mov r12, sp │
│0xc008d484 <fget_light+4> push {r11, r12, lr, pc} │
│0xc008d488 <fget_light+8> sub r11, r12, #4 ; 0x4 │
│0xc008d48c <fget_light+12> bic r3, sp, #8128 ; 0x1fc0 │
>│0xc008d490 <fget_light+16> bic r3, r3, #63 ; 0x3f │
│0xc008d494 <fget_light+20> ldr r3, [r3, #12] │
│0xc008d498 <fget_light+24> mov r12, #0 ; 0x0 │
│0xc008d49c <fget_light+28> ldr r2, [r3, #560] │
│0xc008d4a0 <fget_light+32> str r12, [r1] │
│0xc008d4a4 <fget_light+36> ldr r3, [r2] │
│0xc008d4a8 <fget_light+40> cmp r3, #1 ; 0x1 │
│0xc008d4ac <fget_light+44> bne 0xc008d4d0 <fget_light+80> │
│0xc008d4b0 <fget_light+48> ldr r2, [r2, #4] │
│0xc008d4b4 <fget_light+52> ldr r3, [r2] │
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
remote Thread 42000 In: fget_light Line: 97 PC: 0xc008d490
Program received signal SIGHUP, Hangup.
0xc008d490 in fget_light (fd=1, fput_needed=0xc1c17ed4) at include/asm/thread_info.h:97
-------------------
#0 0xc008d490 in fget_light (fd=1, fput_needed=0xc1c17ed4) at include/asm/thread_info.h:97
#1 0xc008cc5c in sys_read (fd=1, buf=0xc1196800 "", count=512) at fs/read_write.c:359
#2 0xc000ac7c in rd_load_image (from=0xc02b43bc "/initrd.image") at init/do_mounts_rd.c:108
#3 0xc000bbe8 in initrd_load () at init/do_mounts_initrd.c:121
#4 0xc00094c0 in prepare_namespace () at init/do_mounts.c:384
#5 0xc0008a9c in kernel_init (unused=<value optimized out>) at init/main.c:878
#6 0xc0048484 in sys_waitid (which=<value optimized out>, upid=-1044283692, infop=0x0, options=0, ru=Cannot access memory at
address 0x4
) at kernel/exit.c:1689
Backtrace stopped: previous frame inner to this frame (corrupt stack?)
(gdb)
使用最新的skyeye
1. 新版本的改进