`
强强爱妍妍
  • 浏览: 26307 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

一次内存分配检查的经过

阅读更多
头说,我们的程序占用内存太高了. 某同事说发现了一个500M的内存分配. 曰:
我只是使用strace工具跟踪了一下大内存分配mmap系统调用.
一个超大的内存,系统会使用mmap实现页面映射.
man strace

我想知道是在哪里申请的这片内存.
于是我做了几个事情:
1 在分配内存的函数处增加printf输出
2 gdb调试,用条件断点

看上去都很简单,一一说来.
1 在分配内存的函数处增加printf输出
事实上,分配内存的函数声明在公共头文件,实现确是在另一个动态库中. 改不到那个动态库的代码,囧.
于是用了一个看上去很诡异的办法.
原本是
void* func1( size_t ulSize);

改成
#define func1(ulSize) func1_hack(ulSize);
void* func1_hack( size_t ulSize);

用宏替换. 然后在一个cpp里面 把实现藏在这里, 加上了printf输出
#ifdef func1
#undef func1
#endif
extern void* func1( size_t ulSize);
void* func1_hack( size_t ulSize);
{
    printf("func1 %u bytes\n", ulSize);
    return func1(ulSize);
}
#define func1(ulSize) func1_hack(ulSize);
因为宏的优先级比函数高啊,这样能用
额外需要修改的是, 代码中有使用func1函数地址的需要修改. 把函数地址指向func1_hack就ok了.

编译,验证一下. 看见打屏输出很愉快.

2 gdb调试,用条件断点
首先gdb xxx  这里xxx是我的程序
然后break func1_hack
然后info break看一下刚才的断点的编号. 假定是1
最后condition 1 ulSize>1000000 这个意思是在func1_hack中,当参数ulSize的大小大于1000000时触发断点.

下面是很愉快的启动程序run
循环查看断点出的堆栈然后恢复执行bt, c
分享到:
评论

相关推荐

    内存管理内存管理内存管理

    接下来,我将一次一个部分地对该清单进行解释。 在大部分操作系统中,内存分配由以下两个简单的函数来处理: void *malloc(long numbytes):该函数负责分配 numbytes 大小的内存,并返回指向第一个字节的指针。 ...

    游戏画面就弹出内存不能为read修复工具

    作为应用程序,在每一次申请内存后都应该检查返回值是否为0,如果是,则意味着出现了故障,应该采取一些措施挽救,这就增强了程序的“健壮性”。若应用程序没有检查这个错误,它就会按照“思维惯性”认为这个值是给...

    操作系统(内存管理)

    接下来,我将一次一个部分地对该清单进行解释。 在大部分操作系统中,内存分配由以下两个简单的函数来处理: void *malloc(long numbytes):该函数负责分配 numbytes 大小的内存,并返回指向第一个字节的指针。 ...

    0x00000000内存不能为read修复工具

    作为应用程序,在每一次申请内存后都应该检查返回值是否为 0,如果是,则意味着出现了故障,应该采 取一些措施挽救,这就增强了程序的“健壮性”。 若应用程序没有检查这个错误,它就会按照“思维惯性”认为这个值是...

    vld(Visual Leak Detector 内存泄露检测工具 源码)

     Visual Leak Detector要记录每一次的内存分配,而它是如何监视内存分配的呢?Windows提供了分配钩子(allocation hooks)来监视调试堆内存的分配。它是一个用户定义的回调函数,在每次从调试堆分配内存之前被调用。...

    操作系统,作业调度,进程调度,存储管理的实验

     每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的 PCB,以便进行检查。重复以上过程,直到所要进程都完成为止。实验二 作业调度 一、实验目的:用高级语言编写和调试一个或多个作业调度的模拟...

    操作系统实验 操作系统实验报告 文件管理 进程管理等

    每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的 PCB,以便进行检查。 重复以上过程,直到所要进程都完成为止。 三、实验主要仪器设备和材料 硬件环境:IBM-PC或兼容机 软件环境:C语言编程环境 ...

    C++第一次大作业

    第一次作业 这个作业将让你去练习建立一些简单的类和使用C++的基本功能,包括:封装,引用,动态内存开辟, 简单构造函数和析构函数和const。 下面给的程序片段未经过编译或调试. 做出合理的错误修正是你任务的一部分。...

    forth-memory-management:定义一个项目数组,然后从该数组分配和取消分配

    第四内存管理 定义一个项目数组,然后从该数组分配和取消分配项目。 将专用堆栈与一组项目配对。 项目的数量和大小可以在实例创建时进行配置。... 没有进行检查以避免避免无效地址被释放,或者有效地址被两次释放。

    浅谈数据库系统优化.docx

    CPU在处理数据的时候,先从内存中读取数据,如果内存够大,则数据一次调入内存的数据量就较大,可以有效减少磁盘访问次数,内存的分配是在软件系统运行的时候进行配置的,所以其调整和优化应该安排在检查数据库文件...

    电脑蓝屏对照码

    ◇解决方案:如果是在安装了某个新硬件后出新的, 可以先移除该硬件, 并通过网上列表检查它是否与Windows 2K/XP兼容, 接着启动电脑, 如果蓝屏还是出现, 请使用"最后一次正确配置"来启动Windows, 如果这样还是失败, ...

    LITO-1.3.0_2H3C模拟器

    display version 查看版本信息,最近一次重新启动的时间 display enviroment 设备温度 display device 单板运行状态 display power 查看电源状况 display fan 查看风扇状况 display cpu-usage 查看cpu最近5S、1m、5m...

    WIN XP蓝屏代码大全

    ◇解决方案:如果是在安装了某个新硬件后出新的, 可以先移除该硬件, 并通过网上列表检查它是否与Windows 2K/XP兼容, 接着启动电脑, 如果蓝屏还是出现, 请使用"最后一次正确配置"来启动Windows, 如果这样还是失败, ...

    服务器运行报告模板(1).doc

    "加电启动 " " 正常 不正常 " "行状况检查 " " " " "检查系统内存利用 "通过windows操作系统"任 "检测三次,每次5分" 正常 不正常 " "率 "务管理器" "钟,记录大约平均 " " " " "的利用率 " " "检查系统CPU利用率...

    计算机毕业设计 - JAVA002打飞机游戏设计(程序+说明+论文),保证可靠运行

    Java吸收了C++面向对象的概念,将数据封装于类中,实现了程序的简洁性和便于维护性,使程序代码可以只需一次编译就可反复利用。 4. 分布式 Java建立在TCP/IP网络平台上,提供了用HTTP和FTP协议传送和接收信息的...

    c语言c++项目源代码_c语言对自己电脑系统测试.rar

    2. **内存测试**:检查内存分配、读写速度和稳定性,确保系统的内存管理达到最佳状态。 3. **磁盘性能测试**:评估硬盘或固态硬盘的读写速度、I/O性能和文件系统效率。 4. **网络性能测试**:测量网络连接的速度和...

    Windows服务器巡检报告.docx

    认可用量:分配给程序和操作系统的内存,由于虚拟内存的存在,"峰值"可以超过最大物理内存, "总数"值则与"页面文件使用记录"图表中显示的值相同。 物理内存:计算机上安装的总物理内存,也称RAM,"可用"表示可供使用的...

    c/c++ 学习总结 初学者必备

    然而,对齐的内存访问仅需要一次访问。 14、 static有什么用途?(请至少说明两种) 答: (1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。 (2) 在模块内(但在函数体外),一个被声明为静态...

    《你必须知道的495个C语言问题》

    1.25 函数只定义了一次,调用了一次,但编译器提示非法重声明了。 14 *1.26 main的正确定义是什么?void main正确吗? 15 1.27 我的编译器总在报函数原型不匹配的错误,可我觉得没什么问题。这是为什么? 15 ...

    《计算机操作系统》期末复习指导

    执行一次P操作意味着请求分配一个单位资源,因此S的值减1;当S时,表示已经没有可用资源,请求者必须等待别的进程释放该类资源,它才能运行下去。而执行一个V操作意味着释放一个单位资源,因此S的值加1;若S 0,表示...

Global site tag (gtag.js) - Google Analytics