码迷,mamicode.com
首页 > 数据库 > 详细

使用jtag+gdb调试arm上的linux内核和驱动

时间:2015-08-19 19:11:06      阅读:514      评论:0      收藏:0      [点我收藏+]

标签:

调试对象为公司一块使用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.

 

 

目前经常无法将驱动中的变量打印出来、无法加断点,原因都是虚拟地址到物理地址的转换有问题。解决方法还不明确

使用jtag+gdb调试arm上的linux内核和驱动

标签:

原文地址:http://www.cnblogs.com/hua946/p/4727089.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!