当前位置: 首页 > 编程日记 > 正文

Linux下gdb调试工具的使用

gdb是GNU开源组织发布的一个强大的Linux下的程序调试工具。

gdb主要完成四个方面的功能:(1)、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序;(2)、可让被调试的程序在你所指定的调试的断点处停住(断点可以是条件表达式);(3)、当程序被停住时,可以检查此时你的程序中所发生的事;(4)、动态的改变你程序的执行环境。

要想运行准备调试的程序,可使用run命令,在它后面可以跟随发给该程序的任何参数,包括标准输入和标准输出说明符(<;和>;)和shell通配符(*、?、[、])在内。如果你使用不带参数的run命令,gdb就再次使用你给予前一条run命令的参数。利用set  args命令就可以修改发送给程序的参数,而使用show  args命令就可以查看其缺省参数的列表。

一般来说,gdb主要调试的是c/c++的程序,也可以调试Ada、Objective-C、Pascal及其它语言。要调试c/c++的程序,首先在编译时,我们必须要把调试信息加到可执行文件中。使用编译器(cc/gcc/g++)的-g(-ggdb)参数可以做到这一点。如果没有-g,你将看不见程序的函数名、变量名,所代替的全是运行时的内存地址。

启动gdb的方法:(1)、gdb  <program> :program就是执行文件,一般在当前目录下;(2)、gdb  <program>  core:用gdb同时调试一个运行程序和core文件,core是程序非法执行后core  dump后产生的文件;(3)、gdb  <program>  <PID> :如果是一个服务程序,你可以指定这个服务程序运行时的进程ID。gdb会自动attach上去,并调试它。

gdb中,输入命令时,可以不用打全命令,只用打命令的前几个字符就可以了,当然,命令的前几个字符应该要标志着一个唯一的命令,在Linux下,可以敲击两次Tab键来补齐命令的全称,如果有重复的,那么gdb会把相关的全例出来。

gdb调试中常用的命令:

(1)、l或list命令,查看源码;

(2)、r或run命令,运行程序,会在有断点的地方停住,如果是有输入参数的,则为run  argv[1]  argv[2];

(3)、break  n,在源程序第n行处设置断点;break  fun,在函数fun()入口处设置断点;break  filename:function ,在源文件filename的function函数的入口处设置断点;break filename:linenum ,在源文件filename的第linenum行处设置断点;break  if<condition>, 在条件成立时停住;filename可以是相对路径,即你不仅可以在当前原文件中设置断点,也可以在该程序中用到的其它目录中的原文件中设置断点;

(4)、info命令,查看指定命令信息,如info  break会显示所有设置的断点信息;

(5)、n或next命令,单条语句执行,如果有函数调用,它不会进入该函数;

(6)、c或continue命令,继续运行程序;

(7)、p或print 变量名var,打印变量var的值。print是gdb的一个功能很强的命令,利用它可以显示被调试的语言中任何有效的表达式。表达式除了包含你程序中的变量外,还可以包含以下内容:A、对程序中函数的调用;B、数据结构和其它复杂对象;

(8)、bt或backtrace命令,查看函数调用栈的所有信息,当程序执行异常时,可通过此命令查看程序的调用过程;

(9)、finish命令,运行程序,直到当前函数完成返回;

(10)、q或quit命令,退出gdb;

(11)、set命令,可指定运行时变量名的值;

(12)、watch  <expr>,为表达式(变量)expr设置一个观察点,一旦表达式的值有变化时,马上停住程序;rwatch <expr>,当表达式(变量)expr被读时,停住程序;awatch  <expr>,当表达式(变量)的值被读或被写时,停住程序;

(13)、clear命令,清除所有的已定义的停止点,如断点等;clear <filename:function>,清除所有设置在函数上的停止点;clear <filename:linenum>,清除所有设置在指定行上的停止点;

(14)、step命令,单步跟踪,如果有函数调用,它会进入该函数,如果想退出该函数返回到它的调用函数中,可以使用finish命令;

