当前位置:首页 >> IT认证 >> 2014Linux操作系统期末考试

2014Linux操作系统期末考试


深圳大学考试答题纸
专业 计算机技术(春)

成绩
时间 2014 年 1 月

课程名称、代码 姓名 凌玉

142201013117 年级 学 号 20144312004

详细得分:
计分项 得分 评分人 一(5 分) 二(10 分) 三(70 分) 四(15 分) 迟交 (-5 分) 总分

第 1 页 共 18 页

Linux 下如何检查内存泄露

《Linux 操作系统》专题技术报告 作者:凌玉 指导老师:冯禹洪

第 2 页 共 18 页

目录
1. 2. 3. 3.1. 3.2. 3.3. 4. 引言 (5 分) .................................................................................................................................... 4 创建登录用户(10 分) .................................................................................................................... 4 内存泄露检查(70 分) .................................................................................................................... 5 使用常用命令分析确定内存泄露 (20 分) .............................................................................. 5 使用静态分析方法确定内存泄露 (20 分) .............................................................................. 9 使用动态分析方法确定内存泄露(30 分) .............................................................................. 12 分析使用给定函数是否存在内存泄露风险的问题(15 分) ...................................................... 14

第 3 页 共 18 页

1. 引言 (5 分)
内存泄露指的是应用程序在分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成 了内存的浪费。内存泄露会减少可用内存的数量从而降低计算机的性能。而且当所消耗的内存达到 系统的上限时,程序自己会崩溃,严重者甚至会导致系统挂起或崩溃。因此,掌握有效检查发现内 存泄露问题对构建稳定的软件有很重要的作用。 Linux 下检查内存泄露相关的技术将有 3 方面: (i) 使用相关命令,如 ps, top 等; (ii) 静态分析,如使用工具 mtrace; 以及 (iii) 动态分析,如使用 valgrind 或者 memwatch 等工具等。

2. 创建登录用户(10 分)
1) 创建用户 lingyu20144312004

2)

/etc/passw 截图

3)

/etc/shadow 截图

第 4 页 共 18 页

运行 whoami 截屏

3. 内存泄露检查(70 分)
3.1. 使用常用命令分析确定内存泄露 (20 分)
使用 ps 和 top 命令静态分析程序 1 和程序 2 分析程序 1

程序 1 greeting.c 源码分析:greeting 函数创建 nsize 个字符空间,如果字符个数小于 12 个则打印”out of memory” 并 返回,退出 greeting 函数,如果 nsize 不小于 12,则把 hello world 字符拷贝到 p 所指的新内存空间, 并释放 p 所指内存空间。 main 函数是一个死循环,不断地调用 greeting 函数

第 5 页 共 18 页

程序运动结果

运行 ps aux 命令

第 6 页 共 18 页

运行 top 命令 对多次运动 ps aux 命令后,收集到的运行时数据分析, greeting 进程(PID = 2685)是一个可中断 的正在运动的前台进程(SR+) ,分析 VSZ 列(虚拟内存大小)RSS 列(当前实例占用的内存) VSZ 和 RSS 列的值在不断地增长,一次比一次大,说明程序一直在申请内存空间,但一直没有释放 内存空间。此程序有内存泄露的嫌疑。 再运行 top 命令,查看 greeting 进程内存使用情况,如图中红框列,内存使用在不断地增加 根据这个结果,来分析源程序 Greeting 函数一开始就先申请 nsize 个字符空间, 然后再对 nsize 作判断, 如果小于 12 就打印并返回, 只有在 nsize 的值不小于 12 时才会执行 free 函数释放内存空间。 但 main 函数死循环调用 greeting 函 数,并且每次传入参数都是 11,永远都不会进入 free(p)代码行。随着时间的推移,此程序会申请 的内存越来越多,一直都不释放,所以可以肯定这程序是内存泄露的。

第 7 页 共 18 页

分析程序 2

程序 2

Ps aux 截图

第 8 页 共 18 页

