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 *arr@3
    $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.)

posted on 2015-12-28 10:20  BlueSky~  阅读(297)  评论(0编辑  收藏  举报

导航