(15)、jump命令,可以修改程序的执行顺序,可以让程序执行随意跳跃;

(16)、whatis命令,可以显示某个变量的类型;

(17)、up和down命令:遍历函数堆栈,up是将调用栈上移一个函数调用,down是将调用栈下移一个函数调用;

(18)、where命令:查看逆序的调用堆栈信息;

要想了解gdb的更详细的用法,可以从http://www.gnu.org/software/gdb/documentation/下载gdb  manuals。

以下以一个测试程序为例,说明其中的一些命令的具体用法,此例程的组织结构为:gdbtest为总目录,下面有include/demo/src三个目录,(1)、include/add/add.h, include/subtract/subtract.h;(2)、src/add/add.cpp,src/subtract/subtract.cpp;(3)、demo/test/test.cpp。

每个文件的详细内容为:

add.h:

#ifndef _ADD_H_
#define _ADD_H_int CalAdd(int a, int b);
float CalAdd(float a, float  b, float c);#endif //_ADD_H_

subtract.h:

#ifndef _SUBTRACT_H_
#define _SUBTRACT_H_int CalSubtract(int a, int b);
float CalSubtract(float a, float b);#endif //_SUBTRACT_H_

add.cpp:

#include "../../include/add/add.h"int CalAdd(int a, int b)
{int tmp1 = a / 2;if (b % 2 == 1) {b = b * 2 + 3;} else {b = b + 5;}int tmp2 = -1;tmp1 = a + tmp1 + b + tmp2;return tmp1;
}float CalAdd(float a, float b, float c)
{float tmp1 = a - b;for (int i = 0; i < 10; i ++) {float tmp2 = i * 0.5;tmp1 += tmp2;}float tmp2 = a + c - b - tmp1;return tmp2;
}

subtract.cpp:

#include "../../include/subtract/subtract.h"int CalSubtract(int a, int b)
{int tmp1 = 5;while (tmp1) {int tmp2 = 100;a += tmp2 / 2;-- tmp1;}int  tmp3 = a - b;return tmp3;
}float CalSubtract(float a, float b)
{float tmp1 = -111;for (int i = 0; i < 100; i ++) {float tmp2 = -199;a -= b;a += tmp2;}float tmp3 = a - b;return tmp3;
}

test.cpp:

#include <iostream>
#include <stdlib.h>
#include "../../include/add/add.h"
#include "../../include/subtract/subtract.h"using namespace std;int main(int argc, char* argv[])
{cout<<"integer test, input integer:"<<endl;int a = 5, b = 10;if (argc > 1)a = atoi(argv[1]);if (argc > 2)b = atoi(argv[2]);int ret = 0;cout<<"start add:"<<endl;ret = CalAdd(a, b);cout<<"integer add :"<<ret<<endl;cout<<"start subtract:"<<endl;ret = CalSubtract(b, a);cout<<"integer subtract:"<<ret<<endl;cout<<"ok!!"<<endl;return 0;
}

打开终端,定位为到/demo/test/目录下,依次输入:

g++  -c  -g  test.cpp  ../../src/add/add.cpp  ../../src/subtract/subtract.cpp
g++  -o  test  test.o  add.o  subtract.o

会在test目录下生成test.o, add.o, subtract.o和test执行文件。

下面开始调试test:

(1)、输入gdb test,会显示:

(2)、先用l或list命令,查看当前原文件源码,每次会显示10行,每次显示行数也可以设置,如果想继续查看后面的代码,可以直接按Enter键,表示继续执行上次输入的命令:

(3)、为了不让程序一次性执行完,可以先设置一个断点,后面根据需要可以随时再增加断点,输入break  22,在当前文件test.cpp的第22行设置断点,输入info break查看此断点信息:

(4)、使用run命令开始正式调试test,输入run 10  20:

(5)、使用n或next命令,单步调试,接着输入step命令进入到CalAdd函数内部:

(6)、多设置几个断点:break  ../../src/add/add.cpp:13,break ../../subtract/subtract.cpp:5, break 26, 输入info break查看:

