【Linux C调试笔记】Linux系统下借助mcheck实现c/c++程序的堆内存异常检查

本文介绍了Linux系统下利用mcheck函数进行C/C++程序堆内存一致性检测,包括mcheck和mprobe的使用,并讨论了多线程环境下内存异常的挑战及解决方案。
摘要由CSDN通过智能技术生成
        C/C++编程中,内存管理(这里特指堆内存管理)一直是个让大家如履薄冰的topic,尤其是由成千上万行代码构成的模块中,由于堆内存被越界改写而导致程序崩溃的情况非常普遍。最让人头大的是,程序崩溃的地方往往不是"案发地"(一般情况是,堆内存越界很长时间后,程序才会表现出异常行为),因此,此类问题通常很难定位,在多线程程序中,情况会更糟。
        那么,有什么方法可以让程序在堆内存越界时就立即core掉以便及时保留现场呢?
        办法嘛,是有的。这正是本篇笔记要介绍的内存调试方法—利用mcheck实现堆内存一致性状态检测
         注意: 本文介绍的方法不能检测内存泄露,若需要,请用valgrind进行检测。虽然mcheck.h中定义的mtrace/muntrace也可以实现(参见 这里 ),但在检测Memory Leak方面,valgrind才是主流工具。

1. mcheck函数
        mcheck是一个定义在mcheck.h(典型路径:/usr/include/mcheck.h)中的GNU扩展函数,用于实现堆内存的一致性检测,其原型为:

    /* Activate a standard collection of debugging hooks.  This must be called before 'malloc' is ever called.  
       ABORTFUNC is called with an error code when an inconsistency is detected.  
       If ABORTFUNC is null, the standard function prints on stderr and then calls 'abort'.  
    */
    int mcheck (void (*__abortfunc) (enum mcheck_status));
        由原型可见,mcheck函数的参数是一个自定义的函数指针,当mcheck检测到堆内存异常时,通过该指针调用abortfunc函数,同时传入一个mcheck_status类型的参数,在该abortfunc中,程序员可以打印一些有助于定位 问题的数据,比如mcheck_status的具体值,等等。
        返回值表明mcheck()调用是否成功:0表示成功,非0表示调用失败。
        虽然原型简单,但使用时需要注意以下几点:
        1)mcheck必须在显式或隐式调用malloc或realloc或new之前被调用,即要保证mcheck调用之前,进程没有申请过堆内存。若mcheck在malloc调用后才调用,则其返回值为非0。这种情形下,mc
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux 内存泄漏排查的方法有很多种,这里介绍一些常用的方法: 1. 使用 Valgrind 工具:Valgrind 是一个强大的开源工具集,可以用来检测内存泄漏、越界访问、使用未初始化的内存等问题。使用 Valgrind 工具可以非常方便地发现内存泄漏问题,具体使用方法如下: ```bash valgrind --leak-check=full ./your_program ``` 这条命令会在运行你的程序时启动 Valgrind 工具,并检查程序中的内存泄漏问题。Valgrind 工具会输出详细的检查结果,包括内存泄漏的位置、大小等信息。 2. 使用 GNU glibc 内存泄漏检测:GNU glibc 是 Linux 系统中常用的 C/C++ 库,它提供了一些内存泄漏检测的函数。具体使用方法如下: ```c++ #include <mcheck.h> int main(int argc, char* argv[]) { mtrace(); // your code here muntrace(); return 0; } ``` 这段代码会在程序启动时调用 `mtrace()` 函数,启用内存泄漏检测功能。在程序结束时,调用 `muntrace()` 函数来关闭检测功能。通过这种方法,可以在程序运行时检查内存泄漏问题,并输出相应的检测结果。 3. 手动检查代码:手动检查代码是一种比较耗时、费力的方法,但是可以帮助程序员深入了解程序的内部实现。具体方法是,在程序中添加日志输出或者调试信息,记录每个内存分配和释放的位置、大小等信息,然后分析这些信息来确定是否存在内存泄漏问题。 需要注意的是,内存泄漏只是 Linux 内存管理中的一个问题,还有很多其他问题也需要注意,比如内存越界访问、使用未初始化的内存等问题。因此,在开发程序时,应该注意遵循良好的编程习惯,确保程序的健壮性和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值