您的位置:首页 > 其它

GDB调试器的使用

2017-04-20 17:06 639 查看
一、使用概述

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、编译及安装

makesudo make install

3、配置编译GDBServer

cdgdb/gdbserver./configure –target=arm-fsl-linux-gnueabi –host=arm-fsl-linux-gnueabi

makearm-fsl-linux-gnueabi-strip gdbserver(去掉符号信息,能大幅缩小gdbserver的体积)

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

5、调试程序流程

a、arm−fsl−linux−gnueabi−gcc−ggdbexample.c−ogdbexamplearmb、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启动了,所以不必再启动。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  调试