×
单片机 > 单片机程序设计 > 详情

基于TQ2440和Qemu的GDB+串口调试(1)

发布时间:2020-08-31 发布时间:
|

一、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 ) at ../kernel/trace/trace_functions.c:351

#1  0x80109a18 in arch_cpu_idle () at ../arch/arm/kernel/process.c:73

#2  0x806dbd54 in p9_write_work (work=0x80a043b0 ) at ../net/9p/trans_fd.c:521

#3  0x8016575c in __list_del (next=, prev=) at ../include/linux/list.h:104

#4  __list_del_entry (entry=) at ../include/linux/list.h:119

#5  list_del_init (entry=) at ../include/linux/list.h:158

#6  __finish_swait (q=, wait=0x0) at ../kernel/sched/swait.c:108

#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 , statp=) at ../net/sunrpc/stats.c:105

#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 :    0xe92dd8f0    0xe24cb004    0xe24dd008    0xe30403b0

0x801d0af4 :    0xe34800a0    0xe1a0400e    0xe590305c    0xe3130002

0x801d0b04 :    0x0a000011    0xe10f3000    0xe3130080    0x0a00000e

0x801d0b14 :    0xe1a0200d    0xe3c23d7f    0xe3c3303f    0xe304572c

(gdb) x/16xw 0x80a01f38

0x80a01f38 :    0x80a01f54    0x80a01f48    0x806dbd54    0x801099f4

0x80a01f48 :    0x80a01f84    0x80a01f58    0x8016575c    0x806dbd2c

0x80a01f58 :    0x80702db8    0x000000bb    0x80a74000    0xffffffff

0x80a01f68 :    0x80a03c40    0x80952a28    0x00000001    0x80a74000


上面查看了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


关键字:TQ2440  Qemu  GDB  串口调试

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
AVR熔丝位操作时的要点和需要注意的相关事项