简介
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.c ,继续执行,并且自动在第二次循环执行到第8行时又暂停,用 p sum,可以看到sum的值为101(第一次循环是sum+=i; i为1)
7.c ,继续执行,并且自动在第二次循环执行到第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)
Linux C编程学习之开发工具2---GDB调试器的更多相关文章
-
Linux C编程学习之开发工具3---多文件项目管理、Makefile、一个通用的Makefile
GNU Make简介 大型项目的开发过程中,往往会划分出若干个功能模块,这样可以保证软件的易维护性. 作为项目的组成部分,各个模块不可避免的存在各种联系,如果其中某个模块发生改动,那么其他的模块需要相 ...
-
Linux C编程学习之开发工具1---GCC编译器
GCC简介 GCC(GNU Compiler Collection)是一套功能强大.性能优越的编程语言编译器,它是GNU计划的代表作品之一.GCC以GPL和LGPL许可证发行,它是类Unix和苹果电脑 ...
-
Linux 系统编程 学习:00-有关概念
Linux 系统编程 学习:00-有关概念 背景 系统编程其实就是利用系统中被支持的调度API进行开发的一个过程. 从这一讲开始,我们来介绍有关Linux 系统编程的学习. 知识 在进行Linux系统 ...
-
Linux 系统编程 学习:03-进程间通信1:Unix IPC(2)信号
Linux 系统编程 学习:03-进程间通信1:Unix IPC(2)信号 背景 上一讲我们介绍了Unix IPC中的2种管道. 回顾一下上一讲的介绍,IPC的方式通常有: Unix IPC包括:管道 ...
-
Linux 系统编程 学习:04-进程间通信2:System V IPC(1)
Linux 系统编程 学习:04-进程间通信2:System V IPC(1) 背景 上一讲 进程间通信:Unix IPC-信号中,我们介绍了Unix IPC中有关信号的概念,以及如何使用. IPC的 ...
-
Linux 系统编程 学习:06-基于socket的网络编程1:有关概念
Linux 系统编程 学习:006-基于socket的网络编程1:有关概念 背景 上一讲 进程间通信:System V IPC(2)中,我们介绍了System IPC中关于信号量的概念,以及如何使用. ...
-
Linux 系统编程 学习:09-线程:线程的创建、回收与取消
Linux 系统编程 学习:09-线程:线程的创建.回收与取消 背景 我们在此之前完成了 有关进程的学习.从这一讲开始我们学习线程. 完全的开发可以参考:<多线程编程指南> 在Linux ...
-
编程入门-Java开发工具介绍及Eclipse安装
编程入门-Java开发工具介绍及Eclipse安装 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Java开发工具介绍 "源代码"一般是文字,所以可以使用记 ...
-
Linux 系统编程 学习 总结
背景 整理了Liunx 关于 进程间通信的 很常见的知识. 目录 与 说明 Linux 系统编程 学习:000-有关概念 介绍了有关的基础概念,为以后的学习打下基础. Linux 系统编程 学习:00 ...
随机推荐
-
浅谈被加壳ELF(即android的so文件)的调试
本文只讨论如何调试被加壳的ELF文件,包括调试中的技巧运用及调试过程中可能遇到的问题的解决方法,不包含如何还原加固的DEX本文将以某加壳程序和某加固为目标. 一.ELF格式简介 ELF全称:Execu ...
-
git介绍
简介:Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目.Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件.Git ...
-
[转]面向GPU的多LOD因子的大规模场景可视化策略
直接附上原文链接: 1.面向GPU的多LOD因子的大规模场景可视化策略 2.Real-Time Dynamic Level of Detail Terrain Rendering with ROAM
-
系统级IO实践学习记录
代码分析 cp1.c 功能:复制文件. #include <stdio.h>#include <stdlib.h>#include <unistd.h>#inclu ...
-
C++的那些事:函数全解析
一.函数的结构 函数在C++中可能出现在三种地方,一是函数的定义,它包括了如上图的结构:二是函数的声明,它与函数的定义相比,没有了函数体部分:三则是函数的调用.当然,不同的函数定义可以还会稍有不同,比 ...
-
WCF 超时情形
在做WCF开发时,会经常碰到超时的情况,总结了一下,主要是由一下原因引起: 1.客户端没有正确地Close. 确保每次客户端调用完毕之后,就要调用Close,保证连接数. 另外,服务端配置最大连接数: ...
-
.NET: 配置文件
VS里项目->添加新项->应用程序配置文件 <?xml version="1.0" encoding="utf-8" ?> <co ...
-
GitHub与Versions
[第一步]建立先仓库 第一步的话看一般的提示就知道了,在github新建一个repository(谷歌可以解决),都是可视化的界面操作,所以难度不大.或者看这里:https://help.github ...
-
Oracle.DataAccess.Client.OracleCommand”的类型初始值设定项引发异常。
Oracle.DataAccess.Client.OracleCommand”的类型初始值设定项引发异常. 64位系统下,部署32位odp.net,出现问题.解决方法:卸载32位xcopy odt.n ...
-
Codeforces Round #304 (Div. 2) -----CF546
A. Soldier and Bananas A soldier wants to buy w bananas in the shop. He has to pay k dollars for t ...