GDB调试工具
Linux中包含一个很强大的调试工具GDB(GNU Debuger),可以用它来调试C和C++程序。
一. GDB的主要功能有:
设置断点,当程序运行到断点处暂停
显示变量的值,可以打印或者监视某个变量,将变量的值显示出来
单步执行,GDB允许用户单步执行程序,可以跟踪进入函数和从函数中退出
运行时修改变量的值,GDB允许在调试状态下修改变量的值,此功能在测试程序的时候特别有用
路径跟踪,GDB可以将代码的路径打印出来,方便用户跟踪代码
线程切换,在调试多线程的时候,此种功能是必须的
……
二. 使用GDB调试程序
要使用GDB调试程序,在编译程序的时候需要加入 "-g"选项,例如:
$gcc –g –o helloworld helloworld.c
1. gdb加载程序
命令格式:"gdb 要调试的文件全名"
$gdb helloworld
2. 设置程序的输入参数
命令格式:"set args 参数值1 参数值2 … "
通常可执行文件在运行时需要输入参数,可以用上面命令在GDB中向可执行文件输入参数。例如,下面的命令"set args 3"表示向加载的程序中输入的参数为3。
(gdb) set args 3
3. 打印代码内容
命令格式:"list 开始的行号"
命令list用于列出已加载程序的源代码。例如,"list 1"表示从第一行开始列出代码,每次按下Enter键后顺序向下列出代码。
(gdb) list 1
4. 设置断点
命令格式:"b 行号/函数名"
例如,在源程序的第10行设置一个断点:
(gdb) b 10
程序在断点处暂停后,按"c"键继续运行。
5.运行程序
命令格式:"run (后面可以加上传递给程序的参数)"
(gdb) run
6. 显示变量
命令格式:"display 变量"
程序运行到断点处暂停,此时可以使用display命令显示变量的值,以后每次停止都会显示此变量的值。例如,显示变量i的值:
(gdb) display i //每次停止时都会显示变量i的值
7. 修改变量的值
命令格式:"set 变量名=值"
例如,修改变量i的值为6:
(gdb) set i=6
8. 退出GDB
命令格式:"q"
(gdb) q
三. 常用命令详解
1. 执行程序
用GDB执行程序可以使用 gdb program 的方式,program是程序的程序名。假如在启动GDB的时候没有选择程序名称,可以在GDB启动后使用file program的方法启动:
(gdb) file test
2. 参数设置和显示
使用set args命令来设置发送给程序的参数;使用show args 命令显示其默认的参数:
(gdb) set args 1 2 3
(gdb) show args
Argument list to give program being debugged when it is started is "1 2 3".
3. 打印程序源代码
打印文件代码的命令时list,简写为l。
(gdb) list line1, line2
打印从line1到line2之间的代码,如果不输入参数,默认从当前行开始打印。
(gdb) l
1 #include
2 #include
3 #include
4 #include
5
6 int main(void)
7 {
8 struct stat st;
9
10 if(-1==stat("test.txt",&st))
(gdb)
11 {
12 printf("get file status failure\n");
13 return -1;
14 }
15 printf("此文件的大小:%d\n",st.st_size);
16 printf("此文件的租后修改时间:%d\n",st.st_mtime);
17 printf("此文件的节点:%d\n",st.st_ino);
18 printf("此文件的保护模式:%d\n",st.st_mode);
19 }
4. 打印数据
打印变量或者表达式的值可以使用print命令,简写为p。
(gdb) print 变量名(或表达式)
5. 断点
设置断点的命令时break,简写为b。有3种设置方式:
b 行号:程序停止在设定的行之前
b 函数名称:程序停止在设定的函数之前
b 行号或者函数 if条件:这是条件断点,如果条件为真,则程序在到达指定行或函数时停止。
(1)设置断点
如果程序由很多的文件构成,在设置断点时要指定文件名:
(gdb) b man.c 10
(gdb) b subfunction.c 20
要设置一个条件断点,可以利用b if 命令,在调试循环代码段时这样的设置比较有用,省略了大量的手动调试,例如,在一个循环函数中,在i=2时设置断点:
(gdb) b 46 if i==2
(2)显示当前GDB的断点信息
使用info break命令显示当前断点的信息
(gdb) info b
Num Type Disp Enb Address What
1 breakpoint keep y 0x080484b1 in main at filestat.c:15
breakpoint already hit 1 time
(3)删除指定的断点
删除断点使用 delete b 断点编号 命令。下面的命令会删除第8个断点:
(gdb) delete b 8
(4)禁止断点
禁止断点使用 disable b 断点编号 命令。下面的命令会禁用第9个断点:
(gdb) disable b 9
(5)允许断点
允许断点使用 enable b 断点编号 命令。下面的命令会禁用第9个断点:
(gdb) enable b 9
(6)清除断点
一次性的清除某行处的所有断点使用命令 clean 行号。下面的命令会清除在源代码中第32行的所设置的断点:
(gdb) clean 32
6. 变量类型检测
在调试过程中有需要查看变量类型的情况,需要使用命令whatis 和ptype等。
whatis 变量名 :查看变量的类型,只能查看变量的类型名称,不能得到类型的详细信息。
(gdb) whatis st
type = struct stat
ptype 变量名:查看变量类型的详细信息。
(gdb) ptype st
type = struct stat {
__dev_t st_dev;
short unsigned int __pad1;
__ino_t st_ino;
__mode_t st_mode;
__nlink_t st_nlink;
__uid_t st_uid;
__gid_t st_gid;
__dev_t st_rdev;
short unsigned int __pad2;
__off_t st_size;
__blksize_t st_blksize;
__blkcnt_t st_blocks;
struct timespec st_atim;
struct timespec st_mtim;
struct timespec st_ctim;
long unsigned int __unused4;
long unsigned int __unused5;
}
7. 单步调试
单步跟踪:next 简写为n
进入函数体:step 简写为 s
退出已进入的函数:finish
(gdb) n
(gdb) s
(gdb) finish
8. 设置监测点
display命令可以设置监测变量的值,当遇到断点时,会显示监测变量的值。
(gdb) display i
i=1
9. 调用路径
backtrace命令可以打印函数的调用路径,提供前向跟踪功能,此命令对跟踪函数很有用处。Backtrace打印一个顺序列表,函数从最近到最远的调用过程,包含调用函数和其中的参数。简写为bt。
10. 信息info
Info命令可获得当前命令的信息,例如获得断点的情况,参数的设置情况等。
例如:
(gdb) info frame //查看栈信息
Stack level 0, frame at 0xbffff760:
eip = 0x80484c5 in main (filestat.c:16); saved eip 0xb7e88e46
source language c.
Arglist at 0xbffff758, args:
Locals at 0xbffff758, Previous frame's sp is 0xbffff760
Saved registers:
ebp at 0xbffff758, eip at 0xbffff75c
(gdb) info locals //查看所有局部变量
11. 多线程
多线程是现代程序中经常采用的编程方法,而多线程由于执行过程中的调度随机性,不好调试。多线程调试主要有两点:先获得线程的ID好,然后转到该线程进行调试。
Info thread 命令列出当前进程中的线程号,其中最前面的为调试用的ID。
thread id 命令进入需要调试的线程。
(gdb) info thread
Id Target Id Frame
* 1 process 7854 "filestat" main () at filestat.c:15
12. 反汇编
Disassamble命令打印指定处的汇编代码,例如printf的汇编代码如下:
(gdb) disassemble printf
Dump of assembler code for function printf:
0xb7ebbc80 : push %ebp
0xb7ebbc81 : mov %esp,%ebp
0xb7ebbc83 : push %ebx
0xb7ebbc84 : call 0xb7f85bc6
0xb7ebbc89 : add $0x11a36b,%ebx
0xb7ebbc8f : sub $0xc,%esp
0xb7ebbc92 : lea 0xc(%ebp),%eax
0xb7ebbc95 : mov %eax,0x8(%esp)
0xb7ebbc99 : mov 0x8(%ebp),%eax
0xb7ebbc9c : mov %eax,0x4(%esp)
0xb7ebbca0 : mov -0x7c(%ebx),%eax
0xb7ebbca6 : mov (%eax),%eax
0xb7ebbca8 : mov %eax,(%esp)
0xb7ebbcab : call 0xb7eb17e0
0xb7ebbcb0 : add $0xc,%esp
0xb7ebbcb3 : pop %ebx
0xb7ebbcb4 : pop %ebp
0xb7ebbcb5 : ret
End of assembler dump.
13. help帮助信息
用法类似于man。例如想查看命令c的信息:
(gdb) help c
Continue program being debugged, after signal or breakpoint.
If proceeding from breakpoint, a number N may be used as an argument,
which means to set the ignore count of that breakpoint to N - 1 (so that
the breakpoint won't break until the Nth time it is reached).
If non-stop mode is enabled, continue only the current thread,
otherwise all the threads in the program are continued. To
continue all stopped threads in non-stop mode, use the -a option.
Specifying -a and an ignore count simultaneously is an error.
Linux环境下的GCC编译器与GDB调试工具介绍
假如现在我们有如下代码需要编译运行和调试.文件名为:test.c #include int main() { int day, month, year, sum, le ...
使用 Strace 和 GDB 调试工具的乐趣
编写 UNIX® 系统程序充满乐趣,并且具有教育意义.使用 UNIX strace 工具和 GDB(GNU 项目调试工具),您可以真正地深入研究系统的功能,并了解组成这些功能的各种各样的程序.同时使用 ...
GDB调试工具总结
程序调试的基本思想是“分析现象->假设错误原因->产生新的现象去验证假设”这样一个循环过程,根据现象如何假设错误原因,以及如何设计新的现象去验证假设,需要非常严密的分析和思考.程序中除了一 ...
Linux GDB常用命令一栏
Linux GDB 常用命令如下: 1.启动和退出gdb (1)启动:gdb ***:显示一段版权说明: (*** 表示可执行程序名) (2)退出:quit.有的时候输入quit后会出现相关提示:类似 ...
gdb调试工具使用方法分享
刚才看了一个CSDN上分享gdb调试工具使用的教程,讲得非常好,推荐到这里: http://blog.csdn.net/liigo/article/details/582231
linux gdb
linux gdb linux 测试代码 #include #include static char buf[255]; static ...
Gdb调试工具/ Makfile项目管理
gdb调试工具 gcc -g main.c -o main 常用命令 命令 简写 作用 help h 按模块列 ...
GDB调试工具、动态加载、内存管理(day04)
一.程序中的错误处理 在系统中定义了一个全局变量errno.在这个全局变量中存放着系统调用或者库函数出错的信息(错误编号).然后根据错误编号获取错误信息. 举例说明: 打开一个文件,如果这个文件不存在 ...
Linux GDB程序调试工具使用简单介绍
GDB概述 GDB是GNU开源组织公布的一个强大的UNIX下的程序调试工具.也许,各位比較喜欢那种图形界面方式的,像VC.BCB等IDE的调试,但假设你是在UNIX平台下做软件,你会发现GDB这个调试 ...
随机推荐
DNS查询指令host
描述: Host指令提供一个简单的DNS解析的功能.正常地使用名称到IP的解析,当指令没有任何参数和选项的时候,它将输出简单的带命令行参数和选项的概要. 名称是可以被解析的域名,也可以是点分十进制的I ...
listview使用总结
1. android给listview的item设定高度 原文网址:http://blog.csdn.net/l_serein/article/details/7403992 在item的layout ...
[C#]6.0新特性浅谈
原文:[C#]6.0新特性浅谈 C#6.0出来也有很长一段时间了,虽然新的特性和语法趋于稳定,但是对于大多数程序猿来说,想在工作中用上C#6.0估计还得等上不短的一段时间.所以现在再来聊一聊新版本带来 ...
iOS中UITextField 使用全面解析
//初始化textfield并设置位置及大小 UITextField *text = [[UITextField alloc]initWithFrame:CGRectMake(20, 20, 13 ...
JavaScript基础知识(数据类型及转换、运算符)
9.数据类型 概念:表示当前存储的数据的分类(表示数字 - 整数和小数) u 原始类型(原始值) -----[typeof运算符:判断变量的原始类型] *number(数字):表示数字 ...
jquery 第四章
1.回顾 节点.append(内容) 节点.prepend(内容) 节点.remove() 节点.attr("属性","值") 节点.css("样式& ...
shell练习题5
需求如下: 用shell实现,把一个文件文档中只有一个数字的行给打印出来.(以/password文件为例,自行修改) 参考解答如下 方法1 #!/bin/bash file_name=passwd n ...
Intellij实用技巧
快捷键 Tradition 快捷键 介绍 Ctrl + Z 撤销 Ctrl + Shift + Z 取消撤销 Ctrl + X 剪切 Ctrl + C 复制 Ctrl + S 保存 Tab 缩进 Sh ...
vue入门全局配置
全局配置 Vue.config 是一个对象,包含 Vue 的全局配置.可以在启动应用之前修改下列属性: silent 类型:boolean 默认值:false 用法: Vue.config.silen ...
基于Apache Curator框架的ZooKeeper使用详解
一 简介 Apache Curator是一个比较完善的ZooKeeper客户端框架,通过封装的一套高级API 简化了ZooKeeper的操作.通过查看官方文档,可以发现Curator主要解决了三类问题 ...