gdb调试和gdbserver远程调试

Linux下GDB调试工具使用

一、gcc编译器的常用选项
  使用 GCC 编译器的时候,我们必须给出一系列必要的调用参数和文件名称。GCC 编译器的调用参数大约有100 多个,这里只介绍其中最基本、最常用的参数。
GCC 最基本的用法∶ gcc [参数] [文件名称]
常用的参数如下
-c 只编译:不链接成为可执行文件,编译器只是由输入的.c 等源代码文件生成.o 为后缀的目标文件,通常 用于编译不包含主程序的子程序文件。
-o output_filename:确定输出文件的名称为 output_filename,同时这个名称不能和源文件同名。如果不给出 这个选项,gcc 就给出预设的可执行文件 a.out。
-g:产生符号调试工具(GNU  的 gdb)所必要的符号信息,要想对源代码进行调试,我们就必须加入这个选项。
-O:对程序进行优化编译、链接,采用这个选项,整个源代码会在编译、链接过程中进行优化处理,这样产 生的可执行文件的执行效率可以提高,但是,编译、链接的速度就相应地要慢一些。
-O2:比-O 更好的优化编译、链接,当然整个编译、链接过程会更慢。
-E:仅执行编译预处理;
-S:将 C 代码转换为汇编代码;

示例:

#gcc test.c -o app

编译时指定库与头文件路径
-L:指定动态库路径。示例:gcc test.c -o app -L/usr/lib
-I: 指定头文件存放的路径。示例:gcc test.c -o app -I/usr/include
-l: 指定库名称。示例:示例:gcc test.c -o app –lpthread

二、GDB调试工具

  我们通常写 C 程序,会使用命令 gcc test.c -o test,对源文件进行编译,但是如果我们要对程序进行调试,就 必须在编译源文件时,使用-g 参数,编译时使用的命令为:gcc -g test.c -o app
GDB 工具也支持自动补全,比如:    list 命令可以简写 l    ,run 命令可以简写 r

2.1 GDB工具基本使用

编译支持GDB调试程序:

#gcc -g test.c -o app

启用GDB调试

#gdb app

进入调试界面的效果:

直接运行程序

扫描二维码关注公众号,回复: 11442849 查看本文章

退出调试界面(quit 命令)

2.2 GDB 工具常用的命令

注意没有输入新命令,敲回车 GDB 会再次执行上一条命令;

查看 gdb 使用帮助

设置程序断点执行(breakpoints)

使用 breakpoints (可简写为 b)命令给程序添加断点,共有下面几种情况:

b <函数名> 在某函数入口处添加断点;

b <行号> 在指定行添加断点

b <文件名:行号> 在指定文件的指定行添加断点

b <行号 if 条件>  当条件为真时,指定行号处断点生效,例 b 5 if i=10 ,当 i=10 时,第 5 行断点生效

查看程序已经设置的断点(info break)

添加完断点之后,我们可以使用【info break】命令,查看所有的断点;

取消程序设置的断点

每个断点都有一个编号,可以用编号指定删除某个断点:

有时候一个断点暂时不用可以禁用掉而不必删除,这样以后想用的时候可以直接启用,而不必重新从代码里找应该在哪一行设断点:

单步\连续支持程序

输入 next 命令可实现单步运行 输入 continue 命令可实现连续运行; 如果想查看某一变量的值,则使用 print/p + 变量名;

gdb基本命令表

 

Linux下GDB远程调试工具使用

  有些时候由于模拟环境的限制,调试必须要在目标板上进行。由于嵌入式系统资源比较有限,一般不能在目标板上直接构建GDB的调试环境,这时通常采用gdb+gdbserver的远程调试方法:gdbserver在目标板中运行,而gdb则在主机上运行。

构建gdb+gdbserver调试环境的在于,要将gdb和gdbserver都编译成适用于目标板的版本。比如我们用x86的主机和ARM目标板,平时在主机上直接调试的时候都使用用于x86调试的gdb,但这个gdb不能用于远程调试中,需要针对ARM平台进行配置之后重新编译才行;而gdbserver要运行在目标板上,则需要用arm-linux-gcc编译才行。

一、源码下载

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

二、编译arm-linux-gcc

  Linux系统本身已经自带gdb工具,但无法用在嵌入式调试中,需要单独编译arm-linux-gdb。

1. 解压源码包

tar -zxvf gdb-6.6a.tar.gz
cd gdb-6.6/

2. 生成Makefile文件

./configure --target=arm-linux  或--prefix=$PWD/__install

–target:指定目标平台。

这时我们编译的是用于主机上的gdb程序,因此仍然用x86版本的gcc编译,而不是用arm-gcc。

3. 编译安装

make && make install

三、编译gdbserver

1. 生成Makefile

  编译的gdbserver程序则是运行在目标板上的,需要用arm-gcc来编译了,用CC=<your_arm-linux-gcc_path>来指定arm-linux-gcc编译器;

cd gdb/gdbserver/
./configure --target=arm-linux --host=arm-linux
make CC=/mywork/arm-linux-gcc/opt/FriendlyARM/toolschain/4.5.1/bin/arm-linux-gcc
make install

/home/zdw/gdb/build_env_mini/build/usr/bin

完成之后会在当前目录下生成可执行程序gdbserver ,将其拷贝到目标板中;

  这里gdbtest程序为例来说明,注意gdbtest程序需要用arm-linux-gcc编译得到ARM版本的gdbtest程序,并下载到目标板上。

完成这些之后可以用file命令来检查所准备gdb和gdbserver及gdbtest程序的格式是否正确;

四、调试

目标板

# gdbserver 192.168.123.217:4545 ./gdbtest  //主机IP

主机

# arm-linux-gdb ./gdbtest

五、可能出现的问题

错误一:安装C++

解决方法:

sudo apt-get install build-essential

错误二:

make[5]: *** [gdb.info] 错误 127

make[5]:正在离开目录 `/home/fh/下载/gdb-7.12/gdb/doc'

make[4]: *** [subdir_do] 错误 1

make[4]:正在离开目录 `/home/fh/下载/gdb-7.12/gdb'

make[3]: *** [install-only] 错误 2

make[3]:正在离开目录 `/home/fh/下载/gdb-7.12/gdb'

make[2]: *** [install] 错误 2

make[2]:正在离开目录 `/home/fh/下载/gdb-7.12/gdb'

make[1]: *** [install-gdb] 错误 2

make[1]:正在离开目录 `/home/fh/下载/gdb-7.12'

make: *** [install] 错误 2

解决方法:

sudo apt-get install texinfo

猜你喜欢

转载自blog.csdn.net/zdw6868/article/details/89202848
今日推荐