标签:
调试对象为公司一块使用s3c2440的板子,调试器为基于ft2232d的openjtag,pc操作系统为ubunut14.04.2 x64,jtag->gdb桥为openocd 0.9.0。
1.准备内核源码
拷贝出两份完全一样的内核源码,不加调试信息的一份烧写/下载到板子上,加调试信息的一份用于调试。这里用uboot+nfs的方式下载内核。
~/buildspacce/linux-2.6.32.2_debug
~/buildspacce/linux-2.6.32.2_release
debug版源码做如下配置
Kernel hacking ---> [*] Kernel debugging
[*] Compile the kernel with debug info
需要调试的驱动,编译时指定的内核源码路径,应当是debug版内核源码。
【一】从头开始调试内核
1.配置openocd
2.上电
连接arm板与openjtag
连接openjtag与pc
给arm板上电
3.打开一个终端,启动openocd
sudo /opt/openocd/bin/openocd -f ~/.openocd/openjtag.cfg -f /opt/openocd/share/openocd/scripts/target/samsung_s3c2440.cfg
4.打开一个终端,通过telnet访问openocd
telnet 127.0.0.1:4444
在telnet中输入如下指令,复位ARM并停止运行,以便在内核启动前加断点。
jtag的原因,你的系统可能不会自己启动起来,reset后才会启动uboot。
> reset halt
5.另打开一个终端,切换到内核源码根目录(需要先配置并编译),启动gdb。
PATH=$PATH:/opt/arm-linux-gcc/s3c2440_4.4.3/bin cd ~/buildspacce/linux-2.6.32.2_debug arm-none-linux-gnueabi-gdb ./vmlinux -d .
在gdb中连接openocd,并设置内核进入地址为断点
(gdb) target remote 127.0.0.1:3333
Remote debugging using :3333
0x000000ac in ?? ()
(gdb) b *0x30008040
(gdb) c
Continuing.
Breakpoint 1, 0x30008040 in ?? ()
0x30008040这个地址来源于uboot的打印(更早的时候开了minicom)
Entry Point: 30008040
接下来你就可以从头开始调试内核了。
【二】调试正在运行中的内核。
1.连接arm、openjtag、pc,启动openocd。
2.使用uboot下载内核,或从nand/nor启动加载内核,让arm系统正常运行起来(shell可用)。
3.telnet到openocd,使用
halt
指令停止arm处理器。
4.启动gdb
PATH=$PATH:/opt/arm-linux-gcc/s3c2440_4.4.3/bin cd ~/buildspacce/linux-2.6.32.2_debug arm-none-linux-gnueabi-gdb ./vmlinux -d .
在gdb中连接openocd,内核停止在休眠状态。
(gdb) target remote :3333
Remote debugging using :3333 s3c24xx_default_idle () at arch/arm/mach-s3c2410/include/mach/system.h:40 40 for (i = 0; i < 50; i++) {
5.内核是你的了……
【三】调试内核模块
1.连接arm、openjtag、pc,启动openocd,让系统正常运行起来。
2.通过arm的串口、telnet、ssh等方式加载目标驱动,这里被调试的内核模块为spi_slave.ko
3.查看内核模块的加载地址(虚拟地址)
# lsmod spi_slave 3055 0 - Live 0xbf000000 # cat /sys/module/spi_slave/sections/.data 0xbf000730 # cat /sys/module/spi_slave/sections/.bss 0xbf00091c
4.将arm系统halt掉,启动gdb,gdb中连接openocd,加载内核模块的符号表
(gdb) target remote :3333 Remote debugging using :3333 s3c24xx_default_idle () at arch/arm/mach-s3c2410/include/mach/system.h:40 40 for (i = 0; i < 50; i++) { (gdb) add-symbol-file ~/buildspace/spi_slave/spi_slave.o 0xbf000000 -s .data 0xbf000730 -s .bss 0xbf00091c add symbol table from file "/home/cjh/buildspace/spi_slave/spi_slave.o" at .text_addr = 0xbf000000 .data_addr = 0xbf000730 .bss_addr = 0xbf00091c (y or n) y Reading symbols from /home/cjh/buildspace/spi_slave/spi_slave.o...done.
目前经常无法将驱动中的变量打印出来、无法加断点,原因都是虚拟地址到物理地址的转换有问题。解决方法还不明确
标签:
原文地址:http://www.cnblogs.com/hua946/p/4727089.html