gdb,程序调试助手
启动GDB:(其中我的app是编译之后的可执行文件)

退出命令:quit或者简写q
帮助获取:
gdb通过完备的在线帮助,使我们使用起来更加方便.所有的帮助信息都是通过help命令获得的,运行help命令时,如果不指定参数,gdb将输出分类信息:

可以通过分类名作为help指定的参数来获得帮助,以断点(breakpoint)为例:

在gdb调试中,有几个注意点可以提高调试效率,第一,如果输入的命令开头字母能唯一标识这个命令,则后面的命令可以不用输入,例如退出命令quit,只输入q就已经是唯一标识的命令了,其他命令没有q开头的,故,我们可以直接输入q,然后回车就可以达到输入quit的作用,第二,gdb中也可以师徒TAB补全指令,第三,对于大多数的命令都可以 以直接按回车(Enter)的方式运行前面执行过的命令.
现在我们调试一个简单的程序,运用断点:
#include<stdio.h>
int main(void)
{
for(int i=;i<;i++)
{
printf("i=%d\n",i);
printf("GDB test\n");
}
return ;
}
这里需要解释几个命令:
设置断点,break命令;
我们把断点设置在main函数的第4行:

main.c:4表示main函数的第四行,这样写是有意义的而且是推荐的做法,在多文件中操作时更清晰.
断点(BreakPoint)
- 设置断点:(threadno 指定了线程的 ID,注意,这个 ID 是 gdb 分配的,可以通过 "info threads" 命令来查看正在运行程序中的线程信息)
- break thread <threadno> -- break命令没有参数时,表示在下一条指令处停住.
 - break +offset thread <threadno> -- 在当前行号的后面的 offset 行停住.(offiset 为自然数)
 - break -offset thread <threadno> -- 在当前行号的前面的 offset 行停住.(offiset 为自然数)
 - break <linenum> thread <threadno> -- 在指定行号停住.
 - break filename:linenum thread <threadno> -- 在源文件filename的linenum行处停住.
 - break <function> thread <threadno> -- 在进入指定函数时停住.
 - break filename:function thread <threadno> --在源文件filename的function函数的入口处停住.
 - break *address -- 在程序运行的内存地址处停住.
 - break ... thread <threadno> if <condition> -- ...可以是上述的参数,condition表示条件,在条件成立时停住.比如在循环境体中,可以设置break if i=100,表示当i为100时停住程序.
 - tbreak -- 设置只停止一次的断点.用法和 break 类似
 
 - 查看断点
- info breakpoints [n]
 - info break [n]
 
 
观察点(WatchPoint) -- 观察点一般来观察某个表达式(变量也是一种表达式)的值是否有变化了,如果有变化,马上停住程序.
- 设在观察点
- watch <expr> -- 为表达式(变量)expr设置一个观察点.一量表达式值有变化时,马上停住程序.
 - rwatch <expr> -- 当表达式(变量)expr被读时,停住程序.
 - awatch <expr> -- 当表达式(变量)的值被读或被写时,停住程序.
 
 - 查看观察点
- info watchpoints -- 列出当前所设置了的所有观察点
 
 

这样,我们使用最基本的调试方法,实现断点和查看变量的值,其中next命令(简写n)是单挑语句执行,下一步的的意思.
维护停止点
- 清除停止点
 
clear -- 所有的已定义的停止点.
clear <function> -- 清除所有设置在函数上的停止点.
clear <filename:function> -- 清除所有设置在函数上的停止点.
clear <linenum> -- 清除所有设置在指定行上的停止点.
clear <filename:linenum> -- 清除所有设置在指定行上的停止点.
- 删除停止点
 
delete [range] -- 删除停止点.其简写命令为 d.
- 禁用停止点
 
disable [range] -- 禁用停止点
- 启用停止点
 
enable [range] -- 启用停止点.
enable once [rang] -- 启用停止点一次,当程序停止后,该停止点马上被 gdb 自动 disable.
enable count [rang] -- 启用停止点 count 次,当程序停止后,该停止点马上被 gdb 自动 disable.
enable delete [rang] -- 启用停止点一次,当程序停止后,该停止点马上被 gdb 自动删除.
- 停止条件维护 -- 以用 condition 命令来修改断点的条件.(只有break和watch命令支持if,catch目前暂不支持if)
 
condition <bnum> <expression> -- 修改断点号为bnum的停止条件为expression.
condition <bnum> -- 清除断点号为bnum的停止条件.
- 忽略停止点 N 次
 
