《深入分析GCC 》——2.2 GNU gdb调试工具-阿里云开发者社区

开发者社区> 华章计算机> 正文

《深入分析GCC 》——2.2 GNU gdb调试工具

简介:
+关注继续查看

本节书摘来自华章出版社《深入分析GCC 》一书中的第2章,第2.2节,作者 王亚刚 ,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

2.2 GNU gdb调试工具

调试工具是代码分析中至关重要的工具之一。在使用vim+ctags查看代码时,经常会遇到难以理解的部分,此时,可以借助调试工具,对代码的运行过程进行跟踪,通过跟踪运行过程以及关键数据的变化,可以从程序执行的过程中理解源代码的功能。
调试工具有很多种,最常用的是GNU gdb工具。下面通过一个例子,介绍如何使用gdb,这些调试命令几乎就是笔者调试程序的所有命令,简单且实用。关于完整的gdb的使用,请参与GNU gdb文档,或者使用man gdb进行在线查询。
本例主要使用gdb来跟踪GCC的运行过程,因此,需要事先编译GCC源代码(编译时需要使用-g选项),生成可执行的编译程序cc1,下面利用gdb对cc1程序的运行进行跟踪。
首先,可以在程序入口处设置断点(Break Point):

[GCC@localhost paag-gcc]$ gdb host-i686-pc-linux-gnu/gcc/cc1
GNU gdb (GDB) Red Hat Enterprise Linux (7.2-75.el6)
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i686-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/GCC/paag-gcc/host-i686-pc-linux-gnu/gcc/cc1...done.
(gdb) b main            ? 设置执行断点
Breakpoint 1 at 0x80c253d: file ../.././gcc/main.c, line 35.
(gdb) info break        ? 查看断点设置情况
Num     Type           Disp Enb Address    What
1       breakpoint     keep y   0x080c253d in main at ../.././gcc/main.c:35
(gdb)
执行程序,gdb执行到断点处会自动停止,返回交互界面。
(gdb) run            ? 运行程序
Starting program: /home/GCC/paag-gcc/host-i686-pc-linux-gnu/gcc/cc1 
Breakpoint 1, main (argc=1, argv=0xbffff434) at ../.././gcc/main.c:35
35      return toplev_main (argc, (const char **) argv);
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.149.el6.i686 gmp-4.3.1-7.el6_2.2.i686 mpfr-2.4.1-6.el6.i686

单步跟踪程序的执行,step命令和next命令均可以进行单步跟踪,二者的主要区别在于step在单步执行函数代码时,会进入被调用的函数,而next则会将函数调用看作“单步”,一次执行完一个函数的调用。对于其他代码,step和next命令的功能基本相同。
此时可以看到,使用run命令执行程序后,程序执行到前面定义的断点处暂停执行。
如果此时需要查看toplev_main函数的执行细节,应该使用step命令进入该函数。
(gdb) step ? 单步跟踪
toplev_main (argc=1, argv=0xbffff434) at ../.././gcc/toplev.c:2212
对于程序执行过程中,需要查看某些变量的值,可以使用print命令。

(gdb) print argc        ? 打印变量值
$1 = 1
(gdb) print argv[0]    ? 打印变量值
$2 = 0xbffff5b5 "/home/GCC/paag-gcc/host-i686-pc-linux-gnu/gcc/cc1"

查看变量的值可以使用print命令,如果在每一条指令后都需要查看某些变量的值,使用print显得有些烦琐,可以使用display命令,设置显示的变量。

(gdb) disp argc        ? 设置变量查看
1: argc = 1
(gdb) next            ? 单步执行
2215      general_init (argv[0]);
1: argc = 1
(gdb) next
2219      decode_options (argc, argv);
1: argc = 1
(gdb) next
2221      init_local_tick ();
1: argc = 1

可以看出,每执行一步,变量argc的值都会输出显示。
当需要连续执行程序时,可以使用continue命令,程序则恢复运行,直到下一个断点处再次暂停运行。
通常,在执行到某个断点处时,当需要了解当前函数的调用情况时,可以使用bt命令(backtrace)。
(gdb) bt ? 显示函数调用的堆栈

0 toplev_main (argc=1, argv=0xbffff434) at ../.././gcc/toplev.c:2212

1 main (argc=1, argv=0xbffff434) at ../.././gcc/main.c:35

