gdb 学习

http://www.cnblogs.com/TianFang/archive/2013/01/21/2869474.html

http://www.cnblogs.com/evasnowind/archive/2010/11/07/1871324.html

在使用gdb前,必须先载入可执行文件,因为要进行调试,文件中就必须包含调试信息,所以在用gcc或cc编译时就需要用-g参数来打开程序的调试选项。

调试开始时,必须先载入要进行调试的程序,可以用以下两种方式:

 * 在启动gdb后执行以下命令:

   file 可执行文件路径

 * 在gdb启动时就载入程序:

   gdb 可执行文件路径

 常用命令如下表:

命令 使用格式 备注
list list 输出从上次调用list命令开始往后的10行程序代码
list - 输出从上次调用list命令开始往前的10行程序代码
list n 输出第n行附近的10行程序代码
list function 输出函数function前后的10行程序代码
forward-search forward-search 字符串 从当前行向后查找匹配某个字符串的程序行,
查找到的行号将保存在$_变量中,
可以用print $_命令来查看
reverse-search reverse-search 字符串 和forward-search相反,向前查找字符串
break break 要设置断点的行号 在程序中设置断点,当程序运行到指定行上时,会暂停执行
tbreak tbreak 要设置临时断点的行号 设置临时断点,在设置之后只起作用一次
clear clear 要清除的断点所在的行号 和break相反,clear用于清除断点
info break info break 列出设置过的断点
run run 启动程序,在run后面带上参数可以传递给正在调试的程序
awatch awatch 变量或表达式 用来增加一个观察点(add
watch),
当表达式的值发生改变或表达式的值被读取时,程序就会停止运行
watch watch 变量或表达式 与awatch类似用来设置观察点,
但程序只有当表达式的值发生改变时才会停止运行.
需要注意的是,awatch和watch都必须在程序运行的过程中设置观察点,即可运行run之后才能设置
commands commands 设置在遇到断点后执行特定的指令
commands n 设置遇到断点号n时要执行的命令,

注意,commands后面跟的是断点号,而不是断点所在的行号。在输入命令后,就可以输入遇到断点后要执行的命令,每行一条命令,在输入最后一条命令后输入end就可以结束输入

delete delete 断点号 清除断点或自动显示的表达式
disable disable 断点号列表 让指定断点失效,断点号之间用空格间隔开
enable enable 断点编号列表 和disable相反,恢复失效的断点
ignore ignore 断点号 忽略次数 忽略断点
condition condition 断点号 条件表达式 设置断点在一定条件下才能生效
cont/continue cont 跳过当前断点继续运行
cont n 跳过n次断点,继续运行
jump jump 行号 让程序跳到指定行开始调试
next next 执行一条语句
  next n 执行n条语句
step step 与next类似,但是它会跟踪到子程序的内部,
而且会显示子程序内部的执行情况
finish finish 跳出函数调用,运行至函数结束并打印函数返回值
whatis  whatis
变量或表达式
显示某个变量或表达式的数据类型
ptype  ptype
变量或表达式
和whatis类似,用于显示数据类型,
但是它还可以显示typedef定义的类型等
set  set
变量=表达式
设置程序中变量的值
display  display
表达式
增加要显示值的表达式
info
display
info
display
显示当前所有的要显示值的表达式
delete display
/undisplay
delete
display/undisplay 表达式编号
删除要显示值的表达式
disable
display
disable
display 表达式编号
暂时不显示一个要表达式的值
enable
display
enable
display 表达式编号
与disable
display相反,使用表达式恢复显示
print  print
变量或表达式
打印变量或表达式的值
backtrace/bt backtrace
栈帧个数
打印指定个数的栈帧(stack
frame)
frame  frame
栈帧号
打印栈帧
info
frame
info
frame
显示当前栈帧的详细信息
select-frame select-frame
栈帧号
选择栈帧,选择后可以用info
frame来显示栈帧信息
kill  kill  结束当前程序的调试
quit  quit  退出gdb
set
args
set
args
可指定运行时参数。(如:set
args 10 20 30 40 50)
show
args
show
args
命令可以查看设置好的运行参数

__________________________________

查看运行时数据

gdb中查看变量的命令是print,一般用它的简写形式p。它的语法如下:

print [</format>] <expr>

其中参数expr可以是一个变量,也可以是表达式。format表示输出格式,例如,可以用/x来将结果按16进制输出。如下是几个基本的例子:

format的取值范围有如下几种:

  • x 按十六进制格式显示变量。
  • d 按十进制格式显示变量。
  • u 按十六进制格式显示无符号整型。
  • o 按八进制格式显示变量。
  • t 按二进制格式显示变量。
  • a 按十六进制格式显示变量。
  • c 按字符格式显示变量。
  • f 按浮点数格式显示变量。

查看函数返回值

查看函数返回值是在调试的过程中经常遇到的需求。例如,对于如下函数

int foo()
    {
        return 100;
    }

我们可以以如下方式获取函数的返回值:

1. 通过finish命令运行至函数结束,此时会打印函数返回值。

(gdb) finish
    Run till exit from #0 foo () at main.c:9
    main () at main.c:15
    15 }
    Value returned is $2 = 100

2. 返回值会存储在eax寄存器中,通过查看信息可以获取返回值。

(gdb) p $eax
    $3 = 100

(gdb) info registers 
    eax 0x64 100

查看连续内存

可以使用GDB的"@"操作符查看连续内存,"@"的左边是第一个内存的地址的值,"@"的右边则你你想查看内存的长度。

例如,对于如下代码:int arr[] = {2, 4, 6, 8, 10};,可以通过如下命令查看arr前三个单元的数据。

(gdb) p *[email protected]
    $2 = {2, 4, 6}

查看内存

可以使用examine命令(简写为x)来查看内存地址中的值。x命令的语法如下所示:

x /<n/f/u> <addr>

  • n 表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容。
  • f 表示显示的格式,如果是字符串,则用s,如果是数字,则可以用i。
  • u 表示从当前地址往后请求的字节数,默认是4个bytes。(b单字节,h双字节,w四字节,g八字节)
  • <addr> 表示一个内存地址。

例如:以两字节为单位显示前面的那个数组的地址后32字节内存信息如下.

(gdb) x /16uh arr
    0xbffff4cc: 2 0 4 0 6 0 8 0
    0xbffff4dc: 10 0 34032 2052 0 0 0 0

自动显示

在VisualStudio中,可以通过监视窗口动态查看变量的值。在gdb中,也提供了类似的命令display,它的语法是:

display <expr>
    display /<fmt> <expr>
    display /<fmt> <addr>

expr是一个表达式,fmt表示显示的格式,addr表示内存地址。当你用display设定好了一个或多个表达式后,只要你的程序被停下来(单步跟踪时),GDB会自动显示你所设置的这些表达式的值。

几个相关的命令如下:

    • undisplay <dnums...>        不显示dispaly
    • delete display [dnums]    删除自动显示,不带dnums参数则删除所有自动显示,也支持范围删除,如: delete display 1,3-5
    • disable display <dnums...>    使display失效
    • enable display <dnums...>    恢复display
    • info display        查看display信息

如要查看所有的gdb命令,可以在gdb下键入两次Tab(制表符),运行“help command”可以查看命令command的详细使用格式

新版的gdb都带一个tui的功能,可以通过focus命令开启,其主要界面如下:

这个界面比起list来说方便多了,能高亮当前语句的执行位置,步进时也会跟着变化,有点使用Turbo C的感觉。

不知道是不是由于focus比较新的缘故,貌似网上并没有多少文章介绍它,虽然它比较容易上手,下面是一些介绍:

简单来说就是在以往的gdb开始的时候添加一个-tui选项.有的版本已经有gdbtui这个程序了

在linux自带的终端里是正常显示的,但是在securecrt里面,可能由于编码的问题,边缘会有些乱码,不过不影响使用(如果你的程序有错误输出,会扰乱整个界面,所以在调试的时候,建议添加2>/dev/null,这样的话基本可用)

启动gdb之后,上面是src窗口,下面是cmd窗口,默认focus在src窗口的,这样的话上下键以及pagedown,pageup都是在移动显示代码,并不显示上下的调试命令.这个时候要切换focus,具体可简单参见

命令示例:

(gdb) info win  查看当前focus
        SRC     (36 lines)  <has focus>
        CMD     (18 lines)
(gdb) fs next  切换focus
Focus set to CMD window.
(gdb) info win 
        SRC     (36 lines)
        CMD     (18 lines)  <has focus>
(gdb) fs SRC  切换指定focus
Focus set to SRC window.
(gdb)

(Window names are case in-sensitive.)

时间: 2024-08-23 08:24:32

gdb 学习的相关文章

[Debug]GDB学习笔记(一)

