从windows转到linux下已经有一段时间了,每次刷算法题碰到问题需要调试的时候,就分分钟想关机,切换到windows上调试。于是,花了一点时间来搜索一下linux下常见的调试工具,这不搜不知道,一搜吓一跳,居然差点错过了这么好的调试利器GDB。上手十分简单,几分钟就可以开开心心调试你的代码了。

GDB概述

GDB是一个由GNU开源组织发布的、UNIX/LINUX操作系统下的、基于命令行的、功能强大的程序调试工具。相比于VS里面的图形化调试工具,其功能更加强大。

GDB安装

在终端下运行如下代码即可安装GDB调试器:

sudo apt-get install gdb

检查安装是否成功,输入gdb -version,会输出如下代码:

GNU gdb (Ubuntu 7.10-1ubuntu2) 7.10
Copyright (C) 2015 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".
Type "show configuration" for configuration details.

GDB调试步骤

调试用例

写了一个简单实现两个数相加的程序,来示范gdb调试的相关步骤:

#include <stdio.h>
int add(int a , int b){
    return a+b;
}
int main(){
    int m,n;
    scanf("%d%d",&m,&n);
    int sum = add(m , n);
    return 0;
}

编译生成

一般在编译程序的时候都是直接生成release可执行文件,

gcc -o add add.c

如果需要调试的话,应该编译成debug版本,此时,只用在编译选项中加入 -g,如下:

gcc -g add.c -o add

进入调试状态

进入gdb调试状态有两种,第一种直接在gdb命令后面加上编译好的文件名:

gdb add

另一种方式就是输入gdb,然后通过使用file命令来打开待调试的文件:

gdb
file add

终端界面会显示如下信息:

GNU gdb (Ubuntu 7.10-1ubuntu2) 7.10
Copyright (C) 2015 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".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from add...done.
(gdb) 

常用调试命令

常用命令 简写命令 用法 说明
file f file filename 在gdb中载入某可执行文件
list l list [开始,结束] 列出文件的代码清单,支持指定行号
print p p 变量名 答应出变量的值
break b break 行号or函数名 在指定行号或函数上设置断点
clear cl clear 行号or函数名 删除指定行号或函数上的断点
continue c continue [开始,结束] 从断点处继续运行
next n next 运行到下一行
step s step 单步调试
run r run 执行程序

实际调试

列出代码清单

