初识gdb

gdb是什么?在linux终端找man后,对gdb的描述如下——

/**********gdb**********/

gdb即The
GNU Debugger的缩写。

gdb是一种调试工具,使用gdb可以窥探一个程序在运行时或者crash时的内部信息,主要有以下四种功能:

1、启动程序,按自定义的方式运行程序。

2、在特定条件下(即断点处)stop程序。

3、程序stop时,检查程序中所发生的事情。

4、改变程序执行环境,修正bug行为。

gdb可以调试C/C++程序,如果GNU提供了Fortran编译器的话,也可以调试Fortran程序。在shell终端启动gdb有多种方式,如下:

1、直接运行gdb而不带任何参数

$ gdb

GNU gdb (GDB) 7.5.91.20130417-cvs-ubuntu

Copyright (C) 2013 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 "showcopying"

and "show warranty" for details.

This GDB was configured as "x86_64-linux-gnu".

For bug reporting instructions, please see:

<http://www.gnu.org/software/gdb/bugs/>.

(gdb)

2、带参数运行gdb的几种形式

$ gdb program

$ gdb program core

$ gdb program pid

program是可执行文件,core是程序非法执行时coredump产生的文件,对于服务程序可指定pid,这时gdb会自动attach上去。

下面是几个常用的gdb命令:

break [file:]function

在(file文件的)function函数上设置断点。

run [arglist]

运行程序(可以指定运行参数arglist)。

bt

即backtrace,显示程序栈信息。

print expr

显示expr表达式的值。

c

即continue,继续执行程序,例如程序停在某个断点之后。

next

程序停止后执行程序下一行,会跳过function。

edit [file:]function

在程序当前停止的地方查看程序行。

list [file:]function

打印程序当前停止地方附近的文本。

step

程序停止后执行程序下一行,会进入function。

help[name]

显示提示信息,name是某个gdb命令。

quit

推出gdb。

/**********gdb**********/

下面以一个具体的例子main.c作为示例。

// main.c
#include <stdio.h>

int sum(int n)
{
    int ret = 0;
    int i = 0;
    for (i = 1; i <= n; ++i) {
        ret += i;
    }
    return ret;
}

int main(void)
{
    int n = 10;
    int result = sum(n);
    printf("result = %d\n", result);

    return 0;
}

linux终端编译main.c生成可执行文件test-g生成调试信息,-o制定可执行文件名:

$ gcc -g main.c -o test

gdb启动test

$ gdb test

list(缩写为l)显示sum函数的完整信息:

(gdb) list sum

1         // main.c

2         #include <stdio.h>

3

4         int sum(int n)

5         {

6             int ret = 0;

7             int i = 0;

8             for (i = 1; i <= n; ++i) {

9                 ret += i;

10         }

按回车键继续:

(gdb)

11          return ret;

12     }

13

14     int main(void)

15     {

16         int n = 10;

17         int result = sum(n);

18         printf("result = %d\n", result);

19

20         return 0;

按回车键继续:

(gdb)

21     }

22

结束,再次按回车键会提示越界:

(gdb)

Line number 23 out of range; main.c has 22 lines.

break(缩写为b)在程序第16行打断点:

(gdb) break 16

Breakpoint 1 at 0x400551: file main.c, line 16.

b在程序sum函数处打断点:

(gdb) b sum

Breakpoint 2 at 0x40051b: file main.c, line 6.

info(缩写为i)查看break断点信息:

(gdb) info break

Num Type Disp Enb Address What

1 breakpoint keep y 0x0000000000400551 in main at main.c:16

2 breakpoint keep y 0x000000000040051b in sum at main.c:6

run(缩写为r)执行程序(停在了断点处):

(gdb) run

Starting program: /home/test

Breakpoint1, main () at main.c:16

16            int n = 10;

backtrace(缩写为bt)查看函数栈:

(gdb) backtrace

#0 main () at main.c:16

next(缩写为n)执行程序下一行:

(gdb) next

17             int result = sum(n);

n执行程序下一行(又停在了断点处):

(gdb) n

Breakpoint 2, sum (n=10) at main.c:6

6            int ret = 0;

n执行程序下一行:

(gdb) n

7             int i = 0;

n执行程序下一行:

(gdb) n

