Linux C编程学习3---GDB调试器

简介

  GDB是一个功能强大的交互式程序调试工具,主要工作在字符界面下。

  GDB不仅可以用来调试C/C++ 语言编写的程序,还可以用来调试 Pascal、Objective-C,以及Fortran等语言编写的程序

GDB常用命令

  GDB 调试器有很多命令,从简单的文件载入、断点设置到复杂的内存查看、信号捕捉等。

  在使用GDB 调试程序之前,必须使用 -g 选项用gcc(或者g++)编译源文件,以便将调试信息加入到要调试的程序之中,而且 gcc 的 -个选项不能和优化选项一起使用

  GDB的基本命令包括GDB的启动与退出、载入程序、列出源代码、执行程序以及使用帮助功能等

1.GDB的启动与退出

  直接在命令行输入gdb 就会进入gdb 的交互模式

  在gdb的交互模式,使用 q 命令会退出 gdb

2.载入程序

  方式1:直接使用命令: gdb 可执行文件,例子:gdb test

  方式2:使用 gdb 先进入gdb 的交互模式,然后在gdb 交互模式下使用 file 可执行文件(例子:file test)将要调试的可执行文件载入

3.列出源代码

  在载入程序之后,使用 list(或者使用简写形式 l)就会列出前十行代码

  再输入 l(或list),就会列出紧接着的后十行代码

  l 3,5:列出第三到第五行的代码

  l 9:列出第九行以及它的上下五行代码

4.执行程序

  使用r(或者run)来直接运行载入的程序,如果程序中没有设置断点,那么将一直执行程序;如果程序中存在断点,那么将会执行到第一个断点所在的地方,然后停住

5.使用帮助功能

  可以在gdb 的交互模式下使用 help 命令列出命令的种类(比如 running、stack、status……)

  如果在 help 后面加上某个种类的名称,那么将会列出这个种类下的所有的命令信息,比如 help running 将给出所有关于程序运行的命令

  可以直接在help 后跟命令的名称,获取这条命令的介绍,比如 help run 将获取关于 run 的详细介绍

断点设置与管理

  断点设置即在调试的程序中设置断点,断点的管理包括查看断点信息、删除或禁用断点等

1.设置断点(break)

  命令是break,或者简写为 b

  b 8:在第8行设置断点,如果这个使用再用 r 运行程序,会发现程序会在第 8 行暂停

    如果想要继续运行,可以使用 continue(或者c)继续执行,也会在遇到断点时暂停

  b 函数名:是程序在遇到指定的函数时候暂停执行

  b 8 if i>7:在第8行设置断点,并且只有在当第8行的 i>7 为真时才会暂停

2.查看断点信息(info break)

  info break:显示当前gdb 在调试程序中设置的所有断点信息

3.删除指定的断点(d)

  d 断点号:或者是使用delete,指定断点号的话将会删除指定的那个断点,如果不指定断点号将会删除所有断点 

4.删除指定行上的断点(clear)

  clear 行号(或者一个范围):删除指定行上的断点

5.禁用指定的断点(disable)

  disable 断点号:暂时禁止指定的断点号,如果不指定断点号将会禁止所有断点

6.恢复指定的断点(enable)

  enable 断点号:使得用 disable禁止的断点再次有效

7.设置观察点(watch)

  在程序的调试过程中,经常需要定位某个变量被改动的位置。

  使用观察点用来检测某个变量或者表达式的值是否有变化,如果有变化则暂停程序的运行

  watch 变量名(或者表达式的名称):watch设置观察点必须是在程序的运行过程中设置的,也就是在运行run 命令之后进行设置

数据显示与变量赋值

  上面介绍断点的应用,但是如果只有断点是用处不大的,要跟踪程序的运行,必须能够在断点处查看或修改变量的值

  下面的介绍是以这个源码为例的(test.c)

#include<stdio.h>
int main()
{
    int i;
    int sum = 0;
    for(i=1; i<=10; i++)
    {
        sum += i;
    }
    printf("1+2+...+10=%d\n", sum);
    return 0;
}

