gdbserver移植使用

gdbserver移植使用

gdbserver的使用

gdbserver用法其实和gdb是一样的

记住在Ubuntu12.04中默认没有arm-linux-gdb的,必须下载gdb.gz并编译安装。

还要记住一点Ubuntu12.04中默认的gdb和arm-linux-gdb是不一样的。

  1. linux板子:
    gdbserver 192.168.1.108:2222 run.exe
  2. Ubuntu12.04机子:
    arm-linux-gdb run.exe //如果不加run.exe会没有symbol的
    target remote 192.168.1.108:2222

why要用gdbserver

  1. 首先明白gdb是用来干什么
    先试试gdb是用来干什么的,网上资料一大堆。参考:http://blog.csdn.net/v__king__/article/details/58192272

  2. gdbserver干什么的
    -某些时候由于模拟环境的限制,调试必须要在目标板上进行。由于嵌入式系统资源比较有限,一般不能在目标板上直接构建GDB的调试环境,这时我们通常采用gdb+gdbserver的远程调试方法:gdbserver在目标板中运行,而gdb则在主机上运行。
    -构建gdb+gdbserver调试环境的在于,要将gdb和gdbserver都编译成适用于目标板的版本。比如我们用x86的主机和ARM目标板,平时在主机上直接调试的时候都使用用于x86调试的gdb,但这个gdb不能用于远程调试中,需要针对ARM平台进行配置之后重新编译才行;而gdbserver要运行在目标板上,则需要用arm-linux-gcc编译才行。

如何安装gdbserver 到linux的板子上

参考:http://www.cnblogs.com/huaping-audio/archive/2009/06/19/1506898.html

  1. 保证arm-linux-gcc和gdbserver版本能兼容,能对得上号

  2. 下载gdb
    下载地址:http://ftp.gnu.org/gnu/gdb/

  3. 编译gdb或者执行gdbserver 192.168.1.108:2222 run.exe
    出现错误:gdbserver libthread_db.so.1: cannot open shared object file: No such file or directory
    原因: 在linux的板子上没有gdbserver用到的动态库libthread_db.so.1 。
    解决:我们会想linux板子所用的动态库会在什么地方呢?在交叉编译工具的arm-linux中去找,注意动态库一般是链接ln。将该库cp到linux板子的/lib目录下cp libthread_db-1.0.so /lib,然后ln -s libthread_db-1.0.so libthread_db.so.1

    问题:没有termcap的库
    原因:后来的Ubuntu没有这个库了
    解决:下载termcap.1_3_1.gz,编译安装: ./configue ; make ; sudo make install

  4. 想办法将gdbserver复制到linux板子上,可以用scp,ftp,tftp等

运行调试

  1. linux板子:
    gdbserver 192.168.1.108:2222 run.exe
  2. Ubuntu12.04机子:
    arm-linux-gdb run.exe //如果不加run.exe会没有symbol的
    target remote 192.168.1.108:2222
    或者:
#!/bin/bash
/mnt/extdisk1/gcc-linaro-5.4.1-2017.01-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gdb \
	-ex "target remote 192.168.7.69:2222" \
	./lws-minimal-ws-server

假如运行的是arm-linux-gdb 的话并不会出现错误,但是没有symbol的,也就不能设置断点

  1. 使用addr2line定位coredump错误
int main(void) {
    char *str;
    /* Stored in read only part of data segment */
    str = "core dump";
    /* Problem:  trying to modify read only memory */
    *(str + 1) = 'n';
    return 0;
}

g++ -ggdb -o test test.cpp

# addr2line -afiCe test 00000000004004ff

补充知识

./configure --host --target

build: 执行代码编译的主机,正常的话就是你的主机系统。这个参数一般由config.guess来猜就可以。当然自己指定也可以。
host: 编译出来的二进制程序所执行的主机,因为绝大多数是如果本机编译,本机执行。所以这个值就等于build。只有交叉编译的时候(也就是本机编译,其他系统机器执行)才会build和host不同。用host指定运行主机。
target: 这个选项只有在建立交叉编译环境的时候用到,正常编译和交叉编译都不会用到。他用build主机上的编译器,编译一个新的编译器(binutils, gcc,gdb等),这个新的编译器将来编译出来的其他程序将运行在target指定的系统上。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值