一、GDB基础知识
1、控制命令
n: 单步运行
c: 继续运行
q: 退出gdb
2、设置、查看和删除断点
(gdb) br start_kernel
Breakpoint 6 at 0x809009b0: file ../init/main.c, line 483.
(gdb) br __irq_svc
Breakpoint 7 at 0x806e8e60: file ../arch/arm/kernel/entry-armv.S, line 219.
(gdb) br gic_handle_irq
Breakpoint 8 at 0x801014f4: file ../drivers/irqchip/irq-gic.c, line 352.
(gdb) info br
Num Type Disp Enb Address What
6 breakpoint keep y 0x809009b0 in start_kernel at ../init/main.c:483
7 breakpoint keep y 0x806e8e60 ../arch/arm/kernel/entry-armv.S:219
8 breakpoint keep y 0x801014f4 in gic_handle_irq at ../drivers/irqchip/irq-gic.c:352
(gdb) delete br 8
(gdb) info br
Num Type Disp Enb Address What
6 breakpoint keep y 0x809009b0 in start_kernel at ../init/main.c:483
7 breakpoint keep y 0x806e8e60 ../arch/arm/kernel/entry-armv.S:219
(gdb) delete br // 删除所有断点
Delete all breakpoints? (y or n) y
(gdb) info br
No breakpoints or watchpoints.
(gdb)
3、查看调用栈
(gdb) bt
#0 ftrace_traceoff (ip=2157986736, parent_ip=0, data=0x80a01f48
#1 0x80109a18 in arch_cpu_idle () at ../arch/arm/kernel/process.c:73
#2 0x806dbd54 in p9_write_work (work=0x80a043b0
#3 0x8016575c in __list_del (next=
#4 __list_del_entry (entry=
#5 list_del_init (entry=
#6 __finish_swait (q=
#7 0x80165abc in current_thread_info () at ../arch/arm/include/asm/thread_info.h:94
#8 need_resched () at ../include/linux/sched.h:3500
#9 do_idle () at ../kernel/sched/idle.c:222
#10 0x806d56f8 in svc_seq_show (seq=0x80a01f94
#11 0x80900d64 in start_kernel () at ../init/main.c:653
#12 0x6000807c in ?? ()
Backtrace stopped: frame did not save the PC
4、查看寄存器的值
info registers (除了浮点寄存器)
(gdb) info registers
r0 0x80a043b0 -2136980560
r1 0x0 0
r2 0x80a01f48 -2136989880
r3 0x8011b8c0 -2146322240
r4 0x0 0
r5 0x80a03cd0 -2136982320
r6 0x80a03c6c -2136982420
r7 0x8097f5d8 -2137524776
r8 0x80a03cd8 -2136982312
r9 0x80a1cace -2136880434
r10 0x0 0
r11 0x80a01f44 -2136989884
r12 0x80a01f38 -2136989896
sp 0x80a01f38 0x80a01f38
lr 0x80109a18 -2146395624
pc 0x801d0ae4 0x801d0ae4
cpsr 0x60000093 1610612883
info registers 寄存器名称 (查看指定的寄存器的值)
(gdb) info registers cpsr
cpsr 0x60000093 1610612883
(gdb) info registers pc
pc 0x801d0ae4 0x801d0ae4
(gdb) info registers r0
r0 0x80a043b0 -2136980560
(gdb) info registers r0 r1
r0 0x80a043b0 -2136980560
r1 0x0 0
print/x $寄存器名 (查看指定的寄存器)
(gdb) print/x $r0
$7 = 0x80a043b0
(gdb) print/x $pc
$8 = 0x801d0ae4
(gdb) print/x $cpsr
$9 = 0x60000093
下面的字符用于设置数据显示的格式:
x 按十六进制格式显示变量。
d 按十进制格式显示变量。
u 按十六进制格式显示无符号整型。
o 按八进制格式显示变量。
t 按二进制格式显示变量。
a 按十六进制格式显示变量。
c 按字符格式显示变量。
f 按浮点数格式显示变量
5、查看内存的值
x/
n 是一个正整数,表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容
f 表示显示的格式:
x 按十六进制格式显示变量
d 按十进制格式显示变量
u 按十六进制格式显示无符号整型
o 按八进制格式显示变量
t 按二进制格式显示变量
a 按十六进制格式显示变量
c 按字符格式显示变量
f 按浮点数格式显示变量
u 表示将多少个字节作为一个值取出来,如果不指定的话,GDB默认是4个bytes,如果不指定的话,默认是4个bytes。当我们指定了字节长度后,GDB会从指内存定的内存地址开始,读写指定字节,并把其当作一个值取出来,可以设置如下几种:
b 表示单字节
h 表示双字节
w 表示四字 节
g 表示八字节
(gdb) info registers
r0 0x80a043b0 -2136980560
r1 0x0 0
r2 0x80a01f48 -2136989880
r3 0x8011b8c0 -2146322240
r4 0x0 0
r5 0x80a03cd0 -2136982320
r6 0x80a03c6c -2136982420
r7 0x8097f5d8 -2137524776
r8 0x80a03cd8 -2136982312
r9 0x80a1cace -2136880434
r10 0x0 0
r11 0x80a01f44 -2136989884
r12 0x80a01f38 -2136989896
sp 0x80a01f38 0x80a01f38
lr 0x80109a18 -2146395624
pc 0x801d0ae4 0x801d0ae4
cpsr 0x60000093 1610612883
(gdb) x/16xw 0x801d0ae4
0x801d0ae4
0x801d0af4
0x801d0b04
0x801d0b14
(gdb) x/16xw 0x80a01f38
0x80a01f38
0x80a01f48
0x80a01f58
0x80a01f68
上面查看了pc和sp指向的内存地址的内容。
二、TQ2440 + KGDB + 串口
配置内核
Kernel hacking
----> Compile-time checks and compiler options
----> [*] Compile the kernel with debug info
----> [*] Kernel debugging
----> [*] KGDB: kernel debugger
----> KGDB: use kgdb over the serial console
然后编译内核,然后我们就可以在uboot中配置bootargs,用新的kernel启动, 由于目前板子上只有一个调试串口,所以在使用gdb打开串口时,需要把其他
使用该串口的应用关闭,如ckermit以及minicom。
具体调试有两种方式
方式一:开机启动阶段kernel自动等待连接
设置uboot的bootargs如下:
setenv bootargs 'noinitrd roo
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』