(7)、输入finish命令,从CalAdd函数内部退出,使用whatis命令,查看变量ret类型,输入print ret查看变量值:

(8)、使用continue命令,执行到下一个断点设置处:

(9)、使用clear命令,清除指定的断点:

(10)、如果想从头再次重新调试程序,可接着输入run 30  40,之前设的断点继续有效,如退出gdb调试,直接输入q或quit即可:

参考文献:

1. http://www.gnu.org/software/gdb/

2. http://blog.csdn.net/haoel/article/category/9197

相关文章:

UESTC 1726 整数划分(母函数)

题目链接&#xff1a;http://222.197.181.5/problem.php?pid1726 题意&#xff1a;求n的划分数。一种划分方案中不能有相同的数字。 思路&#xff1a;(1x)(1x^2)(1x^3)……(1x^1000). int f[N];void init() {f[1]1;int a[N]{0};a[0]1; a[1]1;int i,j;for(i2;i<1000;i){for(…

JS nodeType返回类型

JS nodeType返回类型 前几天朋友正好问道 这个 js的nodeType是个什么概念&#xff08;做浏览器底层的&#xff09;正好遇到这篇文章可以向大家解释下 将HTML DOM中几个容易常用的属性做下记录&#xff1a; nodeName、nodeValue 以及 nodeType 包含有关于节点的信息。 nodeName …

C# 获取指定目录下所有文件信息、移动目录、拷贝目录

/// <summary>/// 返回指定目录下的所有文件信息/// </summary>/// <param name"strDirectory"></param>/// <returns></returns>public List<FileInfo> GetAllFilesInDirectory(string strDirectory){List<FileInfo&g…

文件夹浏览(SHBrowseForFolder)

from http://www.cnblogs.com/Clingingboy/archive/2011/04/16/2018284.html 一.首先要为SHBrowseForFolder准备一个结构体BROWSEINFO typedef struct _browseinfoW {HWND hwndOwner;PCIDLIST_ABSOLUTE pidlRoot;LPWSTR pszDisplayName; // Return display…

技术新贵:RPA与NLP技术的结合与应用

什么是 RPA&#xff08;Robotic Process Automation&#xff09;&#xff1f;机器人流程自动化&#xff08;RPA&#xff09;是一种自动化工具&#xff0c;用于创建软件机器人的虚拟劳动力&#xff0c;从而优化和降低企业中端到端业务流程的成本。RPA 可以翻译成机器人流程自动化…

API Sanity Checker在Ubuntu中的使用

API Sanity Checker是一个自动生成单元测试用例的工具&#xff0c;可用于链接测试。它可用于三大桌面平台&#xff0c;下面简单介绍它在Linux下的使用步骤&#xff1a;1. 从http://ispras.linuxbase.org/index.php/API_Sanity_Autotest 下载最新的api-sanity-checker-1.98…

手动脱壳—dump与重建输入表(转)

文章中用到的demo下载地址&#xff1a; http://download.csdn.net/detail/ccnyou/4540254 附件中包含demo以及文章word原稿 用到工具: Ollydbg LordPE ImportREC 这些工具请自行下载准备 Dump原理这里也不多做描述&#xff0c;想要了解google it&#xff01;常见的dump软件有Lo…

如何用RNN生成莎士比亚风格的句子?(文末赠书)

作者 | 李理&#xff0c;环信人工智能研发中心vp&#xff0c;十多年自然语言处理和人工智能研发经验。主持研发过多款智能硬件的问答和对话系统&#xff0c;负责环信中文语义分析开放平台和环信智能机器人的设计与研发。来源 | 《深度学习理论与实战&#xff1a;基础篇》基本概…

图像相似度计算之哈希值方法OpenCV实现

感知哈希算法(perceptual hash algorithm)&#xff0c;它的作用是对每张图像生成一个“指纹”(fingerprint)字符串&#xff0c;然后比较不同图像的指纹。结果越接近&#xff0c;就说明图像越相似。 实现步骤&#xff1a; 1. 缩小尺寸&#xff1a;将图像缩小到8*8的尺寸&am…