GDB学习 点击打开链接 比较详细的gdb命令 gcc编译的程序要带 -g 参数,要想运行准备调试的程序,可使用run(r)命令,在它后面可以跟随发给该程序的任何参数 其它相关备忘如何在gdb下调用shell命令:答:比如要查看当前目录,只要输入 shell pwd就好了 单步调试的一些相关命令答:step <count>单步跟踪,如果有函数调用,他会进入该函数(进入函数的前提是,此函数被编译有debug信息).next <count>同样单步跟踪,如果有函数调用,他不会进入该函数

gdb学习(二)[第二版]

查看运行时数据 print - 查看变量值 ptype – 查看变量类型 #ptype i #ptype "aaa" 打印字符串"aaa"的类型 #ptype array 打印数组array的类型 #ptype main 打印main函数的类型 print array – 查看数组 #p arr1 #p arr1[2] 查看数组arr2第三个元素值 #p &arr1[2] 打印数组元素的地址 #p &arr1 打印数组首地址,与p &arr1

gdb学习[第二版]

概述 gdb是GNU debugger的缩写,是编程调试工具. 功能 1.启动程序,可以按照用户自定义的要求随心所欲的运行程序. 2.可让被调试的程序在用户所指定的断点处停住 (断点可以是条件表达式). 3.当程序停住时,可以检查此时程序中所发生的事. 4.动态改变程序的执行环境. 示例: gcc -Wall -g simple.c -o simple #一定要记得加上-g选项,以便生成调试信息 启动gdb:gdb [-q] [executable-file] [core-file] gdb s

gdb学习(一个)[再版]

概要 gdb是GNU debugger的缩写,是编程调试工具. 功能 1.启动程序,能够依照用户自己定义的要求随心所欲的执行程序. 2.可让被调试的程序在用户所指定的断点处停住 (断点能够是条件表达式). 3.当程序停住时,能够检查此时程序中所发生的事. 4.动态改变程序的执行环境. 演示样例: gcc -Wall -g simple.c -o simple #一定要记得加上-g选项,以便生成调试信息 启动gdb:gdb [-q] [executable-file] [core-file] gd

Gdb学习笔记1

其实,从很早就开始接触gdb程序,gdb调试程序伴我成长,现在对其用法记录以下: 当程序的运行结果和预期结果不一致,或者程序出现运行错误时,gdb就可以派上大用处了.调试的基本过程是: -> 根据情况,分析现象 -> 根据直觉,假设原因 -> 根据经验,修改验证 -> | | <-   根据经验,修改验证 <-  根据直觉,假设原因 <- 根据情况,分析现象 <- 直到程序的结果和预期完全一致为止,就可以结束苦逼的程序调试了.调试器(如GDB)的目的是允许你

gdb学习-checkpoint,watch

checkpoint的内容参考: http://blog.chinaunix.net/uid-23629988-id-2943273.html 这一篇主要是checkpoint,在next之前加checkpoint命令,然后就可以用 restart 1 来恢复到之前的checkpoint,可以避免从头再来. 用 info checkpoints 可以看到所有的checkpoints. 好像也能看到breakpoint的 (gdb) info checkpoints * 1 process 206

Linux GDB学习

gdb gcc 编译选项加上 –g ,这样生成的目标代码中就添加了调试信息. gcc –g –o hello hello.c redhat 6.3 默认是不安装gdb的,如果安装从系统光盘(ios镜像文件),将其解压在Packages文件夹下找到         gdb-7.2-56.el6.i686.rpm,然后执行以下命令: rpm -ivh gdb-7.2-56.el6.i686.rpm(因为版本不同数字部分可能不同) 1. 启动GDB 指令:gdb 程序名[corefile] coref

gdb学习笔记

设置断点 b main; 在main()入口处 b 148; 在第148行 查看断点 info b 运行程序 r 单条语句执行 n 继续运行程序 c 打印变量i的值 p i 查看函数堆栈 bt 退出函数 finish help命令只是例出gdb的命令种类,如果要看种类中的命令,可以使用help <class> 命令,如:help breakpoints,查看设置断点的所有命令.也可以直接help <command>来查看命令的帮助. TAB可补全函数名,命令名 在gdb中,我们可以

gdb学习(一)

 概述 gdb是GNU debugger的缩写,是编程调试工具. 功能 1.启动程序,可以按照用户自定义的要求随心所欲的运行程序. 2.可让被调试的程序在用户所指定的断点处停住 (断点可以是条件表达式). 3.当程序停住时,可以检查此时程序中所发生的事. 4.动态改变程序的执行环境. 示例: gcc -Wall -g simple.c -o simple #一定要记得加上-g选项,以便生成调试信息 启动gdb:gdb [-q] [executable-file] [core-file] gd