GDB調試器的使用

一、使用概述

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啓動了,所以不必再啓動。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章