‘壹’ 如何写gdb命令脚本
GDB是一个强大的命令行调试工具。虽然X Window提供了GDB的图形版DDD,但是我仍然更钟爱在命令行模式下使用GDB。大家知道命令行的强大就是在于,其可以形成执行序列,形成脚本。UNIX下的软件全是命令行的,这给程序开发提代供了极大的便利,命令行软件的优势在于,它们可以非常容易的集成在一起,使用几个简单的已有工具的命令,就可以做出一个非常强大的功能。
于是UNIX下的软件比Windows下的软件更能有机地结合,各自发挥各自的长处,组合成更为强劲的功能。而Windows下的图形软件基本上是各自为营,互相不能调用,很不利于各种软件的相互集成。在这里并不是要和Windows做个什么比较,所谓“寸有所长,尺有所短”,图形化工具还是有不如命令行的地方。
1 GDB概述
GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在 UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。所谓“寸有所长,尺有所短”就是这个道理。
一般来说,GDB主要帮忙你完成下面四个方面的功能:
1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)
3、当程序被停住时,可以检查此时你的程序中所发生的事。
4、动态的改变你程序的执行环境。
‘贰’ gdb中,监视点,断点,跟踪点,捕获点的区别
当然可以print 就可以看到变量的值,你甚至可以写个脚本程序让gdb依次执行,但是gdb好像对标准容器不能支持,例如不能打印vector中元素的值。不过你可以在代码中定义一个调试用的变量,让他跟踪vector中你希望了解的量的值
‘叁’ .gdb是什么格式用啥软件可以打开
.gdb格式的文件是GPS定位仪器所采集是定位数据通过仪器自动保存的文件,可利用MapSourse及GoogleEarth等软件打开此文件,显示的是定位数据。
变化:
1、GDB可以理解线程的名字。
2、这个命令”线程名称”(指定一个名称)和“线程找到[REGEXP]”(匹配名称、目标ID,或者额外的信息)被添加。
3、Python脚本支持大大增强。
4、在c++的支持,异常处理是提高,模板参数放在范围在一个实例化时调试。
5、线程调试的核心转储在GNU / Linux成为可能。
(3)gdb脚本浮点扩展阅读:
执行程序:
要想运行准备调试的程序,可使用run命令,在它后面可以跟随发给该程序的任何参数,包括标准输入和标准输出说明符(<;和>;)和shell通配符(*、?、[、])在内。
如果使用不带参数的run命令,gdb就再次使用你给予前一条run命令的参数,这是很有用的。利用set args 命令就可以修改发送给程序的参数,而使用show args 命令就可以查看其缺省参数的列表。
(gdb) file a.out //加载被调试的可执行程序文件。
(gdb)set args –b –x
(gdb) show args
(gdb)r //执行程序
backtrace命令为堆栈提供向后跟踪功能。Backtrace 命令产生一张列表,包含着从最近的过程开始的所有有效过程和调用这些过程的参数。
‘肆’ 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 浮点数格式显示
‘伍’ 怎样用GDB调试一个由脚本文件启动的程序
使用GDB
一般来说GDB主要调试的是C/C++的程序。要调试C/C++的程序,首先在编译时,我们必须要把调试信息加到可执行文件中。使用编译器(cc/gcc/g++)的 -g 参数可以做到这一点。如:
$gcc -g -Wall hello.c -o hello
$g++ -g -Wall hello.cpp -o hello
如果没有-g,你将看不见程序的函数名、变量名,所代替的全是运行时的内存地址。当你用-g把调试信息加入之后,并成功编译目标代码以后,让我们来看看如何用gdb来调试他。
启动GDB的方法有以下几种:
gdb <program>
program也就是你的执行文件,一般在当前目录下。
gdb <program> core
用gdb同时调试一个运行程序和core文件,core是程序非法执行后core mp后产生的文件。
gdb <program> <PID>
如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID。gdb会自动attach上去,并调试他。program应该在PATH环境变量中搜索得到。
以上三种都是进入gdb环境和加载被调试程序同时进行的。也可以先进入gdb环境,在加载被调试程序,方法如下:
*在终端输入:gdb
*在gdb环境中:file <program>
这两步等价于:gdb <program>
GDB启动时,可以加上一些GDB的启动开关,详细的开关可以用gdb -help查看。我在下面只例举一些比较常用的参数:
-symbols <file>
-s <file>
从指定文件中读取符号表。
-se file
从指定文件中读取符号表信息,并把他用在可执行文件中。
-core <file>
-c <file>
调试时core mp的core文件。
-directory <directory>
-d <directory>
加入一个源文件的搜索路径。默认搜索路径是环境变量中PATH所定义的路径。
‘陆’ 如何用GDB进行调试
1: 对于在应用程序中加入参数进行调试的方法:
直接用 gdb app -p1 -p2 这样进行调试是不行的。
需要像以下这样使用:
#gdb app
(gdb) r -p1 -p2
或者在运行run命令前使用set args命令:
(gdb) set args p1 p2
可以用show args 命令来查看
2. 加入断点:
break <linenumber>
break <funcName>
break +offset
break -offset
(在当前行号的前面或后面的offset行停住。)
break filename:linenum
在源文件filename的linenum行处停住。
break filename:function
在源文件filename的function函数的入口处停住。
break ... if
...可以是上述的参数,condition表示条件,在条件成立时停住。比如在循环境体中,可以设置 break if i=100,表示当i为100时停住程序。
3. 查看运行时的堆栈:
使用bt命令
4. 打印某个变量的值:
print val
5. 单步: 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 make
7. 运行环境
可设定程序的运行路径。
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 = 1100101
11.查看内存
使用examine命令(简写是x)来查看内存地址中的值。x命令的语法如下所示:
x/
n、f、u是可选的参数。
n 是一个正整数,表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容。
f 表示显示的格式,参见上面。如果地址所指的是字符串,那么格式可以是s,如果地十是指令地址,那么格式可以是i。
u 表示从当前地址往后请求的字节数,如果不指定的话,GDB默认是4个bytes。u参数可以用下面的字符来代替,b表示单字节,h表示双字节,w表示四字节,g表示八字节。当我们指定了字节长度后,GDB会从指内存定的内存地址开始,读写指定字节,并把其当作一个值取出来。
n/f/u三个参数可以一起使用。例如:
命令:x/3uh 0x54320 表示,从内存地址0x54320读取内容,h表示以双字节为一个单位,3表示三个单位,u表示按十六进制显示。
12.自动显示
你可以设置一些自动显示的变量,当程序停住时,或是在你单步跟踪时,这些变量会自动显示。相关的GDB命令是display。
display
display/
display/ expr
expr是一个表达式,fmt表示显示的格式,addr表示内存地址,当你用display设定好了一个或多个表达式后,只要你的程序被停下来,GDB会自动显示你所设置的这些表达式的值。
格式i和s同样被display支持,一个非常有用的命令是:
display/i $pc
undisplay
delete display
删除自动显示,dnums意为所设置好了的自动显式的编号。
disable display
enable display
disable和enalbe不删除自动显示的设置,而只是让其失效和恢复。
info display
查看display设置的自动显示的信息。GDB会打出一张表格,向你报告当然调试中设置了多少个自动显示设置,其中包括,设置的编号,表达式,是否enable。
13. 设置显示选项
set print address
set print address on
打开地址输出,当程序显示函数信息时,GDB会显出函数的参数地址。系统默认为打开的,
show print address
查看当前地址显示选项是否打开。
set print array
set print array on
打开数组显示,打开后当数组显示时,每个元素占一行,如果不打开的话,每个元素则以逗号分隔。这个选项默认是关闭的。与之相关的两个命令如下,我就不再多说了。
set print array off
show print array
set print elements
这个选项主要是设置数组的,如果你的数组太大了,那么就可以指定一个来指定数据显示的最大长度,当到达这个长度时,GDB就不再往下显示了。如果设置为0,则表示不限制。
show print elements
查看print elements的选项信息。
set print null-stop
如果打开了这个选项,那么当显示字符串时,遇到结束符则停止显示。这个选项默认为off。
set print pretty on
如果打开printf pretty这个选项,那么当GDB显示结构体时会比较漂亮。
14.关于显示源码list
‘柒’ 如何使用linux下gdb来调试python程序
(1)假设要debug的进程号为1000,运行如下命令:
$ gdb -p 1000
使用此命令即可使gdb附加到进程。
(2)载入libpython脚本
如果你的gdb是redhat或fedora等厂商修改过的,会有--python选项,使用此选项即可指定gdb启动时载入的Python扩展脚本(此脚本是扩展gdb的,不是我们需要debug的脚本)。
$ gdb --python /path/to/libpython .py -p 1000
如果安装的是GNU的gdb,就需要打开gdb后手动载入libpython.py脚本
(gdb) python
> import sys
>sys.path.insert(0, '/path/to/libpython.py' )
> import libpython
>end
(gdb)
这时就可以使用py-bt命令打印当前线程的Python traceback了。libpython还提供很多命令,例如py-print打印变量,py-locals打印所有本地变量等等,详细可打开libpython.py查看。
‘捌’ gcc里怎么用gdb
这位朋友我看是有点误解了makefile的做用。makefile
是一个脚本,由他来控制编译出的程序的版本。当你改写了原文件后,通过makefile
来检查依赖关系,来生成最终的文件。比如一个程序叫a
他的源码叫a.c
a.c
又用到头文件a.h
,a.h是1.h和2.h生成的如果你改写了1.h,通过编写makefile文件。make时会调用makefile来依此按依赖关系生成最后的a所以说编译时程序并不知道生成a都用到什么。怎么可能自己生成呢。makefile是要你自己编写的,来告诉make来如何编译。make工具就相当于一个脚本。
gcc里怎么用gdb?这里有视频教程可以看下
http://www.alisoho.com
‘玖’ 深度linux V20如何安装gdb,如何用gdb调试程序、用gdb设置断点删除断点、gdb自动显示变量值、看内存值
因本人通过几个小时的时间才解决这个问题,希望我的答案能节省大部分初学者在gdb上的时间。我也是今天才接触gdb,以下是有关深度linux V20的gdb调试问题的初步总结:
安装gdb方式,sudo apt-get install gdb ,有ok点击ok安装,直到安装结束。
gcc -g aa.c之后才能调试a.out文件。(aa.c表示你的源文件)
用法gdb a.out或者gdb进入后file a.out
l N是查看N行附近的代码,直接l是显示接下去的代码。r运行过程中遇到断点,按l则显示断点附近代码。
l 函数名是查看函数名里边的代码
q退出调试。
p 变量,查看变量即时值。
r运行。
n单步执行。
s单步执行-进入函数。
c连续多步运行,直到下个断点(循环的下一次断点)暂停。
b N第N行设置断点。
b 函数名,在函数名的入口处设置断点。
b 文件名:行号,在指定文件名行号设置断点。其中文件名是源文件的文件名。
(条件断点)b 行号 if 变量==N,表示该行号的断点必须满足变量==N的条件下才停下来。
ignore 断点编号 N,表示该断点编号在接下来的运行过程中忽略N次,即第N+1次该断点才会停下来。
info break显示全部断点。简写i b
delete 1-3删除编号为1到3的断点。简写 d 1-3。d 4只删除编号为4的断点。
delete break删除所有断点。无法简写
clear 20删除20行断点。
运行中disable break n 禁用断点号为n的断点。enable break n 使能断点为n的断点号重新启用。其中break可以简写为b
display {var1,var2,var3}自动显示var1~3变量的值。要删除display则用delete display N,N表示display的编号,如果不加N则表示删除全部的display。如果要自动显示数组内容,用display 数组名。注意:display需要r之后才能设置。
watch {var1,var2,var3}自动跟踪改变的值,只要有改变才显示watch。要删除watch,用d N,N代表watch编号,用i b可以查看该编号。注意:watch需要r之后才能设置。
gdb死循环程序按键盘ctrl+c可结束程序
****************
要查看内存地址的内容用x /nfu 内存地址。以下是n、f、u的解释
其中n表示要显示多少个内存单元。
f表示显示方式, 可取如下值
x 按十六进制格式显示变量。
d 按十进制格式显示变量。
u 按十进制格式显示无符号整型。
o 按八进制格式显示变量。
t 按二进制格式显示变量。
a 按十六进制格式显示变量。
i 指令地址格式
c 按字符格式显示变量。
f 按浮点数格式显示变量。
u表示一个地址单元的长度
b表示单字节,
h表示双字节,
w表示四字节,
g表示八字节
*****************
‘拾’ gdb断点怎么实现的
2009年12月29日,程序调试工具 GDB 7.0.1 发布,新版本修正了7.0版本的一些严重的堆栈溢出bug,这些bug可能导致 GDB 调试进程中断,修正了在 FreeBSD 和 IRⅨ 系统下无法编译的问题,增加了对 Thumb2调试的支持,还有其他一些小bug的修复。
2010年03月19日,GDB 7.1 发布,
详细改进内容:多程序调试的支持;
位置独立的可执行文件(派)调试的支持;
新的目标(包括一个模拟器):Xilinx MicroBlaze和瑞萨RX;
Python支持增强;
c++支持扩展;
新tracepoint功能;
过程记录的改进;
远程协议扩展。
2010年09月06日 ,GDB 7.2 发布,
该版本改进记录:
⒈ 支持D语言
⒉ C++ 改进,支持参数依赖查找ADL,静态常量类成员和改进了用户自定义操作符的支持
⒊ Python 调试的改进,包括断点、符号、符号表、程序空间、线程等可通过命令行进行操作
⒋ Furthermore,enhancements were made for tracepoints and for GDBserver.在跟踪点和GDB程序上有了改善。
⒌ 支持 ARM Symbian 平台
⒍ 其他方面的改进和bug修复。
2011年08月26日,GDB 7.3a 发布,
变化:
1。GDB可以理解线程的名字。
2。这个命令”线程名称”(指定一个名称)和“线程找到[REGEXP]”(匹配名称、目标ID,或者额外的信息)被添加。
3。Python脚本支持是大大增强。
4。在c++的支持,异常处理是提高,模板参数放在范围在一个实例化时调试。
5。线程调试的核心转储在GNU / Linux成为可能。
6。最初支持C语言版本的OpenCL。
7。许多其他改进。