一、使用概述

GDB是GNU开源组织发布的一个强大的Linux下的程序调试工具,它可以用来调试C、C++等的程序。
GDB的命令行调试采取的是一种交互式的界面,启动GDB后就可以通过各种命令对程序进行调试。GDB命令很多,而且提供了一个在线的帮助命令help。

二、使用流程

(1)给出实例代码

代码文件gdb_example.c,编译程序
$gcc -g gdb_example.c -o gdb_example

include <stdio.h>
include <stdlib.h>

void print_scrambled(char *message)
{
    int i = 3;
    do {
        printf("%c", (*message) + i);
    } while(*++message);
    printf("\n");
}

int main()
{
    char *bad_message = NULL;
    char *good_message = "Hello World!";
    print_scrambled(good_message);
    print_scrambled(bad_message);
    exit(0);
}

这个程序是有问题的,运行会出现段错误。

(2)使用GDB调试以上程序
$gdb ./gdb_example

GNU gdb (Ubuntu/Linaro 7.4-2012.02-0ubuntu2) 7.4-2012.02
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later http://gnu.org/licenses/gpl.html
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type “show copying”
and “show warranty” for details.
This GDB was configured as “x86_64-linux-gnu”.
For bug reporting instructions, please see:
http://bugs.launchpad.net/gdb-linaro/
Reading symbols from /home/brian/GDB_tests/gdb_example…done.
(gdb)
这时就进入GDB的交互式调试状态,可以输入命令进行调试了。

(gdb) run
Starting program: /home/brian/GDB_tests/gdb_example
Khoor#Zruog$

Program received signal SIGSEGV, Segmentation fault.
0x000000000040055b in print_scrambled (message=0x0) at gdb_example.c:8
8 printf(“%c”, (*message) + i);
(gdb)

使用run命令使程序运行起来,到达出错的位置时GDB中断了程序的执行,并说明原因是出现了段错误,引起错误的代码位于gdb_example.c的第8行。
虽然这样就已经找到了出问题的代码,但是在更复杂的程序调试中,经常需要了解代码的执行流程,因此,还需要通过backtrac命令:

(gdb) backtrace
#0 0x000000000040055b in print_scrambled (message=0x0) at gdb_example.c:8
#1 0x00000000004005b7 in main () at gdb_example.c:19
(gdb)

其他的一些常用的调试命令有:
list、info locals、info args、print、b(设置断点,例如b main、b 20)、c(continue继续运行)、n(单步运行,如果是函数,则不进入函数)、s(单步运行,如果是函数,则进入函数)、q(退出调试)等。

三、GDBServer远程调试

以上都是在PC主机上的调试,当调试嵌入式程序和内核程序等特殊程序时,需要用到远程调试的方法。远程调试环境由宿主机GDB和目标机调试stub共同构成,两者通过串口或TCP连接。GDB stub是调试器的核心,它处理来自主机上的GDB的请求,控制目标机上的被调试进程。

嵌入式Linux系统中,主要有三种调试方法,分别适用于不同场合的调试工作:
a、用ROM Monitor调试目标机程序;
b、用KGDB调试系统内核;
c、用GDBServer调试用户空间程序。

最常用的就是使用GDB+GDBServer的方式调试开发板上的嵌入式Linux程序,其中GDBServer运行在目标机上,GDB在宿主机上运行。

GDBServer是GDB的一个组件,但通常不随发行版中的GDB一同发布,需要用户自行编译得到GDBServer,可以从http://sourceware.org/gdb/获得GDB的源码包。

1、配置GDB,设置安装路径为/usr/local/arm/gdb。
$./configure –target=arm-fsl-linux-gnueabi –prefix=/usr/local/arm/gdb

2、编译及安装
make sudo make install

3、配置编译GDBServer
cdgdb/gdbserver ./configure –target=arm-fsl-linux-gnueabi –host=arm-fsl-linux-gnueabi
make arm-fsl-linux-gnueabi-strip gdbserver(去掉符号信息,能大幅缩小gdbserver的体积)

4、将编译好的gdbserver拷贝到目标板中。

5、调试程序流程
a、 armfsllinuxgnueabigccggdbexample.cogdbexamplearmb gdbserver 192.168.2.225:8888 gdb_example_arm 其中192.168.2.225是主机IP,当出现提示:
Process /root/gdb_example_arm created
Listening on port 8888
表明GDBServer开始监听8888端口。
c、回到主机,在主机上运行以下程序:
$arm-fsl-linux-gnueabi-gdb gdb_example_arm
……….
(gdb)target remote 192.168.2.210:8888

如果在目标机端出现提示:
Remote debugging from host 192.168.2.225
则说明主机的GDB和目标机的GDBServer连接成功,可以在主机上进行调试了。
注意:需要使用”c”命令而不是”run”命令来运行程序,因为程序已由GDBServer启动了,所以不必再启动。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