gdb怎么用
1.gdb怎么用
GDB调试,建议去下个系统的文档;
GDB调试器
GCC用于编译程序,而Linux的另一个GNU工具gdb则用于调试程序。gdb是一个用来调试C和C++程序的强力调试器,我们能通过它进行一系列调试工作,包括设置断点、观查变量、单步等。
其最常用的命令如下:
file:装入想要调试的可执行文件。
kill:终止正在调试的程序。
list:列表显示源代码。
next:执行一行源代码但不进入函数内部。
step:执行一行源代码而且进入函数内部。
run:执行当前被调试的程序
quit:终止gdb
watch:监视一个变量的值
break:在代码里设置断点,程序执行到这?锸惫移?
make:不退出gdb而重新产生可执行文件
shell:不离开gdb而执行shell
2)从你的描述上看来,你是用单独的gdb.exe调试器,调试的时候不需要运行程序的,编译的时候 只要加上相应的参数(”-g“)产生编译后的可执行文件,
以gcc编译sum.c(加-g选项产生debug信息):
gcc –g –o sum sum.c
在命令行上键入gdb sum并按回车键就可以开始调试sum了,再运行run命令执行sum。
2.gcc中怎么使用gdb命令
在linux系统中,默认是没有安装gcc编译器的,可以通过命令
rpm -q | grep gcc
来查看。安装命令为:
yum -y install gcc
安装后,编写一个.c结尾的文件。
gcc test.c
就会默认输出一个a.out的输出文件,这个输出文件就是可执行文件。
如果加上-o选项,则可以自定目标文件。
gcc -o test test.c
test就是它的可执行文件。
一般都默认加上-Wall 选项,可以自动提示一些出错警告的信息。
gcc -Wall -o test test.c
gbd
以上就是常用的gcc相关知识了。下面就是它的调试,调试通常使用gdb。在编译的时候需要加上选项-ggdb3选项
gcc -ggdb3 -Wall -o test test.c
这样在没有出错的情况下
gdb test
就进入调试窗口
输入下面命令可以进行如下的操作:
break 设置断点
break 21 在第21行设置断点
break main 在main函数处设置断点
break test 在函数test处设置断点
step / s 下一步,直接执行下一条程序
continue / cont 下一段,如果遇到函数,不会进入函数,逐过程,有点类似VS里面的F10
run 运行
finish 结束调试
tbreak设置临时断点
print / p 显示某个变量的值
p *array@len 输出数组
p i 输出i的值
enable 恢复失效的断点
disable 使断点失效
clear 清除断点
backtrace / bt 查看堆栈信息
相关的输出格式
x 十六进制格式
d 十进制格式
u 十六进制无符号
o 八进制显示
t 二进制显示
a 十六进制显示
c 字符格式显示
f 浮点数格式显示
3.如何用GDB进行调试
1: 对于在应用程序中加入参数进行调试的方法: 直接用 gdb app -p1 -p2 这样进行调试是不行的。
需要像以下这样使用: #gdb app (gdb) r -p1 -p2 或者在运行run命令前使用set args命令: (gdb) set args p1 p2 可以用show args 命令来查看2. 加入断点: break
break filename:function 在源文件filename的function函数的入口处停住。 break 。
if 。可以是上述的参数,condition表示条件,在条件成立时停住。
比如在循环境体中,可以设置 break if i=100,表示当i为100时停住程序。3. 查看运行时的堆栈: 使用bt命令4. 打印某个变量的值: print val5. 单步: n 继续运行: c step 单步跟踪,如果有函数调用,他会进入该函数。
next 同样单步跟踪,如果有函数调用,他不会进入该函数。很像VC等工具中的step over。
后面可以加count也可以不加,不加表示一条条地执行,加表示执行后面的count条指令,然后再停住。 set step-mode set step-mode on 打开step-mode模式,于是,在进行单步跟踪时,程序不会因为没有debug信息而不停住。
这个参数有很利于查看机器码。 set step-mod off 关闭step-mode模式。
finish 运行程序,直到当前函数完成返回。并打印函数返回时的堆栈地址和返回值及参数值等信息。
until 或 u 当你厌倦了在一个循环体内单步跟踪时,这个命令可以运行程序直到退出循环体。6.在GDB中执行shell命令: 在gdb环境中,你可以执行UNIX的shell的命令,使用gdb的shell命令来完成: eg. shell make7. 运行环境 可设定程序的运行路径。
show paths 查看程序的运行路径。 set environment varname [=value] 设置环境变量。
如:set env USER=hchen show environment [varname] 查看环境变量。8.观察点(WatchPoint) 观察点一般来观察某个表达式(变量也是一种表达式)的值是否有变化了,如果有变化,马上停住程 序。
我们有下面的几种方法来设置观察点: watch 为表达式(变量)expr设置一个观察点。一量表达式值有变化时,马上停住程序。
rwatch 当表达式(变量)expr被读时,停住程序。 awatch 当表达式(变量)的值被读或被写时,停住程序。
info watchpoints 列出当前所设置了的所有观察点。9. 维护breakpoint clear 清除所有的已定义的停止点。
clear func 清除所有设置在函数上的停止点。 delete [breakpoints] [range。
] 删除指定的断点,breakpoints为断点号。如果不指定断点号,则表示删除所有的断点。
range 表示断点号的范围(如:3-7)。其简写命令为d。
比删除更好的一种方法是disable停止点,disable了的停止点,GDB不会删除,当你还需要时,enable即可,就好像回收站一样。 disable [breakpoints] [range。
] disable所指定的停止点,breakpoints为停止点号。如果什么都不指定,表示disable所有的停止 点。
简写命令是dis. enable [breakpoints] [range。] enable所指定的停止点,breakpoints为停止点号。
10、程序变量 查看文件中某变量的值:file::variable function::variable 可以通过这种形式指定你所想查看的变量,是哪个文件中的或是哪个函数中的。例如,查看文件f2.c中的全局变量x的值:gdb) p 'f2.c'::x 查看数组的值 有时候,你需要查看一段连续的内存空间的值。
比如数组的一段,或是动态分配的数据的大小。你可以使用GDB的“@”操作符,“@”的左边是第一个内存的地址的值,“@”的右边则你你想查看内存的长度。
例如,你的程序中有这样的语句:int *array = (int *) malloc (len * sizeof (int)); 于是,在GDB调试过程中,你可以以如下命令显示出这个动态数组的取值:p *array@len 如果是静态数组的话,可以直接用print数组名,就可以显示数组中所有数据的内容了。11.输出格式 一般来说,GDB会根据变量的类型输出变量的值。
但你也可以自定义GDB的输出的格式。例如,你想输出一个整数的十六进制,或是二进制来查看这个整型变量的中的位的情况。
要做到这样,你可以使用GDB的数据显示格式:x 按十六进制格式显示变量。d 按十进制格式显示变量。
u 按十六进制格式显示无符号整型。o 按八进制格式显示变量。
t 按二进制格式显示变量。a 按十六进制格式显示变量。
c 按字符格式显示变量。f 按浮点数格式显示变量。
(gdb) p i$21 = 101(gdb) p/a i$22 = 0x65(gdb) p/c i$23 = 101 'e'(gdb) p/f i$24 = 1.41531145e-43(gdb) p/x i$25 = 0x65(gdb) p/t i$26 = 110010111.查看内存 使用examine命令(简写是x)来查看内存地址中的值。x命令的语法如下所示:x/ n、f、u是可选的参数。
n 是一个正整数,表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容。f 表示显示的格式,参见上面。
如果地址所指的是字符串,那么格式可以是s,如果地十是指令地址,那么格式可以是i。u 表示从当前地址往后请求的字节数,如果不指定的话,GDB默认是4个bytes。
u参数可以用下面的字符来代替,b表示单字节,h表示双字节,w表示四字节,g表示八字节。当我们指定了字节长度后。
4.如何使用GDB调试C语言程序
GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具,基于命令行界面。
在Windows下如果想使用GDB,可以先下载安装一个MiniGW,这个工具包含GCC编译器和GDB调试器,再配合一个Notepad++或者Sublime Text(Sublime这款编辑器不是免费的,可以参考我前面写的一篇文章的破解方法来免费使用《Sublime Text 2在Linux和Windows下的破解》)来写代码,这样就足够了;
大多数Linux发行版都包含了GCC编辑器和GDB调试器,如果没有可以自行安装,这不是本文讨论论的重点,配合Vim或者Linux版本的Sublime Text来写代码也是不错的选择;
5.求问GDB如何使用符号表
如果现在有同一个工程构建出的Debug版和Release版可执行文件projectD和projectR,如下的命令可以帮助你把Debug版中的符号表加到Release版中,实现对Release版的调试。
1、objcopy --only-keep-debug projectD projectsymbol.dbg #生成符号表;
2、gdb -q --symbol=projectsymbol.dbg -exec=projectR #加载符号表;
这下在gdb中就可以看到源代码了。