七夕大礼包:26个AI学习资源送给你!

整理 | Jane出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;免费的在线学习课程一直是大多数人学习 AI 知识和技能的方式之一。今天&#xff0c;基于 Github 上一位小姐姐 Chip Huyen 分享的 10 门机器学习课程&#xff0c;AI科技大本营将这份收藏大礼包进…

HTML Inspector – 帮助你编写高质量的 HTML 代码

HTML Inspector 是一款代码质量检测工具&#xff0c;帮助你编写更优秀的 HTML 代码。HTML Inspector 使用 JavaScript 编写&#xff0c;运行在浏览器中&#xff0c;是最好的 HTML 代码检测工具。 您可能感兴趣的相关文章Metronic – 赞&#xff01;Bootstrap 响应式后台管理模板…

Git简介以及与SVN的区别

Git是由著名Linux内核(Kernel)开发者Linus Torvalds为了便利维护Linux而开发的。 Git是一个分布式的版本控制系统。作为一个分布式的版本控制系统&#xff0c;在Git中并不存在主库这样的概念&#xff0c;每一份复制出的库都可以独立使用&#xff0c;任何两个库之间的不一致之处…

java集合中某一个元素出现的次数

int count Collections.frequency(list, key); java的内置方法转载于:https://www.cnblogs.com/wysAC666/p/10252676.html

加密解密-DES算法和RSA算法

昨天忽然对加密解密有了兴趣&#xff0c;今天上班查找了一些资料&#xff0c;现在就整理一下吧&#xff1a;&#xff09; 一.DES算法 这种算法如图所示&#xff0c;这里将描述它的每一个步骤。这个算法进行了16次迭代&#xff08;圈&#xff09;&#xff0c;把各块明文交织起来…

开始Dojo之路

开始Dojo之路waiting……转载于:https://blog.51cto.com/frabbit2013/1242108

图像相似度计算之直方图方法OpenCV实现

操作步骤&#xff1a; 1. 载入图像(灰度图或者彩色图)&#xff0c;并使其大小一致&#xff1b; 2. 若为彩色图&#xff0c;增进行颜色空间变换&#xff0c;从RGB转换到HSV&#xff0c;若为灰度图则无需变换&#xff1b; 3. 若为灰度图&#xff0c;直接计算其直方…

黄皓之后,计算机科学上帝Don Knuth仅用一页纸证明布尔函数敏感度猜想

作者 | Freesia编辑 | 夕颜出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;导读&#xff1a;近日&#xff0c;美国艾默里大学计算机与数学科学系教授黄皓&#xff08;Hao Huang&#xff09;用一篇短短 6 页的论文证明了布尔函数&#xff0c;引发了计算机和数学领域社…

数位DP 不断学习中。。。。

1&#xff0c; HDU 2089 不要62 :http://acm.hdu.edu.cn/showproblem.php?pid2089 题意&#xff1a;不能出现4&#xff0c;或者相邻的62&#xff0c; dp[i][0],表示不存在不吉利数字 dp[i][1],表示不存在不吉利数字&#xff0c;且最高位为2 dp[i][2],表示存在不吉利数字 #i…

linux 性能 管理 与 优化

一、影响Linux服务器性能的因素操作系统级&#xff1a;CPU、内存、磁盘I/O带宽、网络I/O带宽程序应用级二、系统性能评估影响性能因素 评判标准 好 坏 糟糕 CPU user% sys%< 70% user% sys% 85% user% sys% >90% 内存 Swap In&#xff08;si&…

对称加密算法之DES介绍

DES(Data Encryption Standard)是分组对称密码算法。DES采用了64位的分组长度和56位的密钥长度&#xff0c;它将64位的输入经过一系列变换得到64位的输出。解密则使用了相同的步骤和相同的密钥。DES的密钥长度为64位&#xff0c;由于第n*8(n1,2,…8)是校验位&#xff0c;因此实…

200行代码解读TDEngine背后的定时器

