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
进入调试界面的效果:
直接运行程序
退出调试界面(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