xyu

xyu

0个粉丝

18

问答

0

专栏

0

资料

xyu  发布于  2012-12-04 13:47:21
采纳率 0%
18个问答
3371

GDB调试程序--GDB常用命令

要想使用gdb,必须在对源码进行编译的时候,使用-g编译选项开关,来通知编译器,开发者希望进行程序调试。用了-g选项后,程序在编译的时候就会包含调试信息,这些调试信息存在目标文件中,它描述了每个函数或变量的数据类型以及源码行号和可执行代码地址间对应关系,gdb正是通过这些信息使源码和机器码相关联的,它实现了源码级的调试。

为了使用gdb调试,只需要在命令行中输入gdb filename(filename是用gcc编译生成的最终可执行文件名),该语句启动与调试器的文本接口。就在上一小节中所举makefile例子来说,就是键入gdb tune1,则在屏幕上会出现

[nie@uClinux mysrc]$ gdb tune1

GNU gdb Red Hat Linux 7.x (5.0rh-15) (MI_OUT)

Copyright 2001 Free Software Foundation, Inc.

GDB is free software, covered by the GNU General Public License, and you are

welcome to change it and/or distribute copies of it under certain conditions.

Type "show copying" to see the conditions.

There is absolutely no warranty for GDB.  Type "show warranty" for details.

This GDB was configured as "i386-redhat-linux"...

(gdb)

gdb虽然运行起来,但是可执行程序tune1并没有运行,此时在gdb提示符下直接键入run命令即可,如果可执行程序在运行的时候需要输入命令行参数,则在gdb提示符下可以这样键入命令:run command-line-arguments ,就如同是输入命令:tune1 command-line-arguments一样,启动了可执行程序的运行。

有时候,我们希望能够断点调试程序,让程序执行到代码某处时停止继续执行下去,此时可以使用命令break,该命令的格式为break place,这里place可以是程序代码的行号,某函数名,甚至可以是用break main ,让程序断点设置在代码一开始执行的地方,比如对于上面举的可执行文件名为tune1的例子,它调用了一个函数名为rtExtModeCheckInit的子函数,如果想让程序执行到该函数处停止,可以在gdb提示符下输入:break rtExtModeCheckInit,此时屏幕上出现下列信息:Breakpoint 1 at 0x8049a28: file grt_main.c, line 604.。当然,也可以使用行号设置中断位置,上面设置中断的语句可以等价为break 604,可以在屏幕上看到相同的效果。

当设置了断点后,程序会运行到断点处停下来,此时从屏幕上可以得到类似下面的信息:

Breakpoint 1, main (argc=4, argv=0xbffffb84) at grt_main.c:604

604    rtExtModeCheckInit();

(gdb)

当想将某个断点除去,可以在gdb提示符下输入命令:delete N,这里N表示第几个中断,第一个设置的中断序号为1,第二个设置的序号为2,依次类推。如果delete后不跟任何序号,在表示把设置的所有断点都删除。如果想查看目前设置断点的情况,可以使用命令info break,屏幕会显示出每一个设置的断点信息。

在gdb提示符下使用help命令,会给出有关gdb命令的一个简短描述和命令分类。

如果开发者想进入到程序内部进行单步调试,gdb提供两种命令供选择,step和next命令,两者的区别在于step执行每一条语句,如果遇到函数调用,会跳转到到该函数定义的开始行去执行,而next则不进入到函数内部,它把函数调用语句当作普通一条语句执行完成。continue命令是继续运行程序,直到遇到下一个断点或程序结束。

有时候使用者仅仅是在linux的bash提示符下输入命令gdb后,启动了gdb而已,此时,如果要加载可执行文件,需要在gdb提示符下键入命令:file filename(filename为可执行文件名),注意是可执行文件的名字而不是源文件名。

当在调试过程中,想查看一个变量值的时候,可以在gdb环境下输入命令:watch variablename ,这里的variablename是你想观察的变量名。

还有一个可以显示表达式值的命令print,其使用规则为print expressionname,其中expressionname为要显示的表达式名。
我来回答
回答0个
时间排序
认可量排序
易百纳技术社区暂无数据
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区