ignore <bnum> <count> -- 表示忽略断点号为 bnum 的停止条件 count 次.
- 为停止点设定运行命令
- 格式:
commands [bnum]
... command-list ...
// 为断点号 bnumi写一个命令列表.当程序被该断点停住时,gdb 依次运行命令列表中的命令.
end - 例如:
break foo if x>0
commands
printf "x is %d/n",x
continue
end 
 - 格式:
 
恢复执行
continue [ignore-count] -- ignore-count 表示忽略其后的断点次数.恢复程序运行,直到程序结束,或是下一个断点到来.缩写 c
fg [ignore-count] -- ignore-count 表示忽略其后的断点次数.恢复程序运行,直到程序结束,或是下一个断点到来.缩写 c
单步调试
step <count> -- 单步跟踪,如果有函数调用,它会进入该函数.count 表示执行后面 count 条语句,不加则默认为 1.
next <count> -- 同样单步跟踪,如果有函数调用,他不会进入该函数.count 表示执行后面 count 条语句,不加则默认为 1
查看运行时数据
- print /<f> <expr> -- 查看当前程序的运行数据.简写 p.printf "fmt",arg,... -- 打印格式化字符灿 fmt.
- <expr> 是表达式
- @ -- 是一个和数组有关的操作符,在后面会有更详细的说明.在 @ 左边是数组的地址,右边是数组的长度,eg: array@len
 - :: -- 指定一个在文件或是一个函数中的变量.
 - {<type>} <addr> --表示一个指向内存地址<addr>的类型为type的一个对象.
 
 - <f>是输出的格式
- d -- 按十进制格式显示变量.
 - u -- 按十六进制格式显示无符号整型.
 - o -- 按八进制格式显示变量.
 - t -- 按二进制格式显示变量.
 - a -- 按十六进制格式显示变量.
 - c -- 按字符格式显示变量.
 - f -- 按浮点数格式显示变量.
 
 
 - <expr> 是表达式
 - 注意:
- 1.若出现变量重名,局部变量会隐藏全局变量.若想查看全局变量的值时,可以使用“::”操作符.
 - 2.可以通过这种形式指定你所想查看的变量 eg:
*'filename'::variable
*function::variable 
 - printf "fmt",arg,... -- 打印格式化字符灿 fmt.
 
查看内存
- examine/<n/f/u> <addr> -- 来查看内存地址中的值.简写 x
- <n/f/u><addr> 表示一个内存地址.
- n 是一个正整数,表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容.
 - f 表示显示的格式
- s -- 按字符串格式显示内存地址内容.
 - i -- 查看内存地址的机器指令内容
 - x -- 按十六进制格式显示地址内容.
 - d -- 按十进制格式显示地址内容.
 - u -- 按十六进制格式显示无符号整型.
 - o -- 按八进制格式显示地址内容.
 - t -- 按二进制格式显示地址内容.
 - a -- 按十六进制格式显示地址内容.
 - c -- 按字符格式显示地址内容.
 - f -- 按浮点数格式显示地址内容.
 
 - u 表示从当前地址往后请求的字节数,如果不指定的话,gdb默认是 4 个 bytes.
- b -- 表示单字节
 - h -- 表示双字节
 - w -- 表示四字节
 - g -- 表示八字节
 
 
 - <addr> 表示一个内存地址.
 
 - <n/f/u><addr> 表示一个内存地址.
 
更多请参考:http://www.cnblogs.com/kzloser/archive/2012/09/21/2697185.html
默认的list只是列出了10行,采用show listsize可以查看当前的显示代码行数,用set listsize count设置list命令显示的源代码数量最多为count行,0表示不限制行数。


step单步的时候,会进入函数,next单步的时候,不会进入函数.

单步调试的时候,显示在最前面的那个数字,代表的是这句话在源文件中的行号.
gdb,程序调试助手的更多相关文章
- 1、GDB程序调试
		
GDB是GNU开源组织发布的一个强大的Linux下的程序调试工具.一般来说GDB主要完成下面四个部分的功能. 1)启动你的程序,可以按照你的自定义的要求运行程序. 2)可让被调试程序在你所指定的调试的 ...
 - Linux gcc和gdb程序调试用法 {转}
		
gcc一般调试格式: gcc -Wall -o test test.c // -wall 显示程序错误详细信息 gcc -v // 显示gcc的版本 gcc -o{1,2,3} t ...
 - 1-2 编程基础 GDB程序调试
		
