- 浏览: 482551 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
alvin198761:
renzhengzhi 写道我参与过12306余票查询系统的开 ...
别给12306 辩解了 -
renzhengzhi:
我参与过12306余票查询系统的开发,用户请求被前面3层缓存拦 ...
别给12306 辩解了 -
renzhengzhi:
写的很好。
JAVA线程dump的分析 -
liyonghui160com:
说好的附件呢
分布式服务框架 Zookeeper -- 管理分布式环境中的数据 -
ghpaas:
orbeon作为xforms标准的实现,不论其设计器还是运行时 ...
XForms 1.1 中文翻译—第1章 关于XForms标准
在编写应用程序时进行动态内存分配是非常必要的。它可以在程序运行的过程中帮助分配所需的内存,而不是在进程启动的时候就进行分配。然而,有效地管理这些内存同样也是非常重要的。在大型的、复杂的应用程序中,内存泄漏是很常见的问题。当以前分配的一片内存不再需要使用或无法访问时,但是却并没有释放它,那么对于该进程来说,会因此导致总的可用内存的减少,这时就出现了内存泄漏。尽管优秀的编程实践可以确保最少的泄漏,但是根据经验,当使用大量的函数对相同的内存块进行处理时,很可能会出现内存泄漏。尤其是在碰到错误路径的情况下更是如此。 本文介绍了一种内存泄漏处理方法,并讨论了如何利用 AIX® 中附带的 MALLOCDEBUG 工具。 应用程序可以根据所碰到的具体情况,在其生命周期中的不同时刻释放一片内存。编程人员需要对应用程序进行合理的设计,以便它能够知道何时可以释放一块内存,并马上执行这个操作,而不是等待更长的时间。根据具体的控制流程,可以在代码中的不同地方进行内存的释放。有一点至关重要,那就是必须涉及到所有的控制流程,而不仅仅是最常执行的代码流程路径。 同时,在内存做好释放准备之前对其进行释放可能引起灾难性的错误。因此,要了解内存块在何处做好了释放的准备,必须全面地了解应用程序中的控制流程。 当出现下列症状时,表示可能出现了泄漏: 如果出现了一些内存泄漏的症状,那么最好使用内存监视工具进行分析。有许多第三方的工具,如 Zerofault 和 IBM Rational® Purify®,但本文将讨论 AIX 中附带的 MALLOCDEBUG 工具。 MALLOCDEBUG 是一种很易于使用的 malloc 子系统监视工具。通过使用两个环境变量 MALLOCDEBUG 和 MALLOCTYPE,您可以轻松地对特定的应用程序启用 malloc 子系统调试任务。您需要将这些变量导出到运行该应用程序的 Shell 中。在 AIX Version 5.3 中,错误报告将写入到 stderr。 MALLOCTYPE 变量用来确定应该使用何种 malloc 子系统,以及是否启用调试任务。下面的表 1 显示了 MALLOCTYPE 各种可能的取值。请参见参考资料部分,其中提供了“Developing and Porting C and C++ Applications on AIX”的链接。IBM 红皮书。 您应该清楚,MALLOCDEBUG 假定使用的是缺省分配器。 MALLOCDEBUG 变量可以包含下面表 2 的列表中的多个值,这些值之间以逗号分隔。 在这些选项中,使用 在这一部分中,您将看到一个示例和一些示例代码清单,用以说明如何使用 MALLOCDEBUG。下载部分中提供了这个示例的源代码。 MALLOCDEBUG 的输出格式对于用户来说并不是很友好。它只是为每个已分配且尚未释放的内存块打印出调用 malloc 的函数堆栈。它还返回了内存块的大小以及由 malloc 所返回的指针值。 为了使上面的输出更容易理解,我们编写了一个示例脚本。(请参见下载部分。请注意,这是一个适用于与该示例程序具有类似输出的示例脚本。)下面的清单 3 显示了在对上面这些堆栈运行了该脚本之后的输出。 调查工作应从最大的泄漏着手。上面的第一个堆栈显示出, 可以对报告中的每个堆栈进行类似的分析,并对其进行修复。如果在运行该程序之前将 当您的软件运行在客户的计算机上时,MALLOCDEBUG 是可供使用的 malloc 子系统监视工具之一。当用户在计算机上使用软件的过程中出现 malloc 错误时,需要用户提供 MALLOCDEBUG 日志,为了避免这种情况,在将应用程序提交给客户之前,使用 MALLOCDEBUG 对其进行测试是很有帮助的。我们希望本文能够为那些必须处理客户计算机中的内存泄漏问题的开发人员和服务工程师提供有用的简介。
errno
被设置为 ENOMEM
。ps
命令来查看)急剧增长。
表 1. MALLOCTYPE 变量
MALLOCTYPE=
内存分配器
IBM 红皮书“Developing and Porting C and C++ Applications on AIX”中的详细解释
3.1
3.1 内存分配器
4.2.1 节,3.1 内存分配器
NULL
缺省内存分配器
4.2.2 节,缺省内存分配器
buckets
具有 malloc 桶扩展的缺省内存分配器
4.2.3 节,具有 malloc 桶扩展的缺省内存分配器
debug
调试内存分配器
4.2.4 节,调试内存分配器
user:archive_name
用户定义的内存分配器
4.2.5 节,用户定义的内存分配器
表 2. MALLOCDEBUG 变量
MALLOCDEBUG=
简要解释
Align:n
n 是内存对齐的数值。关于更多的信息,请参见参考资料部分。
postfree_checking
postfree_checking 使得 MALLOCDEBUG 报告对已释放的内存进行访问的尝试,然后中止该程序。
validate_ptrs
如果向
free()
调用传递的指针并不是以前由 malloc 分配的,那么将会引发一个错误消息,而该程序将被中止。
override_signal_handling
当 MALLOCDEBUG 检测到内存错误,它会强迫该程序使用 SIGSEGV 或 SIGABRT 进行核心转储。设置
override_signal_handling
可以确保该程序终止并进行核心转储,即使应用程序已经对这些信号进行了处理。
allow_overreading
allow_overreading 将忽略读取越界。
report_allocations
report_allocations 将报告在应用程序退出时所有未释放的内存分配。
record_allocations
record_allocations 将报告所有的内存分配。
continue
继续报告错误,但它并不异常终止 (ABEND) 该程序。这是 AIX Version 5.3 中提供的一种非常有用的特性。
stack_depth:n
stack_depth:n 将错误堆栈报告到第 n 层,而不是缺省的第 6 层。
report_allocations
最为合适,因为它可以为您提供已检测到的应用程序中泄漏的列表。
清单 1. 将 MALLOCDEBUG 和 MALLOCTYPE 设置导出到 Shell
/home/user> export MALLOCTYPE=debug
/home/user> export MALLOCDEBUG=report_allocations
清单 2. 程序的输出
/home/user> ./stud 2>mal_dbg_stud
Student Name: Manish
Subjects # Maths English
Student Name: Vaarun
Subjects # Chemistry Physics
Student Name: Sandeep
Subjects # Biology Maths
......
......
......
......
Student Name: Govind
Subjects # Physics Biology
Student Name: Manish
Subjects # Maths English
Current allocation report:
Allocation #0: 0x2000EFE8
Allocation size: 0x14
Allocation traceback:
0xD0371F64 malloc
0xD0322194 init_malloc
0xD0323224 malloc
0x10000BE4 initialize_leaky
Allocation #1: 0x20010FF0
Allocation size: 0xA
Allocation traceback:
0xD0371F64 malloc
0x10000C08 initialize_leaky
0x10000DD4 main
0x100001B4 __start
Allocation #2: 0x20012FF0
Allocation size: 0xA
Allocation traceback:
0xD0371F64 malloc
0x10000C08 initialize_leaky
0x10000DD4 main
0x100001B4 __start
......
......
......
......
Allocation #17: 0x20030FF0
Allocation size: 0x10
Allocation traceback:
0xD0371F64 malloc
0x100008F4 getnode
0x10000B08 insert
0x10000DDC main
Allocation #18: 0x20032FF8
Allocation size: 0x8
Allocation traceback:
0xD0371F64 malloc
0x10000894 allocate_for_dbl_ptr
0x10000910 getnode
0x10000B08 insert
Allocation #19: 0x20034FE8
Allocation size: 0x14
Allocation traceback:
0xD0371F64 malloc
0x10000A5C allocate_name
0x10000B18 insert
0x10000DDC main
Allocation #22: 0x2003AFF0
Allocation size: 0x10
Allocation traceback:
0xD0371F64 malloc
0x100008F4 getnode
0x10000B3C insert
0x10000DDC main
......
......
......
......
清单 3. 使用脚本解析 MALLOCDEBUG 的输出
/home/user> ./format_mallocdebug_op.ksh
Usage : ./stack.ksh stackfile
/home/katiyar/DW> ./format_mallocdebug_op.ksh ./mal_dbg_stud |
tee ./mal_dbg_stud_formatted
Parsing output from debug malloc ...
Analyzed 50 stacks ...
main
insert
allocate_subjects
malloc
################################
220 bytes leaked in 22 Blocks
################################
main
insert
allocate_name
malloc
################################
220 bytes leaked in 11 Blocks
################################
__start
main
initialize_leaky
malloc
################################
190 bytes leaked in 16 Blocks
################################
main
insert
getnode
malloc
################################
176 bytes leaked in 11 Blocks
################################
insert
getnode
allocate_for_dbl_ptr
malloc
################################
88 bytes leaked in 11 Blocks
################################
initialize_leaky
malloc
init_malloc
malloc
################################
20 bytes leaked in 1 Blocks
################################
main
调用了 insert
,后者调用了 allocate_subjects
。而 allocate_subjects
通过调用 malloc
来分配内存块,并且这块内存一直没有释放。该脚本的输出显示,22 次独立的分配总共产生了 220 个字节的泄漏。这表示您应该查看代码,找出在 allocate_subjects
函数中分配 10 个字节的数据的位置,并检查是否释放了其所有的实例。通过对该程序的代码进行仔细的分析,您可以找到出现问题并且应该释放的内存块。FREE_BLOCKS=1
环境变量导出到了 Shell,那么对这个程序进行的修复将会立即生效。
清单 4. 释放了通过 malloc 分配的内存块之后的输出
/home/katiyar/DW> ./stud
Student Name: Manish
Subjects # Maths English
Student Name: Vaarun
Subjects # Chemistry Physics
Student Name: Sandeep
Subjects # Biology Maths
......
......
......
......
Student Name: Govind
Subjects # Physics Biology
Student Name: Manish
Subjects # Maths English
Current allocation report:
Total allocations: 0.
描述
名字
大小
下载方法
Sample program and parsing script for debug malloc
au-articles-progs.zip
4KB
HTTP
http://www.ibm.com/developerworks/cn/aix/library/au-mallocdebug.html
发表评论
-
Storix简介
2012-03-27 12:10 1061简介 Storix ... -
asa阿萨
2012-03-25 23:58 1阿迪撒旦撒旦 -
适配器布局
2010-10-28 11:23 969网络性能取决于所选的硬件,如机器中的适配器类型和适配器布局 ... -
工作负载管理诊断
2010-07-13 23:15 845工作负载管理仅指评估工作负载的每个组成部分的优先级。 ... -
与磁盘或内存相关的问题
2010-07-13 23:12 878与磁盘或内存相关的问题 正如大部分实内存可用来缓冲文 ... -
分析AIX上的native内存泄露
2010-07-01 14:59 1485Running native profiling on ... -
AIX性能——预处理器和编译器利用
2010-06-27 20:37 1064在指令重新整理中,有几个优化级别给予编译器以不同程度的自由 ... -
AXI性能——系统调整
2010-06-27 20:37 878在有效实现应用程序后,系统总体性能的进一步提高就成了系统调 ... -
AIX性能调整——当前的机器指令
2010-06-27 20:35 900如果未出现 TLB 或高速缓存未命中的情况,绝大多数机器指令都 ... -
可分派线程
2010-06-27 20:33 863当某个线程可分派但不在运行时,它不能完成任何有用的事情。更糟的 ... -
等待线程
2010-06-27 20:31 936无论何时只要执行的程序发出不能立刻满足的请求,例如同步 I ... -
AXI性能调整——中断处理程序
2010-06-27 20:30 1078通知操作系统发生了外部事件的机制是中断当前运行线程并将控制 ... -
AIX性能调整——可执行程序
2010-06-27 20:28 954当请求运行某个程序 ... -
AIX性能调整——硬件层次结构
2010-06-27 20:26 1017通常,从一个硬件级别移动到另一级别所需要的时间主要由较低级 ... -
AIX性能调整——程序执行模型
2010-06-27 20:21 921为了清楚地检查工作负载的性能特征,需要有一个动态而非静态的 ... -
AIX4.3 TL12安装指南
2010-06-18 11:01 1178Installation instructions Te ... -
系统工作负载
2010-05-16 22:40 820系统工作负载的完整准确的定义对于预测或理解它的性能是很关键 ... -
列出可用的软件产品(lslpp 命令)
2010-05-13 09:16 1178要显示关于系统上可用软件产品的信息,请使用 lslpp 命 ... -
列出可用的字体(font 命令)
2010-05-13 09:14 1187要显示可用于显示器的字体列表,请使用 lsfont 命令。 ... -
列出可用的显示设备(lsdisp 命令)
2010-05-13 09:14 803要列出系统上当前可用的显示设备,即提供显示设备标识名称、插 ...
相关推荐
在AIX V5.3版本中,有一套完整的命令行工具,这些工具对于系统管理员来说至关重要,用于日常的系统管理和维护工作。本篇文章将详细解析AIX V5.3中的命令,按照字母顺序逐一进行讲解。 1. **A系列**:包括如`awk`、`...
在AIX V5.3中,系统安装通常通过System Configuration Manager (SCM)进行,该工具支持网络安装、磁盘安装等多种方式。理解安装过程中的硬件需求、软件选择以及分区策略至关重要。同时,掌握如何升级现有系统至V5.3,...
《Tivoli Storage Manager for AIX V5.3 管理员指南》是一份详尽的文档,专为在AIX操作系统上管理和部署Tivoli Storage Manager (TSM) 的IT专业人员设计。这份指南涵盖了TSM V5.3版本的所有关键功能,包括但不限于...
标题中的"aix5.3 ssh安装包"指的是适用于AIX 5.3操作系统的Secure Shell (SSH)软件包。SSH是一种网络协议,用于安全地在不同计算机之间进行远程登录和其他命令行交互。AIX(Advanced Interactive eXecutive)是IBM...
文章的核心内容是构建一个简单的问卷调查应用程序,该应用展示了如何在Java中编写核心逻辑,并通过Servlet公开为Web服务。调查类的结构包含一个基础类用于处理问卷,以及一个用于存储问题数据的基类。通过继承这些...
在AIX V5.3系统管理(Test 222)认证指南中,启动过程是系统管理员必须掌握的核心知识点之一。良好的启动过程理解有助于解决系统启动时遇到的各种问题,无论是软件还是硬件方面的问题。为了更好地理解和处理这些故障,...
在IBM AIX Version 5.3操作系统中进行数据库操作,主要涉及的是Oracle数据库的管理和配置。以下是具体的步骤和相关的知识点: 1. **远程访问与系统界面**: 使用xmanager等远程桌面工具可以连接到运行AIX 5.3系统...
在AIX 5.3版本中,它提供了丰富的功能和强大的稳定性,适用于企业级应用和服务。这份"AIX原文官方文档(aix5.3)"是一个重要的参考资料,特别是对于系统管理员和运维人员来说,它详细介绍了AIX 5.3中的各种命令和...
在AIX 5.3中,设备管理通过一系列命令和服务实现,确保设备能够高效稳定地运行。 #### 系统管理概述 系统管理是指对计算机系统的整体监控和维护工作,包括用户管理、文件系统管理、进程管理等多个方面。AIX 5.3提供...
标签 "aix" 和 "sudo" 进一步明确了讨论的主题,即在AIX操作系统中使用 `sudo` 工具。 压缩包子文件的文件名 "sudo-1.6.9p23-2noldap.aix5.3.ppc.rpm" 提供了更多细节。这里,`sudo-1.6.9p23` 表示 `sudo` 的具体...
### AIX 5.3 升级到 7.1 的详细步骤与注意事项 #### 一、概述 本文档旨在为计划将 AIX 5.3 升级至 AIX 7.1 的用户提供一份全面的操作指南。由于 AIX 5.3 已于 2012 年 4 月停止支持,除非购买了扩展服务协议,因此...
AIX 5L V5.3 命令大全
AIX 5.3 HACMP详细配置是指在AIX 5.3操作系统上实施高可用性集群多处理(HACMP)的详细配置过程。该配置旨在提高企业应用和数据的可用性和可靠性,避免计算机系统故障导致的应用停止和数据丢失。 HACMP(High ...
描述中同样提到了"AIX_5.3_power64-latest.tar",这通常意味着这是用户或管理员为了在Power64架构上运行AIX 5.3系统而准备的软件集合。".tar"扩展名表示这是一个归档文件,通常用于将多个文件和目录打包成一个单一的...
《AIX 5L V5.3 命令参考大全》是一本极其全面的AIX操作系统命令手册,尤其适合AIX系统管理员和开发者使用。该资料以字母顺序排列,方便用户快速查找和理解各种AIX操作命令,是日常运维工作中的得力工具。 AIX...
AIX_5L_V5.3_命令参考大全,AIX_5L_V5.3_命令参考大全AIX_5L_V5.3_命令参考大全
在AIX 5.3操作系统中,磁盘管理和镜像是至关重要的任务,因为它们关系到系统的稳定性和数据的安全性。本文将对AIX 5.3的磁盘镜像和更换操作进行详细的总结。 首先,要查看AIX系统是从哪块物理硬盘启动的,可以使用...
AIX 5.3是IBM的一种高级UNIX操作系统,主要用于企业级服务器。对于系统管理员和IT专业人士来说,熟悉AIX的基本...在实际工作中,不断实践和探索这些命令的应用场景,将有助于提升在AIX系统上的工作效率和问题解决能力。
IBM AIX V5.3 系统管理的第二部分重点探讨了磁盘存储管理,这是AIX系统管理中至关重要的一个领域。在AIX环境中,磁盘管理涉及到卷组的概念、创建、管理和维护,这些都是日常运维和问题解决的核心内容。 首先,系统...