Top 命令截图 从 ps/top 命令收集到的数据来看,每次收集到的内存使用数据都是一样的,所以程序 2 是没有内存 泄露的。

3.2. 使用静态分析方法确定内存泄露 (20 分)
使用 matrace 工具对源代码进行内存泄露分析和定位内存泄露的代码位置 1) 在 greeting_matrce.c 代码中嵌入: #include <mcheck.h> … mtrace(); /*要检查是否会有内存泄露的代码段*/ muntrace(); 2) 编译运行 $gcc –o greeting_matrce greeting_mtrace.c 3) $export MALLOC_TRACE=./log //用该环境变量来定义一个文件 log 用于输出

第 9 页 共 18 页

加入 mtrace 代码的程序 1

Mtrace 日志(mtrace greeting_mtrace t.log) 如上图所示,mtrace 检测区间在程序申请内存之前和内存释放之后,从代码分析,如果程序正确 使用内存的话,trace log 记录的应是申请与释放配对出现。查看 trace log, 如红框所示,每调用一 次 greeting 函数,都申请一次内存(0xb),但是没有释放内存,所示此程序是有内存泄露的 如果把程序 1 的 main 函数循环调用 greeting,改成只调用一次,并使用 mtrace 来分析,得到日志如 下图,从图中信息得知有内存没有释放,在源代码第 11 行申请了内存。因为传入 greeting 函数的参 数是 11, 小于 12, 所以在代码中打印了 “out of memory” 后就返回, 退出 greeting 函数, 使得 free(p) 语句没有执行,所以申请的内存没有释放。

第 10 页 共 18 页

程序 1 单次调用 分析程序 2

程序 2 源码

程序 2 mtrace log, 因日志中得知没有内存泄露

第 11 页 共 18 页

3.3. 使用动态分析方法确定内存泄露(30 分)
Valgrind 安装 Valgrind 官网下载最新版本源码,编码安装 http://valgrind.org/downloads/valgrind-3.10.1.tar.bz2 执行以下命令安装 valgrind a) 解压 tar xvf valgrind-3.10.1.tar.bz2 b) cd valgrind-3.10.1,并执行命令 ./configure c) 编译源码,make; d) 安装 vargrind , sudo make install e) 安装成功后,执行 valgrind –help 检查是否安装成功,如下图所示,安装成功。

1. 使用 valgrind 分析程序 1 是否内存泄漏 执行命令: valgrind --leak-check=yes your_progream parameter

Valgrind 运行程序 1

第 12 页 共 18 页

Valgrind 动态分析程序 1 从上图中 LEAK SUMMARY 中得知程序 1 是有内存泄露的,直接泄露了 530,343 字节,213 个 块。申请内存的代码行在 greeting 函数第 8 行。如下图

第 13 页 共 18 页

Valgrind 动态分析程序 2

程序 2

从上图的数据中可得知程序 2 所有申的堆内存都已释放

4. 分析使用给定函数是否存在内存泄露风险的问题(15 分)
使用 mtrace 静态分析法对程序段 InsertLinkList 进行内存泄漏风险分析 由于只给出部份代码,需要补全完整的代码才能运行分析,代码补全后如下 代码补全: #include <stdio.h> 第 14 页 共 18 页

#include <stdlib.h> #include <string.h> #include <mcheck.h> /** 定义结点 */ typedef struct LNode { int data; struct LNode *next; } LNode;

