GDB调试器
/*this project used for gdb debug c programs*/
/*At first,using compile command turn out the executable file. exp: gcc -g sourcefile.c -o test.exe */ //!!!
/*windows: start gdb debuging(test.exe complete trace) : gdb test.exe */
/*Linux: start gdb debuging(current trace) : gdb ./test */ //!!!
/*
int strcmp(const char *s1,const char *s2);
char *fgets(char *buf,int n,FILE *fp); //send data read from file stream to buffer.
FILE *fp = fopen(argv[1],"r");
*/
/*
补充:
对含有命令行参数的程序的调试
(gdb) r arg1 arg2 arg3 …
使可执行程序最大限度的保留调试信息:
gcc -ggdb3 -o <test> <test.c>
-Wall
-gstabs 关闭编译优化
gdb帮助:
(gdb) h
(gdb) help all
(gdb) help <command class>
(gdb) help <command>
(gdb) apropos <word> 搜索相关word的命令
编译时注意加上-g,在可执行文件中加入源文件信息(提供我们以后对程序进行调试的信息) !!!
-o,要求输出可执行文件文件
-c,表示我们只要求编译器输出目标代码,而不必输出可执行文件
调试过程
1.设置断点 (gdb) b 行号 //可以设置多个断点
(gdb) b(reak) <funcname>
查看断点 (gdb) info b
禁用断点 (gdb) disable b 断点号
再次激活断点 (gdb) enable breakpoints 断点号
删除断点 (gdb) delete breakpoints 断点号
清除断点 (gdb) clear 断点所在行号
设置条件断点 (gdb) condition 1 <svalues[counter]->chechsum>700>
临时断点 (gdb) tbreak <41>
2.使用gdb单步调试程序
(gdb) r //在断点处停下
(gdb) n //单步运行,不进入函数内部
(gdb) s(tep) //一次一行
(gdb) c //停止单步调试,继续执行直至断点或者输入
(gdb) cont <n> //执行n次continue
(gdb) finish //退出函数
3.跟踪程序变量
(gdb) p buffer //打印buffer的值
(gdb) p strlen(buffer)-1
(gdb) p $ (n) //打印当前序号(或序号n)的前一序号变量的值
(gdb) p $$ (n) //打印序号n-2的变量的值
使用print给变量赋值
(gdb) p 变量=表达式
打印内存某个部分开始的一块连续空间的内容
(gdb) p 开始表达式@要打印的空间大小 例:(gdb) p *array@len
显示各种变量的值以及内存地址
(gdb) p pStr[0]
(gdb) p *(pStr[0]+1)
(gdb) p &pStr[0]
printf查看变量
(gdb) printf "%2.2s\n",(char*)<addr>
set修改变量的值
(gdb) set variable svalues[0]->checksum=2000
4.自动显示指定变量的值
(gdb) display pStr_index
(gdb) display/<fmt> <expr>
(gdb) display/<fmt> <addr>
(gdb) info display
(gdb) disable d 2
(gdb) enable display 2
(gdb) delete diaplay 2
5。查看函数堆栈 //程序调用一个函数时,函数的地址/参数/局部变量都会被压入栈中
(gdb) bt (backtrace) //打印当前的函数调用栈的所有信息
(gdb) bt <n> //打印前n层的栈顶信息
(gdb) bt <-n> //打印栈底的前n层信息
(gdb) f(rame) <n> //查看栈上某层信息(栈的层编号,当前函数名,函数参数值,函数所在文件及行号) frame 0 栈顶
(gdb) up <n>
(gdb) down <n>
(gdb) select-frame <n> //对应frame,但是不输出栈层信息
(gdb) up-silently <n>
(gdb) down-silently <n>
(gdb) info f(rame) //显示更为详细的当前栈层的信息
(gdb) info args //显示当前函数的参数名及值
(gdb) info locals //显示当前函数中所有局部变量及值
(gdb) info catch //显示当前函数中的异常处理信息
6. (gdb) make
(gdb) shell
(gdb) q //退出gdb调试
7.代码显示
(gdb) where //查找错误位置
(gdb) l(ist) <n> //查看当前行后面的代码<显示第n行附近的代码>
(gdb) l(ist) - //查看当前行前面的代码
(gdb) l <function> //显示函数的源程序
(gdb) l test.c:9 //查看test.c第九行代码
(gdb) set listsize <count> //设置显示行数
(gdb) show listsize //查看当前设置的显示的行数
(gdb) l <first> <last> //显示从first行到last行的源代码
(gdb) l , <last> //显示从当前行到last行的源代码
(gdb) l + //向后显示代码
(gdb) forward-search <regexp> //向前搜索,regexp是正则表达式
(gdb) reverse-search <regexp> //全部搜索
8.查看内存命令(x命令)
(gdb) x/<n/f/u> <addr> //n、f、u是可选的参数 详见:(gdb) help x
u 表示从当前地址往后请求的字节数,如果不指定的话,GDB默认是4个bytes。u参数可以用下面的字符来代替,b表示单字节,h表示双字节,w表示四字 节,g表示八字节。当我们指定了字节长度后,GDB会从指内存定的内存地址开始,读写指定字节,并把其当作一个值取出来。
f 表示显示的格式,参见下面。如果地址所指的是字符串,那么格式可以是s,如果地十是指令地址,那么格式可以是i。
n 是一个正整数,表示需要显示的内存单元的个数,也就是说从当前地址向后显示几个内存单元的内容,一个内存单元的大小由后面的u定义。
例:命令:x/3uh 0x54320 表示,从内存地址0x54320读取内容,h表示以双字节为一个单位,3表示输出三个单位,u表示按十六进制显示。
9.使用观察窗口
(gdb) watch <counter>15> //满足条件后程序运行终止
10.指定源文件的路径
dir <dirname> //多个路径使用:(UNIX ) ;(WINDOW)
directory //清除所有的自定义的源文件搜索路径信息
show directory //显示定义了的源文件搜索路径
11.查看运行时数据
(gdb) print <expr>
(gdb) print /<f> <expr> // <f> 输出格式 <expr> 表达式
x @ //与数组有关
d :: //指定一个在文件或一个函数中的变量
u {<type>} <addr> //表示一个指向内存地址<addr>的类型为type的一个对象
o
t
a
c
f
(gdb) print file::variable //查看文件中的全局变量
(gdb) print function::variable //查看函数中的局部变量 例: (gdb) p 'f2.c'::x
12.设置显示选项
(gdb) set print address
(gdb) set print address on //打开函数地址参数显示
(gdb) f //显示栈信息
(gdb) set print address off //关闭函数地址参数显示
(gdb) show print address
(gdb) set print array
(gdb) set print array on //打开数组显示
(gdb) show print array
(gdb) set print elements <num-of-elements> //对大数组,显示部分长度
(gdb) show print elements //查看print elements的选项信息
(gdb) set print null-stop <on/off> //当显示字符串时,遇到结束符则停止显示。选项默认为off.
(gdb) set print pretty on //结构体完美显示
(gdb) set print pretty off
(gdb) show print pretty //查看gdb如何显示结构体
(gdb) set print sevenbit-strings <on/off> //设置字符显示是否按照\nnn的格式显示
(gdb) show print sevenbit-strings //查看字符显示开关是否打开
(gdb) set print union <on/off> //设置显示结构体时,是否显示内部的联合体结构
(gdb) show print union
(gdb) set print object <on/off> //当一个对象指针指向其派生类时,如果打开这个选项,gdb自动按照虚方法调用的规则显示输出,关闭后,gdb就不管虚函数表了。默认为off
(gdb) show print object
(gdb) set print static-members <on/off> //显示C++对象的静态数据成员。默认是on
(gdb) show print static-members
(gdb) set print ytbl <on/off> //使用规整的格式显示虚拟函数表。默认是关闭的
(gdb) show print vtbl //查看虚函数显示格式的选项
13.gdb环境变量
可以在gdb的调试环境中定义自己的变量,用来保存一些调试程序中的运行数据。
(gdb) set $foo=*object_ptr
(gdb) show convenience //查看当前所设置的所有的环境变量
14.查看寄存器
(gdb) info registers
(gdb) info all-registers
(gdb) info registers <regname> //查看指定寄存器的情况
(gdb) p $<regname> //打印寄存器的内容
15.改变程序的执行
修改变量的值
(gdb) p x=4
(gdb) whatis width //gdb中的参数width与程序中的变量width重名的话,使用var指定为程序的 变量名
(gdb) p width
(gdb) set var width=47
跳转执行(最好在同一个函数中跳转)
jump命令的实质是改变了pc寄存器的值 set $pc= 0x...
(gdb) jump <linespec> //<linespec>可以是行号/file:line/+num
(gdb) jump <address> //代码行的内存地址
产生信号量
(gdb) signal <signal> //linux的系统信号量通常是1到15
强制函数返回(详见《Linux环境下C编程指南》P(82+12))
强制调用函数
16.在不同语言中使用gdb
以下命令主要用于C以外的程序语言
(gdb) show language //查看当前语言环境
(gdb) info frame //查看当前函数的程序语言
(gdb) info source //查看当前文件的程序语言
(gdb) set language <languagename>
17.core dump分析
程序崩溃原因分析
$ulimit -c unlimited //获得core dump使用权限
$ gcc -ggdb3 ...
$ ./a.out
$ gdb a.out core
case12:
typedef enum (Tree,Bug) Species;
typedef enum (Big_tree, Acorn, Seedling) Tree_forms;
typedef enum (Caterpillar, Cocoon, Butterfly) Bug_forms;
struct thing
{
Species it;
union
{
Tree_forms tree;
Bug_forms bug;
}form;
}; struct thing foo = {Tree, {Acorn}} (gdb) set print union on
(gdb) p foo
$1={it=Tree, form={tree=Acorn, bug=Cocoon}}
(gdb) set print union off
(gdb) p foo
$1={it=Tree, form={...}}
case13:
(gdb) set $i=0
(gdb) print bar[$i++]->contents
GDB调试器的更多相关文章
- linux基础2——gdb调试器
gdb调试器使用的一般步骤(不断更新完善): 1.编译过程中要用-g参数来添加调试符号——gcc test.c -g: 2.gdb启动可执行文件——gdb a.out: 3.出现gdb符号表示启动成功 ...
- GCC编译器和GDB调试器常用选项
http://blog.csdn.net/u014328976/article/details/46745349 GCC编译器 gcc hello.c -o hello ...
- Linux C 程序 函数,数组,指针,gdb调试器(SEVEN)
函数,数组,指针,gdb调试器 1.函数定义 如果明确指定返回类型,默认为int 参数传递:实参对形参的参数传递是单向的,实参只是把自己的值赋给形参. 形参的 ...
- 使用GDB调试器(一)
使用GDB调试器 GDB概要---- GDB是GNU开源组织公布的一个强大的UNIX下的程序调试工具.也许,各位比較喜欢那种图形界面方式的,像VC.BCB等IDE的调试,但假设你是在UNIX平台下做软 ...
- Mac os系统gdb调试器的安装与使用
Mac os系统gdb调试器的安装与使用 1.简介 Mac os下的Terminal 终端中默认情况下并没有安装gdb调试器,但是可以通过gcc编译器进行代码编译,如果出错了就需要通过gdb调试器进行 ...
- Linux gdb调试器用法全面解析
GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具,GDB主要可帮助工程师完成下面4个方面的功能: 启动程序,可以按照工程师自定义的要求随心所欲的运行程序. 让被调试的程序在工程师指定的断 ...
- Ubuntu下GDB调试器的使用
gdb调试器时一款GNU组织开发.发布的UNIX/Linux环境下的程序调试工具,没有图形界面,但功能强大. GDB使用流程: 先编写一个测试文件gdbTest.c 保存后用gcc对文件进行编译,需要 ...
- gdb调试器在windows下的相关内容
1.gdb调试器在visual studio或dev c++中也有类似的调试图形化可视界面,但是gdb不同的是它是由命令行组成,他的界面对于习惯图形化可视界面的用户来说一时间会不知所措 2.通过gcc ...
- GDB调试器简介
Linux系统中包含了GNU 调试程序gdb,它是一个用来调试C和 C++ 程序的调试器.可以使程序开发者在程序运行时观察程序的内部结构和内存的使用情况. GDB提供了一下一些功能: (1)监视程序 ...
- GDB 调试器使用手冊
使用GDB: 本文描写叙述GDB,GNU的原代码调试器. (这是4.12版1994年一月.GDB版本号4.16) * 文件夹: * 摘要: GDB的摘要 * 实例: 一个使用实例 * 入门: 进入和退 ...
随机推荐
- HTML--3css样式表
CSS(Cascading Style Sheet,叠层样式表),作用是美化HTML网页. /*注释区域*/ 此为注释语法 一.样式表 (一)样式表的分类 1.内联样式表 和HTML联合显示,控 ...
- Oracle普通索引,唯一索引,主键的区别
索引是我们经常使用的一种数据库优化手段,适当的业务操作场景使用适当的索引方案,可以显著的提升系统整体查询性能,当然用户体验也随之提高. 在Oracle中,唯一性索引(Unique Index)是我们经 ...
- Mainstoryboard
页面间进行跳转 [self performSegueWithIdentifier:@"signInSuccess" sender:self] signSuccess是miansto ...
- SVG 2D入门3 - 文本与图像
SVG中渲染文本 SVG的强大能力之一是它可以将文本控制到标准HTML页面不可能有的程度,而无须求助图像或其它插件.任何可以在形状或路径上执行的操作(如绘制或滤镜)都可以在文本上执行.尽管SVG的文本 ...
- 算法导论 第六章 思考题6-3 Young氏矩阵
这题利用二叉堆维持堆性质的办法来维持Young氏矩阵的性质,题目提示中写得很清楚,不过确实容易转不过弯来. a,b两问很简单.直接看c小问: 按照Young氏矩阵的性质,最小值肯定在左上角取得,问题在 ...
- 一段显示隐藏列表HTML代码
一段显示隐藏列表HTML代码, 技巧在于把页面上的元素(“返回首页”)和控制显示/隐藏的元素(id=navs-menu)放在一个共同的div上,并在该div上绑定onmouseover和onmouse ...
- 解决:Ubuntu12.04下使用ping命令返回ping:icmp open socket: Operation not permitted的解决
ping命令在运行中采用了ICMP协议,需要发送ICMP报文.但是只有root用户才能建立ICMP报文.而正常情况下,ping命令的权限应为-rwsr-xr-x,即带有suid的文件,一旦该权限被修改 ...
- 转载:node.js socket.io
本文转自:http://www.xiaocai.name/post/cf1f9_7b6507 学习node.js socket.io 使用 用node.js(socket.io)实现数据实时推送 在 ...
- 【Tsinghua OJ】祖玛(Zuma)问题
描述 祖玛是一款曾经风靡全球的游戏,其玩法是:在一条轨道上初始排列着若干个彩色珠子,其中任意三个相邻的珠子不会完全同色.此后,你可以发射珠子到轨 道上并加入原有序列中.一旦有三个或更多同色的珠子变成相 ...
- React Native之生命周期
React Native生命周期主要分为三大阶段:实例化阶段(图中上框部分),存在阶段(图中左框部分),销毁阶段(图中右框部分). 如图: 下面简单讲解一下三大阶段中各自的函数: 实例化阶段: 在日常 ...