linux社区爱心援助Linux认证系列教程业界动态站务新闻公司招聘建议留言网址大全LPI专题CISCO专题
设为首页
加入收藏
管理团队
JSP  
JAVA  
PERL  
 您的位置:首页 > article > Linux开发区 > 软件开发 >
栏目导栏
资料搜索
热门文章
·Linux 下 C 语言编程
·Linux下的通用线程池创建
·C++字符串转换篇
·linux C 进程操作篇
·linux上的C/C++编译器gcc/egcs
·linux C 文件权限控制篇
·GCC使用手册
·linux C 接口处理篇
·在Redhat Linux上安装 GCC 编译
·GCC使用指南
·C语言运算符
·Linux下C开发环境的构成和安装
·fopen()函数的参数说明
·GCC使用手册与常用命令
·Scheme 语言介绍
最新文章
·在Ubuntu Linux 8.04上构建GCC
·Linux操作系统下Socket编程地址
·将VC程序移植到Linux系统的几点
·Linux下malloc/free与new/dele
·Linux下用GTK和socket实现简单
·Linux操作系统下让Tomcat启动在
·Linux操作系统中如何编译C程序
·几种常被人们忽略的Linux系统下
·Eclipse编程工具 在Ubuntu下的
·Linux操作系统下的网络地址转换
·老手经验谈:Linux驱动程序开发
·Linux操作系统多线程同步Mutex
·Linux操作系统下C程序语言简易
·Linux系统平台下关于GCC编译及
·解决Linux系统下管道被接受方关
Google
 
Linux 下 C 语言编程
[ 作者:Linux联盟收集  加入时间:2006-06-11 18:33:00  来自:Linux联盟收集 ]
  表 27.1. 基本 gdb 命令.

命令描述
file 装入想要调试的可执行文件。
kill 终止正在调试的程序。
list 执行一行源代码但不进入函数内部。
next执行一行源代码但不进入函数内部。
step执行一行源代码而且进入函数内部。
run执行当前被调试的程序
quit终止 gdb
watch 使你能监视一个变量的值而不管它何时被改变。
break 在代码里设置断点, 这将使程序执行到这里时被挂起。
make 使你能不退出 gdb 就可以重新产生可执行文件。
shell 使你能不离开 gdb 就执行 UNIX shell 命令。

  gdb 支持很多与 UNIX shell 程序一样的命令编辑特征。 你能象在 bash 或 tcsh里那样按 Tab 键让 gdb 帮你补齐一个唯一的命令, 如果不唯一的话 gdb 会列出所有匹配的命令。 你也能用光标键上下翻动历史命令。 

  gdb 应用举例

  本节用一个实例教你一步步的用 gdb 调试程序。 被调试的程序相当的简单, 但它展示了 gdb 的典型应用。 

ZqULinux联盟
下面列出了将被调试的程序。 这个程序被称为 greeting , 它显示一个简单的问候, 再用反序将它列出。 

