`
强强爱妍妍
  • 浏览: 27165 次
  • 性别: 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
分享到:
评论

相关推荐

    操作系统内存分配算法

    下一次调用该算法时,将从停止的位置开始搜索,而不是从头开始搜索。 Next Fit算法的过程是:算法读取每个文件写入内存的位置,将下一个可用内存块分配给后续进程。当一个进程被执行存储在内存中时,会检查前一个...

    操作系统内存静态分配

    1. **初始化内存池**:在程序启动时,分配一块连续的内存区域作为内存池,例如通过`new`操作符一次性分配一大块内存。 2. **分配内存块**:当需要分配内存时,从内存池中找到一个未使用的块并标记为已使用。这可以...

    内存分配检测的软件源码

    3. **集合与数组**:VB中的集合类和数组在分配内存时会一次性分配所需空间,如果预估不准确,可能导致内存浪费。理解数组和集合的内存开销,以及如何优化它们的大小和增长策略,对于内存效率至关重要。 4. **内存...

    易语言分配可用内存空间

    5. **错误处理**:在执行内存分配命令时,应检查返回值是否为0,因为0通常表示分配失败。例如: ```易语言 .整数型 内存指针 = 分配内存(100) .逻辑型 成功 = (内存指针 ≠ 0) 如果 不成功 .字符串型 错误信息 ...

    内存泄漏检查类

    内存泄漏是指程序在申请内存后,无法释放已申请的内存空间,一次小的内存泄漏可能影响不大,但随着时间推移,大量内存泄漏会导致系统资源耗尽,影响程序的稳定性和性能。 C++标准库并没有提供内置的内存泄漏检测...

    VC内存泄露检查 VC内存泄露检查 VC内存泄露检查

    内存泄露是指程序在申请内存后,无法释放已申请的内存空间,一次小的内存泄露可能不明显,但如果长时间运行或频繁发生,累积的内存占用会显著增加,导致系统性能下降。 2. **VC++中的动态内存分配** 在VC++中,...

    动态分配内存 实现数组,子字符串查找

    1. 总是检查`malloc()`、`calloc()`和`realloc()`的返回值,确保内存分配成功。 2. 使用`free()`及时释放不再使用的内存,防止内存泄漏。 3. 避免内存碎片,合理规划内存分配策略,如使用内存池。 4. 谨慎使用`...

    内存分配程序

    - 第一次显示时,可以看到字符串 "ABCDEFGH1234567" 的十六进制值。 - 释放内存后再次显示,内存中的值变为特定的值(如 `DD`),这表明该内存已经被操作系统标记为可用。 #### 五、注意事项 - 在实际开发中,应...

    检查内存泄露 检查内存泄露

    首先,检查内存泄露的一个常见方法是在程序的关键部分使用`CMemoryState`类,这是MFC库提供的一个工具,用于跟踪内存分配和释放的状态。`CMemoryState`提供了几个关键成员函数,包括: 1. **Checkpoint()**:这个...

    VC编程中有关内存泄露检查方法

    在Debug版本的C++程序中,内存分配函数被重载以支持内存泄露的检测。当申请内存时,系统会分配一块比实际请求更大的内存块,包括四部分:HeapInformation、两个缓冲区以及User memory block。HeapInformation存储...

    C 动态内存分配研究

    其中,内存分配是实现程序功能的基础之一。根据给定的内容,我们可以深入探讨C++中的内存分配方式。 1. **静态存储区分配**:这种内存分配是在编译阶段完成的,一旦程序启动后,这部分内存便一直存在,直至程序结束...

    AIX进程内存分配与回收策略及应用开发建议.docx

    这是因为虽然释放了16MB的内存,但系统将其保留在进程自身的空间块树中,因此下一次8MB的分配实际上是直接从进程已有的16MB空闲块中获取的。 - **继续递减**:接下来释放8MB内存,分配4MB内存,并初始化后,地址...

    C++动态内存分配研究

    - 解决方案:确保每一块动态分配的内存只释放一次。可以使用RAII(Resource Acquisition Is Initialization)原则来帮助管理资源。 5. **释放了不属于自己的内存** - 错误行为:错误地释放了不属于当前程序的内存。 ...

    symbian内存检查工具HookLogger

    它通过挂钩系统级别的内存分配和释放函数,记录下每一次内存操作的详细信息,帮助开发者追踪和定位潜在的内存泄露问题。内存泄露是指程序在申请内存后,无法释放已不再使用的内存空间,久而久之会消耗掉系统可用内存...

    C语言动态内存分配函数解析

    `calloc`函数原型为`void *calloc(size_t num, size_t size)`,它一次性分配`num`个大小为`size`字节的连续空间。与`malloc`不同,`calloc`会将分配的内存初始化为零,这在创建数组或需要零初始化的数据结构时非常...

    windows 内存泄漏检查

    内存泄漏是指程序在申请内存后,无法释放已申请的内存空间,一次小的内存泄漏可能看似无害,但如果长时间运行或频繁发生,就可能导致严重的性能问题。 在C++中,`malloc`和`free`是基本的动态内存分配和释放函数,...

    09.内存分配与回收策略1

    那么就会继续检查老年代的最大可用连续空间是否大于晋升到老年代对象的平均大小,如果大于就会尝试进行一次Minor GC,尽管这个Minor GC是有风险的,如果小于或者HandlePromotionFaulure设置不允许冒险,那这时也要改...

    创建string对象过程的内存分配:

    ### 创建string对象过程的内存分配详解 #### 一、引言 在Java中,`String` 类是最常用的数据类型之一,用于表示不可变的字符序列。`String` 对象的创建涉及复杂的内存分配机制,特别是在Java虚拟机 (JVM) 的环境中...

    内存分配与释放 alloc,free

    `memTest`可能是一个包含测试代码的文件,用于验证内存分配和释放的正确性,例如使用`valgrind`或`gdb`等工具进行内存泄漏检查和调试。 综上所述,内存管理是软件开发中至关重要的部分,`alloc`和`free`是这个领域...

Global site tag (gtag.js) - Google Analytics