简介 GDB是GNU发布的一款功能强大的程序调试工具.GDB主要完成下面三个方面的功能: 1.启动被调试程序 2.让被调试的程序在指定的位置停住. 3.当程序被停住时,可以检查程序状态(如变量值). ...
 - GDB 程序调试简单实践
		
用了好久的GCC/G++ 却一直都没用过GDB调试过程序,有时程序不是非常大,一般有错,直接看编译器编译结果就几乎相同知道错在哪儿了,或者使用codeblocks单步调试,甚至回到windows以下调 ...
 - 【Linux】GDB程序调试
		
一.GDB简介 GDB是GNU发布的一款功能强大的程序调试工具.GDB主要完成下面三个方面的功能: 启动被调试程序. 让被调试的程序在指定的位置停住. 当程序被停住时,可以检查程序状态(如变量值) 二 ...
 - GDB程序调试
		
GDB使用流程 1.编译生成可执行文件: gcc -g tst.c -o tst2.启动GDB gdb tst3. 在main 函数处设置断点 break main4. 运行程序 run GDB 命令 ...
 - ARM平台如何玩转GDB远程调试?
		
前 言 关于GDB工具 GDB工具是GNU项目调试器,基于命令行使用.和其他的调试器一样,可使用GDB工具单步运行程序.单步执行.跳入/跳出函数.设置断点.查看变量等等,它是UNIX/LINUX操作 ...
 - 程序调试手段之gdb, vxworks shell
		
调试一个程序主要用到的功能: 启动程序 设置函数断点 设置数据断点 单步执行 查看内存值 修改内存值 linux下的gdb,和vxworks下的shell 虽然使用方式和调试命令略有不同,但是都能满足 ...
 - GDB+GDBServer调试Linux应用程序
		
参考:http://blog.csdn.net/shanghaiqianlun/article/details/7820401 一.gdb+gdbserver总体介绍 远程调试环境由宿主机GDB和目标 ...
 
随机推荐
- Serlvet Response 输出1x1 图片
			
import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.IOException; import ja ...
 - 设置 IE 默认模式为 IE8
			
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8" />
 - Git使用sublime_text作用默认编辑器
			
Git使用的是Vim来作用默认的编辑器,但一直都用不好这个编辑器,所以打算把他换成sublime_text 使用windows默认的记事本 git config --global core.edito ...
 - 浅析ActiveReport中数据下拉列表的交互性
			
虽说做Cognos已经很久了,Cognos的active report还很少开发过,于是便做了一些小的尝试,下面就以具体实例来分析一下在report studio的活动报表中数据下拉列表和列表报表以及 ...
 - 【php】Apache无法自己主动跳转却显示文件夹与php无法连接mysql数据库的解决方式
			
一.Apache无法自己主动跳转却显示文件夹 Apache无法自己主动跳转却显示文件夹这是由于Apacheserver下conf/httpd.conf没有配置好,其默认是不跳转,直接显示文件夹 首先, ...
 - ibatis自定义数据类型在不支持中文的数据库存储汉字
			
道理很简单,把gbk的汉字转换成iso编码存进数据库就可以了,读出来的时候把iso转换成gbk还原出原始的汉字. ibatis可以自定义类型处理器,在这里面做编码转换再适合不过了! sqlmap-co ...
 - AVAudioPlayer播放在线音频文件
			
AVAudioPlayer播放在线音频文件 一:原里: AVAudioPlayer是不支持播放在线音频的,但是AVAudioPlayer有一个 initWithData的方法:我们可以把在线音频转换为 ...
 - shell学习三十二天----read读取一行
			
标准输入输出与标准错误输出 标准输入/输出可能是软件工具设计原则里最主要的观念了.他的构想是:程序应有一个数据来源,数据出口(数据要去哪里),以及报告问题的地方.他们分别叫做标准输入,标准输出和标准错 ...
 - 基于Django的在线考试系统
			
概述 基于Django的在线考试系统,适配电脑端,可以实现出题,答题,排行榜,倒计时等等等功能 详细 代码下载:http://www.demodashi.com/demo/13923.html 项目目 ...
 - Jenkins部署java项目实例02
			
源码管理 选择 “git”, Repository URL填写你的git地址,并配置对应的key,大家最好事前先在jenkins这台机器上能够直接远程git操作私有仓库 构建触发器.构建环境.Pre ...