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
这个程序是有问题的,运行会出现段错误。
(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启动了,所以不必再启动。
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启动了,所以不必再启动。
相关文章推荐
- GDB 调试器使用手册
- GDB 调试器使用手册
- Linux教程 - Linux - GDB调试器使用手册(七)
- 调试器(GDB)的基本使用方法(之二)
- 调试器(GDB)的基本使用方法(之一)
- GDB 调试器使用手册
- GDB调试器的使用
- GDB调试器使用手册(转载)
- 文章翻译——使用 GNU 的 GDB调试器,内存布局和栈——02
- linux下编译器gcc和调试器gdb的使用
- 使用GDB调试器
- Linux下汇编调试器GDB的使用
- GDB调试器使用详解(一)
- GNU/linux gdb调试器的使用 及 makefile编译多个目标
- GDB 调试器使用手册
- GDB调试器使用手册
- Linux下汇编调试器GDB的使用
- gdb 调试器的使用
- 使用 GNU 的 GDB调试器,内存布局和栈
- Linux下gdb调试器的使用