可以看出当前执行的函数为toplev_main函数,其调用者为函数main,并且这两个函数所在的文件及位置信息也在bt的输出中给出。bt命令的输出可以很详细地展示当前函数的调用关系,对于理解程序的执行流程非常有帮助。
另外,gdb在输入命令时,如果输入命令的开始部分可以完全确定一个命令时,则可以简写该命令,例如,一般用户经常将命令run简写为r,step命令简写为s,next命令简写为n,continue命令简写为c等,如果用户没有输入命令,直接按回车键,则gdb默认会执行上一次输入的命令。例如在单步跟踪时,如果输入了命令next,后续单步跟踪则可以只需要按[Enter]键就可以了。这些规律,读者可以在使用过程中不断总结,提高调试效率。
另外,还有其他众多的调试工具,这些工具大都对gdb程序进行了封装,例如cgdb,可以提供一些方便地实现源代码查看等其他很有特色的功能,其官网地址为http://cgdb.sourceforge.net/。可以通过以下代码进行cgdb程序的安装。

[root@localhost ~]# wget -c http://prdownloads.sourceforge.net/cgdb/cgdb-0.6.6.tar.gz?download
[root@localhost cgdb-0.6.6]# tar xzvf cgdb-0.6.6.tar.gz
[root@localhost cgdb-0.6.6]# cd cgdb
[root@localhost cgdb-0.6.6]# yum install readline*
[root@localhost cgdb-0.6.6]# ./configure
[root@localhost cgdb-0.6.6]# make; make install
例如,可以使用cgdb对cc1进行调试。
[GCC@localhost gcc-4.4.0]$ cgdb ~/paag-gcc/host-i686-pc-linux-gnu/gcc/cc1

界面如图2-3所示,可以看到cgdb中能够很方便地查看源代码。关于cgdb的使用请查阅相关文档,不再赘述。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
[Linux 性能检测工具]IOSTAT
IOSTAT NAME:          Iostat, 报告CPU的统计,和 I/O的统计。 语法: iostat  [ -c ] [ -d ] [ -N ] [ -n ] [ -h ] [ -k | -m ] [ -t] [ -V ] [ -x ] [ -y ] [ -z ] [ -j { ID | LABEL  |  PATH  |UUID  | .
492 0
使用下载工具
今天是玩 SUSE 10的第 二 天装的 软件如下:    suse 10体验版     Eclipse 3.
614 0
[开源] 分享导出博客园文章成本地 Markdown 文件存储的工具
此文主要分享了如何将自己博客园的文章自动导出到 Markdown 文档进行存储,以便在本地进行归档管理,程序中也对文章的分类、tag、代码块以及文章中的图片进行了保存处理,以便上传到自己的图。 整理后的 Markdown 可以在本地整理成册或者发布到自己的个人博客上,比如我使用 Markdown 书写的 个人博客 。
822 0
[Linux 性能检测工具]FREE
FREE NAME free显示系统可用内存和已使用内存 语法 free [-b | -k | -m] [-o] [-s delay ] [-t] [-l] [-V] 描述 free显示了总可用和被用的物理内存和 swap 内存,也包括内核使用的 buffer ,shared ...
451 0
怎么设置阿里云服务器安全组?阿里云安全组规则详细解说
阿里云服务器安全组设置规则分享,阿里云服务器安全组如何放行端口设置教程
6362 0
Linux 常用性能工具简介.
一、wget 文件下载 使用wget下载单个文件:wget URL 下载并以不同的文件名保存:wget -O wordpress.zip URL wget限速下载:wget --limit-rate=300k URL 使用wget断点续传:wget -c URL 使用wget后台下载:wg...
1059 0
表格存储命令行工具CLT( cli python)
由于之前使用驻云科技的Cli,遇到较多的问题,关键是版本也没有及时更新,使用起来比较吃力。所以我这边利用业余的写了一个表格存储的命令工具,提供给大家使用。
2002 0
linux服务器性能检测工具nmon使用
今天介绍一款linux系统服务器性能检测的工具-nmon及nmon_analyser (生成性能报告的免费工具),亲测可用。 一.介绍 nmon 工具可以帮助在一个屏幕上显示所有重要的性能优化信息,并动态地对其进行更新。
860 0
[Linux 性能检测工具]VMSTAT
VMSTAT NAME:          Vmstat: 报告虚拟内存统计 语法 :        vmstat [-a] [-n] [-t] [-S unit] [delay [ count]]        vmstat [-s] [-n] [-S unit]       ...
709 0
10059
文章
0
问答
来源圈子
更多
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载