C语言学习网

如何全面分析Fedora GCC程序

发表于:2022-08-13 作者:安全数据网编辑
编辑最后更新 2022年08月13日,本篇文章给大家分享的是有关如何全面分析Fedora GCC程序,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。在向大家详细介绍Fedora

本篇文章给大家分享的是有关如何全面分析Fedora GCC程序,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

在向大家详细介绍Fedora GCC之前,首先让大家了解下Linux,然后全面介绍Fedora GCC。

1.命令:[root@localhost ~]# gcc -g http2.c -o http2
得到调试信息:
[root@localhost ~]# gcc -g http2.c -o http2
http2.c: 在函数 'main' 中:
http2.c:51: 警告:隐式声明与内建函数 'bzero' 不兼容
http2.c:61: 警告:传递参数 2 (属于 'bind')时在不兼容的指针类型间转换
http2.c:81: 警告:传递参数 2 (属于 'accept')时在不兼容的指针类型间转换
http2.c: 在函数 'ParseHttpRequest' 中:
http2.c:153: 警告:隐式声明与内建函数 'strstr' 不兼容
http2.c:153: 警告:隐式声明与内建函数 'strlen' 不兼容
http2.c:158: 警告:隐式声明与内建函数 'memset' 不兼容
http2.c:159: 警告:隐式声明与内建函数 'memcpy' 不兼容
http2.c: 在函数 'do_proxy' 中:
http2.c:315: 警告:隐式声明与内建函数 'strcat' 不兼容
http2.c:316: 警告:隐式声明与内建函数 'strlen' 不兼容
[root@localhost ~]# ./http2正在监听[root@localhost ~]#

2.为了更快速地发现错误所在,可以使用GDB进行跟踪调试,方法如下:
[root@localhost ~]# gdb http2
GNU gdb Red Hat Linux (6.5-15.fc6rh)
Copyright (C) 2006 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-gnu"...Using host libthread_db library "/lib/libthread_db.so.1".

当GDB提示符出现的时候,表明GDB已经做好准备进行调试了,现在可以通过run命令让程序开始在GDB的监控下运行:Starting program: /root/http2正在监听Program exited normally.

3.下面为搜到的信息,尚未实验当GDB提示符出现的时候,表明GDB已经做好准备进行调试了,现在可以通过run命令让程序开始在GDB的监控下运行:
Starting program: /home/xiaowp/thesis/gcc/code/crash
Input an integer:10
Program received signal SIGSEGV, Segmentation fault.
0x4008576b in _IO_vfscanf_internal () from /lib/libc.so.6

仔细分析一下GDB给出的输出结果不难看出,程序是由于段错误而导致异常中止的,说明内存操作出了问题,具体发生问题的地方是在调用
_IO_vfscanf_internal ( )的时候。为了得到更加有价值的信息,可以使用GDB提供的回溯跟踪命令backtrace,执行结果
如下:
#0 0x4008576b in _IO_vfscanf_internal () from /lib/libc.so.6
#1 0xbffff0c0 in ?? ()
#2 0x4008e0ba in scanf () from /lib/libc.so.6
#3 0x08048393 in main () at crash.c:11
#4 0x40042917 in __libc_start_main () from /lib/libc.so.6

跳过输出结果中的前面三行,从输出结果的第四行中不难看出,GDB已经将错误定位到crash.c中的第11行了。现在仔细检查一下:
frame 3 #3 0x08048393 in main () at crash.c:11 11 scanf("%d", input);

使用GDB提供的frame命令可以定位到发生错误的代码段,该命令后面跟着的数值可以在backtrace命令输出结果中的行首找到。现在已经发现错
误所在了,应该将scanf("%d", input);改为scanf("%d", &input);完成后就可以退出GDB了,命令如下:

GDB的功能远远不止如此,它还可以单步跟踪程序、检查内存变量和设置断点等。调试时可能会需要用到编译器产生的中间结果,这时可以使用-save-temps选项,让Fedora GCC将预处理代码、汇编代码和目标代码都作为文件保存起来。如果想检查生成的代码是否能够通过手工调整的办法来提高执行性能,在编译过程中生成的中间文件将会很有帮助,具体情况如下:

# Fedora GCC -save-temps foo.c -o foo
# ls foo*
foo foo.c foo.i foo.s

Fedora GCC 支持的其它调试选项还包括-p和-pg,它们会将剖析(Profiling)信息加入到最终生成的二进制代码中。剖析信息对于找出程序的性能瓶颈很有帮助,是协助Linux Fedora GCC程序员开发出高性能程序的有力工具。在编译时加入-p选项会在生成的代码中加入通用剖析工具(Prof)能够识别的统计信息,而- pg选项则生成只有GNU剖析工具(Gprof)才能识别的统计信息。

提醒一点,虽然Fedora GCC允许在优化的同时加入调试符号信息,但优化后的代码对于调试本身而言将是一个很大的挑战。代码在经过优化之后,在源程序中声明和使用的变量很可能不再使用,控制流也可能会突然跳转到意外的地方,循环语句有可能因为循环展开而变得到处都有,所有这些对调试来讲都将是一场噩梦。建议在调试的时候***不使用任何优化选项,只有当程序在最终发行的时候才考虑对其进行优化。

以上就是如何全面分析Fedora GCC程序,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注行业资讯频道。

0