gdb和gdbserve的编译和使用

说明

gdb一份代码里包含两个程序,一个是gdb,一个是gdbserver,分别运行在PC主机和开发板上,编译的时候得分开编译。

准备材料

操作系统:ubuntu-16.04.4-desktop-i386

本地编译器:gcc v5.4.0(ubuntu原配)

交叉编译器:arm-linux-gcc v3.4.5

gdb源码:gdb-7.5.tar.bz2(gdb下载地址)

gdb和gdbserver我已经编译好了,在这里:百度网盘,密码: v36n

编译gdb

进入gdb的源码目录,配置gdb:

gdb-7.5$ ./configure --target=arm-linux
gdb-7.5$ make

出现一个错误:

opncls.c: In function ‘bfd_fopen’:
bfd.h:529:65: error: right-hand operand of comma expression has no effect [-Werror=unused-value]
 #define bfd_set_cacheable(abfd,bool) (((abfd)->cacheable = bool), TRUE)

重新配置一次,忽略这种函数命名不规范导致的错误:

gdb-7.5$ ./configure --target=arm-linux --disable-werror

再次make后又出现错误:

checking for library containing waddstr... no
configure: WARNING: no enhanced curses library found; disabling TUI
checking for library containing tgetent... no
configure: error: no termcap library found
Makefile:8370: recipe for target 'configure-gdb' failed
make[1]: *** [configure-gdb] Error 1
make[1]: Leaving directory '/home/sam/Work/gdb/gdb-7.5'
Makefile:844: recipe for target 'all' failed
make: *** [all] Error 2

安装libncureses5-dev:

gdb-7.5$ sudo apt-get install libncurses5-dev

再次make,通过了。此时gdb位于:gdb-7.5/gdb/gdb。你可以执行make install把gdb安装到/usr/local/bin/里去,由于ubuntu自带了一个gdb,我没有这样做,而是后续自己手动加入,并改了个名,以区分ubuntu自带的那个gdb。

然而,gdbtui并没有编译出来,我也不知道为什么,但是我编译gdb-7.4.1是可以的。

编译gdbserver

进入gdbserver所在目录:gdb-7.5/gdb/gdbserver,配置gdbserver:

gdb-7.5/gdb/gdbserver$ ./configure --target=arm-linux --host=arm-linux
  • --target=arm-linux你不用改,除非你的单板不是ARM;
  • --host=arm-linux意思是你的交叉编译器的前缀是arm-linux,如果你的交叉编译器叫arm-none-linux-gnueabi-gcc,那么这里应该填--host=arm-none-linux-gnueabi;

make后出现错误:

linux-arm-low.c: In function `arm_stopped_by_watchpoint':
linux-arm-low.c:643: error: `PTRACE_GETSIGINFO' undeclared (first use in this function)
linux-arm-low.c:643: error: (Each undeclared identifier is reported only once
linux-arm-low.c:643: error: for each function it appears in.)
Makefile:222: recipe for target 'linux-arm-low.o' failed
make: *** [linux-arm-low.o] Error 1

意思是PTRACE_GETSIGINFO这个宏没有定义,这个宏其实位于交叉编译器的安装目录里:

gcc-3.4.5-glibc-2.3.6$ grep -nrR PTRACE_GETSIGINFO
arm-linux/sys-include/linux/ptrace.h:27:#define PTRACE_GETSIGINFO	0x4202
arm-linux/include/linux/ptrace.h:27:#define PTRACE_GETSIGINFO	0x4202
distributed/arm-linux/sys-include/linux/ptrace.h:27:#define PTRACE_GETSIGINFO	0x4202
distributed/arm-linux/include/linux/ptrace.h:27:#define PTRACE_GETSIGINFO	0x4202

修改linux-arm-low.c这个文件,添加#include <linux/ptrace.h>

/* Don't include elf.h if linux/elf.h got included by gdb_proc_service.h.
   On Bionic elf.h and linux/elf.h have conflicting definitions.  */
#ifndef ELFMAG0
#include <elf.h>
#endif
#include <sys/ptrace.h>
#include <signal.h>

#include <linux/ptrace.h>

再次make,通过了。

 

开始调试

准备

  • 单板和主机之间连接好串口线或网线或WIFI;
  • 编译程序,记得gcc加上-g选项;
  • 可执行程序主机和单板各存一份;
  • 主机编译出的gdbserver拷贝到单板的/usr/bin/目录下,单板检查这个gdbserver有没有执行权限,没有的话chmod +x /usr/bin/gdbserver;

注意


在主机上运行arm-linux-gnueabihf-gdb如果报这个错误:

arm-linux-gnueabihf-gdb: error while loading shared libraries: libpython2.7.so.1.0: cannot open shared object file: No such file or directory

解决方法是:

sudo apt-get install libpython2.7

在单板上运行gdbserver如果报这个错误:

gdbserver: error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory

解决方法是:

把主机的<交叉编译器安装目录>/libstdc++.so.6拷贝到单板的/lib目录。

 

如果用网络连接

“test”是待调试的可执行程序。

单板:

gdbserver 192.168.43.247:6666 test

主机:

arm-linux-gnueabihf-gdb test

(gdb) target remote 192.168.43.141:6666

OK,可以开始调试了。

 

如果用串口连接

这篇文章讲得很详细了:

https://www.jianshu.com/p/4f1140300516

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GDB和Valgrind都是常用的调试工具,可以帮助开发人员找到程序中的错误。下面是它们的简单介绍以及如何使用它们进行调试的步骤: ## GDB GDB是GNU调试器,可以用来调试C和C++程序。下面是使用GDB进行调试的步骤: 1. 在编译时,需要在命令行加上-g选项,以生成调试信息。例如: ``` gcc -g -o program program.c ``` 2. 启动GDB,命令为: ``` gdb program ``` 3. 在GDB中运行程序,命令为: ``` (gdb) run ``` 4. 如果程序崩溃或停止了,可以使用backtrace命令查看函数调用栈: ``` (gdb) backtrace ``` 5. 使用print命令查看变量的值: ``` (gdb) print variable_name ``` 6. 使用break命令设置断点: ``` (gdb) break line_number ``` 7. 使用step命令单步执行代码: ``` (gdb) step ``` ## Valgrind Valgrind是一个内存调试和性能分析工具,可以检测内存泄漏、越界访问等问题。下面是使用Valgrind进行调试的步骤: 1. 在编译时,需要在命令行加上-g选项,以生成调试信息。例如: ``` gcc -g -o program program.c ``` 2. 启动Valgrind,命令为: ``` valgrind --tool=memcheck --leak-check=yes ./program ``` 3. Valgrind会在程序执行完成后输出内存错误信息。 ``` ==1234== Memcheck, a memory error detector ==1234== Copyright (C) ... ==1234== ... ==1234== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0) ==1234== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0) ``` 4. 如果有内存错误,Valgrind会输出详细的信息,包括错误堆栈和错误位置等。例如: ``` ==1234== Invalid read of size 4 ==1234== at 0x8048400: main (program.c:10) ==1234== Address 0x0 is not stack'd, malloc'd or (recently) free'd ==1234== ==1234== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0) ==1234== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0) ``` 可以看到,GDB和Valgrind都是非常有用的调试工具,可以帮助开发人员快速找到程序中的错误。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值