3、利用GDB进行程序调试
本文将用一个实际例子讲解如何通过GDB进行程序调试。
首先,我们需要理解的是GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具,其产生和调试的目的是让调试者知道,程序在执行时内部发生了什么,或者运行过程中在做什么,一般来说,GDB主要帮助实现以下四个方面的功能。
1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)
3、当程序被停住时,可以检查此时你的程序中所发生的事。
4、动态的改变你程序的执行环境。
在命令行上输入gdb即可启动GDB,一旦启动完毕,就可以接受用户从键盘输入的命令并完成相应的任务。若想退出GDB,只需在工作环境中输入命令quit即可。
下面给出一个调试程序mian.c
#include <stdio.h>
int func(int n)
{
int sum=,i;
for(i=; i<n; i++)
{
sum+=i;
}
return sum;
}
main()
{
int i;
long result = ;
for(i=; i<=; i++)
{
result += i;
}
printf("result[1-100] = %d /n", result );
printf("result[1-250] = %d /n", func() );
}
使用指令
gcc -g main.c -o main
进行编译后,通过
gdb -tui main
再输入return,就使用”-tui“选项可以将代码显示在一个漂亮的交互式窗口内(所以被称为“文本用户界面 TUI”),在这个窗口内可以使用光标来操控,同时在下面的GDB shell中输入命令。

使用gdb调试命令添加断点,并查看断点信息如下:

运行程序可以看到程序在断点后停止:

继续运行及相关变量的查看

继续运行及删除断点操作

查看程序堆栈,运行出当前函数及退出gdb调试