作者 | beyondma来源 | CSDN博客导读&#xff1a;最近几周&#xff0c;本文作者几篇有关陶建辉老师最新的创业项目-TdEngine代码解读文章出人意料地引起了巨大的反响&#xff0c;原以为C语言已经是昨日黄花&#xff0c;不过从读者的留言来看&#xff0c;C语言还是老当益壮&…

fastJson结合Nutz.Mapl的进阶应用

为什么80%的码农都做不了架构师&#xff1f;>>> 今天要做一堆数据的序列化, 反序列化, 序列化没问题, 反序列化却遇到了点小意外, 这一堆数据不是一个类!!!!!!当然可以通过类内部的一个类型对象来判断, 但是fastJson并没有这个功能, 只能自己一个一个的遍历一个一个…

OpenCV实现遍历文件夹下所有文件

OpenCV中有实现遍历文件夹下所有文件的类Directory&#xff0c;它里面包括3个成员函数&#xff1a;(1)、GetListFiles&#xff1a;遍历指定文件夹下的所有文件&#xff0c;不包括指定文件夹内的文件夹&#xff1b;(2)、GetListFolders&#xff1a;遍历指定文件夹下的所有文件夹…

阿里、京东、快手、华为......他们是如何构建一个个推荐系统“帝国”的?

推荐系统在人们的日常生活中随处可见&#xff0c;成为我们生命中不可或缺的一部分。作为当今应用最为广泛和成熟的 AI 技术之一&#xff0c;它是信息生产者、传播者与用户之间的桥梁&#xff0c;可以让信息最精准、最高效地到达需求不一的用户面前。每天打开手机或电脑端的大部…

前端基础_ES6

声明 三大关键字声明变量&#xff1a;var &#xff08;ES5语法&#xff09; let &#xff08;ES6语法&#xff09;声明常量&#xff1a;const (ES6语法) var 声明变量特性1、支持 函数作用域2、支持 JS预解析 &#xff08;所谓变量提升&#xff09;3、支持 重复声明 &#xff…

5大典型模型测试单机训练速度超对标框架,飞桨如何做到?

导读&#xff1a;飞桨&#xff08;PaddlePaddle&#xff09;致力于让深度学习技术的创新与应用更简单。在单机训练速度方面&#xff0c;通过高并行、低开销的异步执行策略和高效率的核心算子&#xff0c;优化静态图训练性能&#xff0c;在Paddle Fluid v1.5.0的基准测试中&…

windowsXP用户被禁用导致不能网站登录

1、查看系统事件&#xff0c;发现弹出如下的错误 2、根据上面的错误&#xff0c;我们很容易就可以判断是禁用了账户引起的 2.1后面进入计算机管理&#xff0c;再进入用户管理 2.2双击点开Internet来宾用于&#xff0c;发现此用户已经停用了。 2.3双击点开与IIS访问有关用户&…

从头到尾使用Geth的说明-3-geth参数说明和环境配置

1.参数说明 ETHEREUM选项:--config value TOML 配置文件--datadir "/home/user4/.ethereum" 数据库和keystore密钥的数据目录--keystore keystore存放目录(默认在datadir内)--nousb …

OpenSSL中对称加密算法DES常用函数使用举例

主要包括3个文件&#xff1a; 1. cryptotest.h:#ifndef _CRYPTOTEST_H_ #define _CRYPTOTEST_H_#include <string>using namespace std;typedef enum {GENERAL 0,ECB,CBC,CFB,OFB,TRIPLE_ECB,TRIPLE_CBC }CRYPTO_MODE;string DES_Encrypt(const string cleartext, const…

从原理到落地,七大维度读懂协同过滤推荐算法

作者丨gongyouliu来源 | 大数据与人工智能导语&#xff1a;本文会从协同过滤思想简介、协同过滤算法原理介绍、离线协同过滤算法的工程实现、近实时协同过滤算法的工程实现、协同过滤算法应用场景、协同过滤算法的优缺点、协同过滤算法落地需要关注的几个问题等7个方面来讲述。…