(gdb) l
1   #include <stdio.h>
2
3   int add(int a , int b){
4       return a+b;
5   }
6   int main(){
7       int m,n;
8       scanf("%d%d",&m,&n);
9       int sum = add(m , n);
10      return 0;

加断点

在main函数和程序的第4行加两个断点。

(gdb) break main
Breakpoint 1 at 0x4005e2: file add.c, line 6.
(gdb) break 4
Breakpoint 2 at 0x4005d0: file add.c, line 4.

运行

(gdb) run
Starting program: /home/Documents/add 

Breakpoint 1, main () at add.c:6
6   int main(){                    //这里显示运行到的位置,停在了第一个断点位置main

next下一行

(gdb) n
8       scanf("%d%d",&m,&n);  //下一行
(gdb) n                       //下一行需要输入两个数字
5 4
9       int sum = add(m , n); //执行到add函数位置

step单步

(gdb) s

Breakpoint 2, add (a=5, b=4) at add.c:4   //单步调试恰好到达第二个断点的位置
4       return a+b;

打印变量的值

(gdb) p a  // 打印a的值
$1 = 5
(gdb) p b  //打印b的值
$2 = 4

清除断点

清楚指定行的断点,不加表示清除所有的断点

(gdb) break 9
Breakpoint 5 at 0x40060b: file add.c, line 9.  //加一个断点
(gdb) cl 9
Deleted breakpoint 5  //测试清除

从断点处继续运行

(gdb) c
Continuing.
[Inferior 1 (process 8168) exited normally]   //程序正常退出,调试完毕

高级命令

gdb还有很多高级用法,如查看堆栈列表,分割窗口等,这里就不一一测试了。

查询运行信息

  • where/bt:查看当前运行的堆栈列表
  • up/down:改变堆栈显示的深度
  • set args:参数:指定运行时的参数
  • show args:查看设置好的参数
  • info program: 来查看程序的是否在运行,进程号,被暂停的原因。

分割窗口

  • layout:用于分割窗口,可以一边查看代码,一边测试
  • layout src:显示源代码窗口
  • layout asm:显示反汇编窗口
  • layout regs:显示源代码/反汇编和CPU寄存器窗口
  • layout split:显示源代码和反汇编窗口
  • Ctrl + L:刷新窗口

后记

学习gdb调试只需要几分钟就能上手,但是用处超级大!!受益匪浅啊!这就是所谓的低投入高回报,还在等什么,赶紧行动吧。

GDB调试工具入门的更多相关文章

  1. Linux环境下的GCC编译器与GDB调试工具介绍

    假如现在我们有如下代码需要编译运行和调试.文件名为:test.c #include <stdio.h> int main() { int day, month, year, sum, le ...

  2. gdb调试工具使用方法分享

    刚才看了一个CSDN上分享gdb调试工具使用的教程,讲得非常好,推荐到这里: http://blog.csdn.net/liigo/article/details/582231

  3. 使用 Strace 和 GDB 调试工具的乐趣

    编写 UNIX® 系统程序充满乐趣,并且具有教育意义.使用 UNIX strace 工具和 GDB(GNU 项目调试工具),您可以真正地深入研究系统的功能,并了解组成这些功能的各种各样的程序.同时使用 ...

  4. GDB快速入门

    GDB快速入门 GDB(GNU DeBugger)是Linux下强大的C/C++调试器,纯命令行操作 启动 以下为测试代码 #include <stdio.h> int nGlobalVa ...

  5. GDB调试工具总结

    程序调试的基本思想是“分析现象->假设错误原因->产生新的现象去验证假设”这样一个循环过程,根据现象如何假设错误原因,以及如何设计新的现象去验证假设,需要非常严密的分析和思考.程序中除了一 ...

  6. Gdb调试工具/ Makfile项目管理

    gdb调试工具 gcc -g main.c -o main 常用命令 命令            简写         作用 help                h            按模块列 ...

  7. 【Linux】GDB调试工具

    GDB调试工具 Linux中包含一个很强大的调试工具GDB(GNU Debuger),可以用它来调试C和C++程序. 一. GDB的主要功能有: 设置断点,当程序运行到断点处暂停 显示变量的值,可以打 ...

  8. GDB调试工具、动态加载、内存管理(day04)

    一.程序中的错误处理 在系统中定义了一个全局变量errno.在这个全局变量中存放着系统调用或者库函数出错的信息(错误编号).然后根据错误编号获取错误信息. 举例说明: 打开一个文件,如果这个文件不存在 ...

  9. linux gdb快速入门教程

    文章目录 前言 常用指令概览 开始使用gdb 一个完整流程一般所需步骤 1 加载程序 2 查看 2.1 查看函数 3 设置断点 3.1 根据函数名设置断点 3.2 根据程序位置(第几行) 4 运行程序 ...

随机推荐

  1. [SCOI2010]生成字符串

    题目描述 lxhgww最近接到了一个生成字符串的任务,任务需要他把n个1和m个0组成字符串,但是任务还要求在组成的字符串中,在任意的前k个字符中,1的个数不能少于0的个数.现在lxhgww想要知道满足 ...

  2. [HNOI2012]永无乡

    题目描述 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以从一个岛 到达 ...

  3. 【LSGDOJ 1850】滑雪课程

    题目描述 贝西去科罗拉多州去滑雪,不过还她不太会玩,只是个能力为 1 的渣渣.贝西从 0 时刻进入滑雪场,一到 T 时刻就必须离开.滑雪场里有 N 条斜坡,第 i 条斜坡滑行一次需要 D i 分钟,要 ...

  4. 【LSGDOJ1834 Tree】树链剖分

    题目描述 给定一个N个结点的无向树,树中的结点按照1...N编号,树中的边按照1...N − 1编号,每条边都赋予一个权值.你需要编写程序支持以下三种操作: 1.    CHANGE i v:将i号边 ...

  5. Polya计数

    Let it Bead Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5365   Accepted: 3585 Descr ...

  6. [bzoj4824][Cqoi2017]老C的键盘

    来自FallDream的博客,未经允许,请勿转载,谢谢. 老 C 是个程序员.     作为一个优秀的程序员,老 C 拥有一个别具一格的键盘,据说这样可以大幅提升写程序的速度,还能让写出来的程序在某种 ...

  7. [bzoj4873]寿司餐厅

    来自FallDream的博客,未经允许,请勿转载,谢谢. Kiana最近喜欢到一家非常美味的寿司餐厅用餐.每天晚上,这家餐厅都会按顺序提供n种寿司,第i种寿司有一个代号ai和美味度di,i,不同种类的 ...

  8. 勤拂拭软件 java web 开发教程(1) - 开发环境搭建

    勤拂拭软件系列教程 之 Java Web开发之旅(1) Java Web开发环境搭建 1 前言 工作过程中,遇到不少朋友想要学习jsp开发,然而第一步都迈不出,连一个基本的环境都没有,试问,如何能够继 ...

  9. 初体验GCP,【福利300$试用金】

    1.https://cloud.google.com/free/ ,填写相应信息.需要信用卡,预扣1美元. 2.一波信息填写,成功. 3.激活终端 4.创建一个Python项目,选择部署地点. 5.部 ...

  10. Thread类中的静态方法

    1.currentThread() currentThread()方法返回的是对当前正在执行线程对象的引用. package thread; /** * 线程类的构造方法.静态块是被main线程调用的 ...