通过上面比较直观的操作,可以对gdb的操作有了一个大体上的理解了。
命令gdb的使用语法如下所示:
gdb 选项 可执行程序 core文件|进程ID
命令gdb的参数一般为待调试运行的程序,也可以为程序运行错误时产生的core文件,或者正在运行的进程ID.
GDB常用的选项如下:
-c core 使用指定的core文件检查程序。
-h 给出帮助选项的简单说明
-n 忽略./gdbinit文件中指定的命令
-q 不显示版权等信息。
-s 使用保存在指定文件中的符号表。
GDB的所有命令
GDB的所有命令可以查看http://users.ece.utexas.edu/~adnan/gdb-refcard.pdf,但是我们通常用不到这么多调试命令,这里将一些程序调试时常用的命令列出如下:
list 查看程序
1、break 行号 在指定行添加断点。
2、break 文件名 行号 在指定的文件的指定行添加断点。
3、break 行号 if 条件 当条件为真时,指定行号处的断点生效。
例如:
b if i =10 //当i=10时第5行断点生效
4、set var 变量 =新变量 给某个变量赋值
5、info break 查看所有设置的断点
6、delete 断点编号 删除断点
7、run 开始运行程序
8、next 单步运行(不进入子函数)
9、step 单步运行(进入子函数)
10、 continue 继续运行程序
11、print(p) p为变量名,查看指定变量名的值
12、finish 运行程序,直到当前函数结束
13、watch 变量名 对指定变量名进行监控
14、quit 退出GDB
15、bt 显示所有的调试栈帧,该命令可以用来显示函数的调用顺序
16、clear 删除设置在特定文件、特定行上的断点
17、display EXPR 每次程序停止后显示表达式的值
18、file FILE 装在制定的可执行文件中进行调试
19、help name 显示指定命令的帮助信息
20、info func 显示所有函数的名称
21、info local 显示函数中的局部变量信息
22、info prog 显示被调试程序的执行状态
23、info var显示所有的全局和静态变量名称
24、kill 终止正在调试的程序
25、make 在不退出GDB的情况下,运行make工具。
26、print EXPR 显示表达式EXPR的值。
参考链接
https://baike.baidu.com/item/gdb/10869514?fr=aladdinGDB的百度百科
https://linux.cn/article-4302-1.html使用GDB进行调试的一个实例
http://blog.csdn.net/yyaong_520/article/details/6766831GDB调试命令详解
3、利用GDB进行程序调试的更多相关文章
- 利用GDB进行多线程调试
一.多线程调试 多线程调试重要就是下面几个命令: info thread 查看当前进程的线程. thread <ID> 切换调试的线程为指定ID的线程. break file.c:100 ...
- 利用GDB对程序进行调试
第一章初涉调试会话 调试工具 GDB,Unix下最常用的调试工具 DDD,基于GUI的调试器,大多数工具都是GDB的GUI前端. Eclipse,IDE也是一种调试工具 atoi( )把字符串变为整数 ...
- C/C++程序调试和内存检测
程序出现错误很正常,一个优秀的程序员必须学会调试,发现错误并改正.减少程序错误最有效的方法是:在敲代码之前,多花点时间思考,如何构造程序,数据结构和算法,尽量把细节提前写下来,可以尝试着在纸上写出核心 ...
- Linux上程序调试的基石(2)--GDB
3. GDB的实现 GDB是GNU发布的一个强大的程序调试工具,用以调试C/C++程序.可以使程序员在程序运行的时候观察程序在内存/寄存器中的使用情况.它的实现也是基于ptrace系统调用来完成的. ...
- GDB 程序调试简单实践
用了好久的GCC/G++ 却一直都没用过GDB调试过程序,有时程序不是非常大,一般有错,直接看编译器编译结果就几乎相同知道错在哪儿了,或者使用codeblocks单步调试,甚至回到windows以下调 ...
- 20145311利用gdb调试汇编代码
利用GDB调试汇编代码 首先编写c语言原代码,我使用的是同学分析过的代码 #include<stdio.h>short addend1 = 1;static int addend2 = 2 ...
- 程序调试手段之gdb, vxworks shell
调试一个程序主要用到的功能: 启动程序 设置函数断点 设置数据断点 单步执行 查看内存值 修改内存值 linux下的gdb,和vxworks下的shell 虽然使用方式和调试命令略有不同,但是都能满足 ...
- 利用GDB在远程开发机进行调试
由于一些环境的制约,很多同学都可能需要在开发机上进行调试,但由于开发机资源的限制,在开发机上直接进行本地的GDB环境配置就成了难题,这个时候其实我们可以利用GDB中自带的gdbserver工具就可以进 ...
- Linux gcc和gdb程序调试用法 {转}
gcc一般调试格式: gcc -Wall -o test test.c // -wall 显示程序错误详细信息 gcc -v // 显示gcc的版本 gcc -o{1,2,3} t ...
随机推荐
- document.write : 什么是在html输出中使用,什么是文档加载后使用?
理解:您只能在 HTML 输出中使用 document.write.如果您在文档加载后使用该方法,会覆盖整个文档. Javascript中只能在 HTML 输出流中使用 document.write, ...
- 安全概念:DMZ(非军事化区,隔离区)
DMZ是英文“demilitarized zone”的缩写,中文名称为“隔离区”,也称“非军事化区”.它是为了解决安装防火墙后外部网络不能访问内部网络服务器的问题,而设立的一个非安全系统与安全系统之间 ...
- JS部分
前端三剑客(HTML,CSS,JavaScript) Html:负责一个页面的结构 Css:负责一个页面的样式 JavaScript:负责与用户进行交互 JS概念 JS是JavaScript的简称,是 ...
- HapMap
HapMap五周年回顾 2011-01-12 | 作者: [关闭] 作者简介:曾长青,中国科学院北京基因组所研究员,博士生导师.CUSBEA奖学金.百人计划.杰出青年基金.首批新世纪百千万人才工程国家 ...
- 在iOS 8及以后使用UIAlertController 等各种弹出警告通知
原文转自:在iOS 8中使用UIAlertController 感谢作者分享,自我学习之用 iOS 8的新特性之一就是让接口更有适应性.更灵活,因此许多视图控制器的实现方式发生了巨大的变化.全新的UI ...
- 201621123008 《Java程序设计》第12周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 面向系统综合设计-图书馆管理系统或购物车 使用流与文件改造你的图书馆管理系统或购物车. 2.1 简述如何 ...
- NC 6系初始化EJB
6系开发时,调用远程接口去操作数据时,需先调用EJB. InvocationInfoProxy.getInstance().setUserDataSource(design); InvocationI ...
- PHP 获取当前所在的类名、方法名等
PHP获取当前类名.方法名 __CLASS__ 获取当前类名 __FUNCTION__ 当前函数名(confirm) __METHOD__ 当前方法名 (bankcard::confirm) _ ...
- read temperature
button1, button2, richtexbox1, serialport1, using System;using System.Collections.Generic;using Syst ...
- [Python]Python章1 Python中_的故事
_xx 单下划线开头 Python中没有真正的私有属性或方法,可以在你想声明为私有的方法和属性前加上单下划线,以提示该属性和方法不应在外部调用.如果真的调用了也不会出错,但不符合规范. 本文为译文,版 ...