1.显示变量或表达式的值(print或者p)

  1.编译程序(一定要使用 -g 选项):gcc -g -o test test.c

  2.使用 gdb test 载入要调试的文件(下面的命令都是在 gdb的交互模式下执行的)

  3.b 8,在第八行设置断点

  4.r,运行程序,在第八行暂停

  5.p sum,显示此时 sum的值,此时sum的值为0

    或者使用 p/x sum,使用 16进制形式输出 sum的值

  6.使用 c 命令继续执行,第二次循环又在 第8行暂停

  7.p sum,显示此时上的sum 值为 1(...依次循环)

  p 之后的变量必须是全局变量,或者是在这个作用域有效的局部变量,如果全局变量和局部变量重名,那么局部变量会隐藏全局变量,如果此时像查看 全局变量的值,使用 :: 操作符

2.自动显示变量或表达式的值(display)

  使用该命令之后,每当程序运行到断点处,就会自动显示之前设置过得变量或表达式

  1、2、3、4同上,此时暂停执行

  5.display sum:设置自动显示sum

  6.c :继续执行,并且自动在第二次循环执行到第8行时又暂停,此时会自动显示 sum 的值,而不用再去使用 p sum 了  

3.显示变量的数据类型(whatis、ptype)

  1、2、3、4同上,此时暂停执行

  5.使用 whatis sum,或者 ptype sum,将会显示:type = int,就是sum的数据类型的 int

4.修改变量的值(set)

  1、2、3、4同上,此时暂停执行

  5.set sum=100,设置此时的sum 为100,然后下面的运行就会在sum=100基础上执行

  6.,继续执行,并且自动在第二次循环执行到第8行时又暂停,用 p sum,可以看到sum的值为101(第一次循环是sum+=i; i为1)

  7.,继续执行,并且自动在第二次循环执行到第8行时又暂停,用 p sum,可以看到sum的值为103(第一次循环是sum+=i; i为2)

程序执行与函数调用

  上面已经介绍了 run和continue,下面介绍其他的

1.单步执行(step、next)

  step可以简写为s;next可以简写为 n

  step:执行到函数调用的地方,会跟踪进入函数内部(并且会给出提示信息:被调用函数的入口地址、行号……)

  next:执行到函数调用的地方,并不会跟踪进入函数内部,而是直接将函数调用看做是一个语句,直接执行过去

2.退出被调用的函数(return)

  step 可以跟踪进入被调用函数的内部,但是如果想要退出被调用函数,则可以使用 return 命令

3.执行到指定行(until 行号)

  使用until 的前提是从当前行到指定行之间没有断点,否则会在第一个断点处暂停

4.跳转执行(jump)

  一般情况下,程序会按照程序代码的顺序执行,但是如果想要更改程序的运行顺序,可以使用 jump

5.强制调用函数(call)

其他调试命令

1.查看堆栈信息(backtrace、frame)

2.查看源程序信息(info source)

3.查看寄存器(info registers)

4.查看程序的汇编代码(disassemble)

 

时间: 2024-10-07 01:30:50

Linux C编程学习3---GDB调试器的相关文章

Linux gdb调试器用法全面解析

GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具,GDB主要可帮助工程师完成下面4个方面的功能: 启动程序,可以按照工程师自定义的要求随心所欲的运行程序. 让被调试的程序在工程师指定的断点处停住,断点可以是条件表达式. 当程序被停住时,可以检查此时程序中所发生的事,并追索上文. 动态地改变程序的执行环境. 不管是调试Linux内核空间的驱动还是调试用户空间的应用程序,掌握gdb的用法都是必须.而且,调试内核和调试应用程序时使用的gdb命令是完全相同的,下面以代码清单22.2的应用程

linux基础2——gdb调试器

gdb调试器使用的一般步骤(不断更新完善): 1.编译过程中要用-g参数来添加调试符号——gcc test.c -g: 2.gdb启动可执行文件——gdb a.out: 3.出现gdb符号表示启动成功: 4." l " (小写l)命令可以查看当前代码是否是要执行的代码: 5.断点 b 行号/函数名字——作用是程序执行过程中会自动在断点处暂停,等待指令 info b—— 查看断点列表 d 编号——删除指定编号的断点 6.执行程序 r 回车——程序启动,执行到代码中第一个出现断点处暂停 7