8             for (i = 1; i <= n; ++i) {

n执行程序下一行:

(gdb) n

9 ret += i;

print(缩写为p)打印某个变量的值:

(gdb) print ret

$1 = 1

n执行程序下一行(从9行返回到了8行):

(gdb) n

8            for (i = 1; i <= n; ++i) {

continue(缩写为c)继续运行程序(直到下一个断点或者程序结束):

(gdb) continue

Continuing.

result = 55

[Inferior 1 (process 5540) exited normally]

如果没执行上面的continue命令,通过finish可结束当前函数:

(gdb) finish

Run till exit from #0 sum (n=10) at main.c:9

0x0000000000400562 in main () at main.c:17

17     int result = sum(n);

Value returned is $2 = 55

quit(缩写为q)退出gdb

(gdb) quit

时间: 2024-11-08 11:20:11

初识gdb的相关文章

调试利器GDB(上)

调试利器GDB(上) 1.1 GDB初识 1.1.1什么是GDB? GDB是GNU项目中的调试器(gnu debuger),能够跟尊程序的执行,也能恢复程序崩溃前的状态 1.1.2为什么需要GDB? 软件产品的研发过程必然伴随bug,调试时软件开发中不可或缺的技术(调试工具很重要) 1.1.3 DBG与binutils 1.2 GDB的常规使用 1.自定义程序得到启动方式(指定影响程序运行的参数)2.设置条件断点(在满足条件时程序暂停执行)3.回溯检查导致程序异常结束的原因(core dump)

Linux下GDB调试与对拍(先挖个坑)

应为NOIP要复赛在NOI-Linux下编写程序,所以被迫选择Vim+Gdb(主要是Guide太丑了). 虽然GUIDE的调试功能已经对付大多数的调试,反正学一学GDB的使用也没什么坏处. 1 生成调试信息 要调试C/C++的程序,首先在编译时,我们必须要把调试信息加到可执行文件中.使用编译器(cc/gcc/g++)的 -g 参数可以做到这一点.如: gcc -g hello.c -o hello g++ -g hello.cpp -o hello 如果没有-g,你将看不见程序的函数名.变量名,

初识Python,望君多多关照

在学习Python之前,我们接触过数据结构和网页制作.前者让我们学习如何把C语言运用的更加整齐规范,而后者让我们亲身学习如何运用所学,制作一个静态网页.通过这些课程的学习,让我对C语言产生了比较大的压力,以至于对编程.对这学期的Python课程都有一种如临大敌的感觉. 但是真的学习了这门课程,体会了编码过程中的一些固定运用方法和套路之后,也许过程中对这门课程隐隐约约产生了一点点朦胧的感觉,仿佛他也并没有想象中的那么困难,起码现在的学习让我认为,他可能没有C语言那么繁琐和麻烦.当然,以一个初学者的

gdb调试

[前言]使用gdb调试前,在编译程序时,要加 -g 选项,否则你将看不见程序的函数名.变量名,所代替的全是运行时的内存地址. 1.开始调试 a.  gdb <program> program也就是你的执行文件,一般在当前目录下. b. gdb <program> core 用gdb同时调试一个运行程序和core文件,core是程序非法执行后core dump后产生的文件. 2.[列出源码],从第n行开始(编译时要加 -g 选项) l n 3.[设置断点]在第N行加断点 break

初识数组排序!!!!

<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>初识数组排序</title> <!--调试成功--> <style type="text/css"> *{ padding:0; margin: 0; } li,ul{ list-style: none; } #p

初识操作系统和linux

初识操作系统和linux 1.计算机系统由硬件系统和软件系统两大部分组成:是一种能接收和存储信息,并按照存储在其内部的程序对海量数据进行自动.高速地处理,然后把处理结果输出的现代化智能电子设备. 2.世界上第一台计算机是1946年诞生在美国宾州大学. 3.冯·诺依曼体系结构:1946年数学家冯·诺依曼于提出计算机硬件系统由运算器.控制器.存储器.输入设备.输出设备.摩根定律:当价格不变时,集成电路上可容纳的元器件的数目,约每隔18-24个月便会增加一倍,性能也将提升一倍.现在计算机技术进本很难遵

gdb调试命令

本篇摘自互联网,纯属自己学习笔记,然分享给看到我的博客的人们. 用GDB调试程序 GDB是一个强大的命令行调试工具.大家知道命令行的强大就是在于,其可以形成执行序列,形成脚本.UNIX下的软件全是命令行的,这给程序开发提代供了极大的便利,命令行软件的优势在于,它们可以非常容易的集成在一起,使用几个简单的已有工具的命令,就可以做出一个非常强大的功能. 于是UNIX下的软件比Windows下的软件更能有机地结合,各自发挥各自的长处,组合成更为强劲的功能.而Windows下的图形软件基本上是各自为营,

Go语言gdb调试踩坑

整个是一个docker环境 docker版本: 1.12.1,镜像是我自己做的基于ubuntu:14.04.05. 容器操作系统版本: Ubuntu 14.04.5 LTS go版本: 1.6.3 在gdb中执行run命令出错! 错误输出: warning:Error disabling address space randomization: Operation not permitted 环境:docker 解决办法: warning:Error disabling address spac

JAVA 初识类加载机制 第13节

JAVA 初识类加载机制 第13节 从这章开始,我们就进入虚拟机类加载机制的学习了.那么什么是类加载呢?当我们写完一个Java类的时候,并不是直接就可以运行的,它还要编译成.class文件,再由虚拟机解释给当前的操作系统去执行.这些过程都是我们看不见的,我们能看见的也就是一个.class文件.既然虚拟机要解释这些.class文件给当前的操作系统听,那么他怎么获得这些.class文件呢?虚拟机获得这些.class文件的过程就是类加载了. 所以,总结来说就是:虚拟机将.class文件从磁盘或者其他地