Chinaunix首页 | 论坛 | 博客
  • 博客访问: 958425
  • 博文数量: 109
  • 博客积分: 554
  • 博客等级: 中士
  • 技术积分: 2577
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-04 12:49
文章分类

全部博文(109)

文章存档

2019年(5)

2016年(7)

2015年(9)

2014年(1)

2013年(71)

2012年(16)

分类: 嵌入式

2013-06-09 17:28:16

1. 安装依赖文件

sudo apt-get install texinfo
sudo apt-get install libncurses5-dev
sudo apt-get install m4
sudo apt-get install flex
sudo apt-get install bison
为了支持python脚本扩展功能
apt-get install python-dev

确定XML support 是否使能,如果libexpat-dev被安装是默认是能的,
如果不支持XML, openocd->gdb  memory map transfer 不能够工作

2. 编译gdb for arm

# It's actually quite straightforward:
wget
tar jvxf gdb-7.2.tar.bz2
cd gdb-7.2
./configure --target=arm-none-linux-gnueabi --program-prefix=arm-none-linux-gnueabi-  --prefix=/home/enzo --with-python
其中:
--target i指明目标系统类型
--prefix 指生成的可执行文件安装在哪个目录
--program-prefix  指生成的可执行文件的前缀

make
幸运的话,会在--prefix指定的目录下生成三个子目录:bin、lib、share,我们需要的arm-none-linux-gnueabi-gdb就在其中的bin目录下。

进入gdb目录,对生成的elf文件进行strip,不然又12M左右
strip gdb -o arm-none-linux-gnueabi-gdb
裁剪后大小
-rwxr-xr-x 1 root root 2.7M  6月  9 21:14 arm-none-linux-gnueabi-gdb
拷贝arm-none-linux-gnueabi-gdb 到目标位置即可

3. 编译gdbserver
cd gdb/gdbservver
CC=arm-hisiv100nptl-linux-gcc ./configure --host=arm-hisiv100nptl-linux --target=arm-hisiv100nptl-linux
这里的--host指定了生成可执行文件运行的平台和系统:运行于ARM平台的Linux系统
make
检查生成的gdbserver
$ file gdbserver
gdbserver: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), not stripped

4. 去除符号信息
$ arm-hisiv100nptl-linux-strip gdbserver -o gdbserver
enzo@debian:~/Downloads/gdb-7.3.1/gdb/gdbserver$ file gdbserver
gdbserver: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), stripped

可能出现的错误:
xml-builtin.o: could not read symbols: File in wrong format
出现此错误原因: 没有指定交叉编译器
./configure --host=arm-hisiv100nptl-linux --target=arm-hisiv100nptl-linux

3. gdb 7.0 引入的python扩展功能


在gdb 7中,有两种方法写python脚本
1. 输入python会进入gdb提示,然后直接写python脚本,最后end结束
(gdb) py
>import sys
>end

2. 另一种方法,加入文件夹有文件test1的elf文件,把python脚本命名为test-gdb.py,如果gdb可以在当前文件夹找到类似文件就会自动加载
类似的当调试内核时, vmlinux-gdb.py会自动被加载。

test1.c:

  1. struct _node {

  2.         int weight;
  3.         char tag[20];
  4.     };
  5.     int main () {
  6.         struct _node *mynode = malloc(sizeof(*mynode));
  7.         mynode->weight = 210;
  8.         strcpy(mynode->tag, “dummy node”);
  9.         free(mynode);
  10.         return 0;
  11.     }


test1-gdb.py:

  1. import gdb
  2. def print_node(value):
  3.     frame = gdb.selected_frame()
  4.     try:
  5.         val = gdb.Frame.read_var(frame, value)
  6.     except:
  7.         print “No such variable”
  8.         return
  9.     if str(val.type) == “struct _node *:
  10.         print “Weight:+ str(val["weight"])
  11.         print “Tag:+ str(val["tag"])
  12.     else:
  13.         print “Is not a node (+ str(val.type) +)

我们所做的是获得当前的Frame,从当前frame得到value
编译test1
gcc -g -O0 -o test1 test1
luka@luka-laptop:~>
  1.     (gdb) b main
  2.     Breakpoint 1 at 0x40056c: file test1.c, line 12.
  3.     (gdb) r
  4.     Breakpoint 1, main () at test1.c:12
  5.     12 struct _node *mynode = malloc(sizeof(*mynode));
  6.     (gdb) n
  7.     14 mynode->weight = 210;
  8.     (gdb)
  9.     15 strcpy(mynode->tag, “dummy node”);
  10.     (gdb)
  11.     16 free(mynode);
  12.     (gdb) python print_node(“mynode”)
  13.     Weight: 210
  14.     Tag: “dummy node000000000000000000″
  15.     (gdb)


阅读(6284) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~