LNode * SearchLinkList(LNode *L, int i) { //L 为单链表头指针, e 为返回值 int j; LNode *p; p = L; j = 1; //p 指向第一个结点 while (p && j < i) { p = p->next; j++; } if (!p || j > i) return NULL ; //第 i 个元素不存在 return p; //返回第 i 个元素 } int InsertLinkList(LNode *L, int e, int i) { //在单链表第 i 个位置插入元素 e LNode *p, *s; p = SearchLinkList(L, i - 1); if (!p) { return -1; } s = (LNode*) malloc(sizeof(LNode)); memset(s, 0, sizeof(LNode)); s->data = e; s->next = p->next; p->next = s; return i; } LNode * CreateLinkList(int *r, int n) { int j; 第 15 页 共 18 页

LNode *L, *s; if (n <= 0) return NULL ; s = (LNode*) malloc(sizeof(LNode)); s->data = r[0]; s->next = NULL; L = s; //header pointer to the first element mtrace(); for(j = 2; j <= n; j++){ InsertLinkList(L, r[j-1], j); } muntrace(); return L; }

int main() { //定义单链表头指针 LNode *LinkList; int r[] = {1,2,3,4,5,6,7,8,9}; LinkList=CreateLinkList(r, 9); LNode *p; p = LinkList; while(p){ printf("%d ", p->data); p = p->next; } return 1; }

第 16 页 共 18 页

使用 mtrace 静态分析法对 InsertLinkList 函数分析

加入 mtrace 代码后,运行结果如上图所示,在代码第 39 行 申请的内存没有释放 查看 trace 日志如下图所

通过 mtrace 的日志,可以清楚知道 InsertLinkList 函数是有内存泄露的风险。 第 17 页 共 18 页

第 18 页 共 18 页


赞助商链接
更多相关文档:

2017第二学期Linux操作系统期末试卷

2017第二学期Linux操作系统期末试卷 - linux 操作系统期末试题答案 A 卷一、选择题 1-5 CBDCB 6-10BADBC 11-15CDBBA 16-20AACBD 21-2...

2014-2015-2Linux操作系统(A)答案

山东农业大学课程考试专用 2014 -2015 学年第 2 学期 《Linux 操作系统》A 卷参考答案一、 选择题(每题 1 分,共 20 分) 1~5 11~15 AADBD CBCBC 6~...

Linux操作系统期末试卷

Linux操作系统期末试卷_其它考试_资格考试/认证_教育专区。XXXX 学院 2013-2014 学年度第一学期 《Linux 系统与网络管理》期末考试试卷 ( 班级: ) 命题人: 班级...

2015Linux操作系统期末考试(1)

深圳大学期末考试试卷开/闭卷 开卷 1500890001/ 课程编号 1500890002 课程名称 命题人(签字) 题号 得分评卷人 A/B 卷 Linux 操作系统 学分 2.5 年八九十月日...

2014-2015-2Linux操作系统(A)

2014-2015-2Linux操作系统(A)_理学_高等教育_教育专区。山东农业大学课程考试专用 2014 - 2015 学年第 2 学期 《Linux 操作系统》试题(卷)A课程代码 BF002357...

Linux操作系统考试题库

Linux操作系统考试题库_IT认证_资格考试/认证_教育专区。一、选择题 1) 下列关于操作系统的叙述中,哪一条是不正确的?( A.操作系统管理计算机系统中的各种资源 ...

Linux操作系统期末复习

电信2012 级《Linux 操作系统期末复习提纲第 1 章 概述 操作系统的概念与...2014年执业医师考试指导 口腔执业医师实践技能复习资料 中医护理学基础重点 执业医师...

Linux操作系统考试题库

Linux操作系统考试题库_IT认证_资格考试/认证_教育专区。一、选择题 1) 下列关于...2014年全国注册造价工程师 建设工程造价管理重点整理 工程造价计价与控制考前提分...

Linux操作系统期末复习题

Linux 操作系统期末复习题 2010-7-11 整理 填空部分 填空部分 1. Linux 是在...休闲农庄项目可行性研究报告 2014年建筑幕墙建筑装饰行业分析报告©...

Linux期末考试复习试题

Linux期末考试复习试题 - Linux 期末考试复习题 一、选择题 1.下列关于 Linux 说法中,不正确的是( B ) A. Linux 操作系统具有虚拟内存的能力 B. Linux ...

更多相关标签:
网站地图

文档资料共享网 nexoncn.com copyright ©right 2010-2020。
文档资料共享网内容来自网络,如有侵犯请联系客服。email:zhit325@126.com