#include  ZqULinux联盟
main () ZqULinux联盟
{ ZqULinux联盟
char my_string[] = "hello there"; ZqULinux联盟
my_print (my_string); ZqULinux联盟
my_print2 (my_string); ZqULinux联盟
} ZqULinux联盟
void my_print (char *string) ZqULinux联盟
{ ZqULinux联盟
printf ("The string is %sn", string); ZqULinux联盟
} ZqULinux联盟
void my_print2 (char *string) ZqULinux联盟
{ ZqULinux联盟
char *string2; ZqULinux联盟
int size, i; ZqULinux联盟
size = strlen (string); ZqULinux联盟
string2 = (char *) malloc (size + 1); ZqULinux联盟
for (i = 0; i < size; i++) ZqULinux联盟
string2[size - i] = string[i]; ZqULinux联盟
string2[size+1] = `%content%'; ZqULinux联盟
printf ("The string printed backward is %sn", string2); ZqULinux联盟
}

  用下面的命令编译它: 

  gcc -o test test.c

  这个程序执行时显示如下结果: 

  The string is hello thereZqULinux联盟
  The string printed backward is

  输出的第一行是正确的, 但第二行打印出的东西并不是我们所期望的。 我们所设想的输出应该是: 

  The string printed backward is ereht olleh

  由于某些原因, my_print2 函数没有正常工作。 让我们用 gdb 看看问题究竟出在哪儿, 先键入如下命令: 

  gdb greeting

  注意: 记得在编译 greeting 程序时把调试选项打开。  ZqULinux联盟
 ZqULinux联盟
  如果你在输入命令时忘了把要调试的程序作为参数传给 gdb , 你可以在 gdb 提示符下用 file 命令来载入它:  ZqULinux联盟
 ZqULinux联盟
  (gdb) file greeting

  这个命令将载入 greeting 可执行文件就象你在 gdb 命令行里装入它一样。 

  这时你能用 gdb 的 run 命令来运行 greeting 了。 当它在 gdb 里被运行后结果大约会象这样: 

(gdb) run ZqULinux联盟
 ZqULinux联盟
Starting program: /root/greeting ZqULinux联盟
 ZqULinux联盟
The string is hello there ZqULinux联盟
 ZqULinux联盟
The string printed backward is ZqULinux联盟
 ZqULinux联盟
Program exited with code 041

  这个输出和在 gdb 外面运行的结果一样。 问题是, 为什么反序打印没有工作? 为了找出症结所在, 我们可以在 my_print2 函数的 for 语句后设一个断点, 具体的做法是在 gdb 提示符下键入 list 命令三次, 列出源代码: 

  (gdb) list ZqULinux联盟
 ZqULinux联盟
  (gdb) list ZqULinux联盟
 ZqULinux联盟
  (gdb) list

  技巧: 在 gdb 提示符下按回车健将重复上一个命令。 

  第一次键入 list 命令的输出如下:  ZqULinux联盟
 ZqULinux联盟
1 #include  ZqULinux联盟
 ZqULinux联盟
2 ZqULinux联盟
 ZqULinux联盟
3 main () ZqULinux联盟
 ZqULinux联盟
4 { ZqULinux联盟
 ZqULinux联盟
5 char my_string[] = "hello there"; ZqULinux联盟
 ZqULinux联盟
6 ZqULinux联盟
 ZqULinux联盟
7 my_print (my_string); ZqULinux联盟
 ZqULinux联盟
8 my_print2 (my_string); ZqULinux联盟
 ZqULinux联盟
9 } ZqULinux联盟
 ZqULinux联盟
10

  如果按下回车, gdb 将再执行一次 list 命令, 给出下列输出:  ZqULinux联盟
 ZqULinux联盟
11 my_print (char *string) ZqULinux联盟
 ZqULinux联盟
12 { ZqULinux联盟
 ZqULinux联盟
13 printf ("The string is %sn", string); ZqULinux联盟
 ZqULinux联盟
14 } ZqULinux联盟
 ZqULinux联盟
15 ZqULinux联盟
 ZqULinux联盟
16 my_print2 (char *string) ZqULinux联盟
 ZqULinux联盟
17 { ZqULinux联盟
 ZqULinux联盟
18 char *string2; ZqULinux联盟
 ZqULinux联盟
19 int size, i; ZqULinux联盟
 ZqULinux联盟
20

  再按一次回车将列出 greeting 程序的剩余部分: 

21 size = strlen (string); ZqULinux联盟
 ZqULinux联盟
22 string2 = (char *) malloc (size + 1); ZqULinux联盟
 ZqULinux联盟
23 for (i = 0; i < size; i++) ZqULinux联盟
 ZqULinux联盟
24 string2[size - i] = string[i]; ZqULinux联盟
 ZqULinux联盟
25 string2[size+1] = `%content%'; ZqULinux联盟
 ZqULinux联盟
26 printf ("The string printed backward is %sn", string2); ZqULinux联盟
 ZqULinux联盟
27 }

  根据列出的源程序, 你能看到要设断点的地方在第24行, 在 gdb 命令行提示符下键入如下命令设置断点: 

  (gdb) break 24

  gdb 将作出如下的响应: 

  Breakpoint 1 at 0x139: file greeting.c, line 24

  (gdb)

  现在再键入 run 命令, 将产生如下的输出:  ZqULinux联盟
 ZqULinux联盟
Starting program: /root/greeting ZqULinux联盟
 ZqULinux联盟
The string is hello there ZqULinux联盟
Breakpoint 1, my_print2 (string = 0xbfffdc4 "hello there") at greeting. Linux联盟收集整理 ,转贴请标明原始链接,如有任何疑问欢迎来本站Linux论坛讨论
分页:1 [2] 3 4
评论】【加入收藏夹】【 】【打印】【关闭
※ 相关链接
无相关信息