linux网络编程学习笔记之五 -----并发机制与线程?

进程线程分配方式 简述下常见的进程和线程分配方式:(好吧,我仅仅是举几个样例作为笔记...并发的水太深了,不敢妄谈...) 1.进程线程预分配 简言之,当I/O开销大于计算开销且并发量较大时,为了节省每次都要创建和销毁进程和线程的开销.能够在请求到达前预先进行分配. 2.进程线程延迟分配 预分配节省了处理时的负担,但操作系统管理这些进程线程也会带来一定的开销.由此,有个折中的方法是,当某个处理须要花费较长时间的时候,我们创建一个并发的进程或线程来处理该请求.实现也非常easy,在主线程中定时,定

linux网络编程学习笔记之五 -----并发机制与线程池

进程线程分配方式 简述下常见的进程和线程分配方式:(好吧,我只是举几个例子作为笔记...并发的水太深了,不敢妄谈...) 1.进程线程预分配 简言之,当I/O开销大于计算开销且并发量较大时,为了节省每次都要创建和销毁进程和线程的开销.可以在请求到达前预先进行分配. 2.进程线程延迟分配 预分配节省了处理时的负担,但操作系统管理这些进程线程也会带来一定的开销.由此,有个折中的方法是,当某个处理需要花费较长时间的时候,我们创建一个并发的进程或线程来处理该请求.实现也很简单,在主线程中定时,定时到期,

使用GDB调试器(一)

使用GDB调试器 GDB概要---- GDB是GNU开源组织公布的一个强大的UNIX下的程序调试工具.也许,各位比較喜欢那种图形界面方式的,像VC.BCB等IDE的调试,但假设你是在UNIX平台下做软件,你会发现GDB这个调试工具有比VC.BCB的图形化调试器更强大的功能.所谓"寸有所长.尺有所短"就是这个道理. 一般来说.GDB主要帮忙你完毕以下四个方面的功能: 1.启动你的程序,能够依照你的自己定义的要求随心所欲的执行程序.    2.可让被调试的程序在你所指定的调置的断点处停住.

GDB调试器的使用

http://blog.chinaunix.net/uid-23193900-id-3184605.html 1.什么是程序的调试? 程序调试的目的就是找出程序中隐藏的故障,校正那些不正常的指令,使程序能够正常工作. 2.调试的类别 程序的调试有几种不同的级别.最高级别当然是编程人员通过自己肉眼观察和推断,找出那些有毛病的代码并修改之.最低级别是对汇编代码进行调试.由于汇编语言代码的复杂.冗长与不直观.在汇编级对程序进行调试是一件比较费力的事. 使用得最多的大概还是源程序级即符号级的调试,在此种

Linux C编程学习2---GCC编译器

GCC简介 GCC(GNU Compiler Collection)是一套功能强大.性能优越的编程语言编译器,它是GNU计划的代表作品之一.GCC以GPL和LGPL许可证发行,它是类Unix和苹果电脑 Mac OS X操作系统的标准编译器 除了支持C,还支持C++.Java GCC常用选项 1. 基本选项 类型 说明 -E 预处理后即停止,不进行编译.汇编及连接 -S 编译后即停止,不进行汇编及连接 -c 编译或汇编源文件,但是不进行连接 -o file 指定输出文件为 file 例子: gcc

linux网络编程学习笔记之二 -----错误异常处理和各种碎碎(更新中)

errno 在unix系统中对大部分系统调用非正常返回时,通常返回值为-1,并设置全局变量errno(errno.h),如socket(), bind(), accept(), listen().erron存放一个正整数来保存上次出错的错误值. 对线程而言,每个线程都有专用的errno变量,不必考虑同步问题. strerror converts to English (Note: use strerror_r for thread safety) perror is simplified str

GCC编译器和GDB调试器常用选项

http://blog.csdn.net/u014328976/article/details/46745349 GCC编译器 gcc hello.c -o hello                   #将hello.c编译成hello可执行文件 gcc -E hello.c -o hello.i              #将hello.c 转换成预处理后的文件hello.igcc -S hello.c -o hello.S              #将hello.c 转换成汇编文件 h