【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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值