历史上的今天
今天是:2025年02月09日(星期日)
2020年02月09日 | 基于TQ2440和Qemu的GDB+串口调试(1)
2020-02-09 来源:eefocus
一、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 root=/dev/mtdblock5 rw rootfstype=jffs2 console=ttySAC0,115200n8 kgdboc=ttySAC0,115200 kgdbwait' 设置完bootargs后,可以保存。上面新加的工kgdb调试的参数是'kgdboc=ttySAC0,115200 kgdbwait',表示将来kernel会在ttySAC0这个串口等待连接,并且波特率设置的是115200,kgdbwait表示开机时kernel会自动等待连接。 然后执行boot命令,这样uboot会自动去解析并执行设置在bootcmd环境变量中的命令, log如下: U-Boot 2015.04-g5095150-dirty (May 25 2017 - 20:13:52) CPUID: 32440001 FCLK: 400 MHz HCLK: 100 MHz PCLK: 50 MHz I2C: ready DRAM: 64 MiB WARNING: Caches not enabled Flash: 0 Bytes NAND: 256 MiB In: serial Out: serial Err: serial Net: dm9000 Hit any key to stop autoboot: 0 TQ2440 # TQ2440 # setenv bootargs 'noinitrd root=/dev/mtdblock5 rw rootfstype=jffs2 console=ttySAC0,115200n8 kgdboc=ttySAC0,115200 kgdbwait' TQ2440 # boot dm9000 i/o: 0x20000000, id: 0x90000a46 DM9000: running in 16 bit mode MAC: 00:0c:29:2a:5c:a5 operating at 100M full duplex mode Using dm9000 device TFTP from server 192.168.1.2; our IP address is 192.168.1.8 Filename 'uImage'. Load address: 0x30008000 Loading: T #################################################################
史海拾趣
|
看到“古道热肠”强烈推荐魏坤的第二版示波器,转载来,供大家学习:转自www.OURDEV.cn‘魏坤手持示波仪开源DIY活动’ 12月发布的原理图和PCB: 大概的配置为: 双通道;每通道采样率100Msps;每通道存储深度4K;模拟带宽大于30MHz(使用Agilen ...… 查看全部问答> |
|
作者博客:http://radiobcl.blog.163.com/ 在FT-80C等电台的收发切换继电器后面接收输入处加个限幅电路:如果没有合适的两个背对背连接的硅瞬变吸收二极管(TVS),采用几组用二极管1N4148串联的组件正反向并联也可以对地分流,输入串联2W/24V灯泡、 ...… 查看全部问答> |
|
哈哈,看看这个新闻,http://www.expo-shandong.cn/news/gfxw/gfxw902.html 上海计测院利用“镇院之宝”对上海世博钟进行时间校正,一款示波器竟也成了“镇院之宝”,这个示波器到底是哪方利器啊,有了解的出来说说。。 … 查看全部问答> |
|
Window CE调试中,在 VS2005的debugger中,只能看到当前Thread的Callstack,如何查看其它Thread的Callstack呢? Window CE调试中,在 VS2005的debugger中,只能看到当前Thread的Callstack,如何查看其它Thread的Callstack呢? 从Threads Window看,除了当前 Thread: A_Thread 能看到停在 A_WndProc function中,并能在 Callstack Window 查看 其他 Threads 都 ...… 查看全部问答> |
|
硬件平台为qq2440,软件平台为WinCE 在这上面开发简单图形程序可否? 我做了几个很简单的图形变化的程序。。。 但发现在这上面运行时根本没有在本地电脑上那么流畅,请问WinCE 或者 qq2440 能开发一些简单图形变化的程序吗? 如何能够在Windows CE上开发一些流畅的图形变化程序,需要什么? 不是有个什么世界编程大 ...… 查看全部问答> |
|
各位大虾好! 我需要使用APIC,所以在config.h中加入了定义“#deinfe SYMMETRIC_IO_MODE“,但修改完以后,系统启动刚过V1.6+++++++++这个画面就蓝屏了,再没有任何改变。 我用的是pentium M处理器,vxworks5.5.1和tornado2.2.在该这个之前,一切 ...… 查看全部问答> |
|
最近在弄S3C2410上的利用剩余FLASH永久保存的问题,我 PB是CE4.2,工作流程如下,先在定植内核的时候把HIVE悬赏,然后改platform.reg文件,改动如下: ; HIVE BOOT SECTION [HKEY_LOCAL_MACHINE\\init\\BootVars] \"SYSTEMHIVE\"=\"syst ...… 查看全部问答> |




