欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++內(nèi)存泄漏的檢測與實現(xiàn)詳細流程

 更新時間:2022年08月08日 14:47:11   作者:三木ぃ  
內(nèi)存泄漏(memory leak) 是指由于疏忽或錯誤造成了程序未能釋放掉不再使用的內(nèi)存的情況。內(nèi)存泄漏并非指內(nèi)存在物理上的消失,而是應用程序分配某段內(nèi)存后,由于設計錯誤,失去了對該段內(nèi)存的控制,因而造成了內(nèi)存的浪費

內(nèi)存泄漏

malloc/new 調(diào)用在堆上分配的內(nèi)存卻沒有相應的free/delete;

帶來的問題

會逐漸吃掉虛擬內(nèi)存

難點

如何判斷是否內(nèi)存泄漏

  1. (最毛糙)可以使用+1和-1,即當調(diào)用分配內(nèi)存變量+1,釋放內(nèi)存時候,變量-1,進程退出輸出的count=0,進程內(nèi)存沒有泄漏,否則有泄漏;
  2. 線上版本,做一個配置文件,設置是否存在內(nèi)存泄漏的一個標志位,平時肉眼觀察不出的內(nèi)存泄漏,在長時間的運行積攢下,肯定會逐漸變大,然后當可以觀察出有內(nèi)存泄漏了,就將標志位置位1;進行熱更新,釋放相應的泄漏處理(如 hook);

如何判斷在代碼中哪里泄漏

  • 當已經(jīng)懷疑有泄漏:使用簡單的mtrace直接檢查代碼也是一個簡單的操作。
  • hook實現(xiàn)泄漏判斷與追蹤:實現(xiàn)本地檢查或者在線的全局實時檢查(線上版本,寫一個conf配置文件,熱更新是否使用hook)
  • 宏定義實現(xiàn) hook: 實現(xiàn)單個文件檢查
  • 調(diào)用malloc的時候,自己構(gòu)建一個內(nèi)存池(慢慢合成),每次釋放的時候,從池中刪除。最終在池中的就是泄露的;

hook實現(xiàn)泄漏判斷與追蹤(malloc和free重載)

#define _GNU_SOURCE
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <dlfcn.h>
#define MEM_CONTENT_LEN 128
typedef void *(*malloc_t)(size_t size);
malloc_t malloc_f = NULL;
typedef void(*free_t)(void *P);
free_t free_f;
int enable_malloc_hook = 1;
int enable_free_hook = 1;
void *malloc(size_t size){
    if (enable_malloc_hook)
    {
        enable_malloc_hook = 0;         //防止遞歸;不這么設計會發(fā)生循環(huán)調(diào)用  ,printf也會調(diào)用malloc  直接打印觀察是否泄漏
        void *p = malloc_f(size);   
        // printf("malloc\n");              
        /*
        參數(shù):
           0:當前函數(shù)在哪調(diào)用:  返回==f()-->malloc
           1: a()-->f()-->malloc
           2: a()-->b()-->f()-->malloc        
        */
        void *caller = __builtin_return_address(0); 
        char buff[MEM_CONTENT_LEN] = {0}; //具體是否泄漏,何處泄漏,打印到文件中
        sprintf(buff,"./mem/%p.mem",p);
        FILE *fp = fopen(buff,"w");
        fprintf(fp,"[+%p]malloc --> addr: %p,size: %lu\n",caller,p,size);
        fflush(fp);
        enable_malloc_hook = 1;
        return p;
    }
    else{
        return malloc_f(size);
    }    
}
void free(void *p){
    // printf("free\n");
    if (enable_free_hook)
    {
        enable_free_hook = 0;
        char buff[MEM_CONTENT_LEN] = {0}; //具體是否泄漏,何處泄漏
        sprintf(buff,"./mem/%p.mem",p);
        if (unlink(buff) <0)
        {
            printf("double free:%p\n",p);
        }
        enable_free_hook= 1;
    }else{
        free_f(p);
    }    
}
static int init_hook(){
    malloc_f = dlsym(RTLD_NEXT,"malloc");
    free_f = dlsym(RTLD_NEXT,"free");
}
int main(){
    init_hook(); // hook調(diào)用
    void *p = malloc(10);
    free(p);
    void *p1 = malloc(20);
    void *p2 = malloc(30);
    free(p1);
}

gcc -o hook hook.c -ldl  #編譯
mkdir  mem  #存儲文件
./hook   #進行檢查,若mem中生成了文件,則說明出了內(nèi)存泄漏的問題
cat mem/0x55a3d3e666c0.mem  # 具體泄露:[+0x55a3d381a59e]malloc --> addr: 0x55a3d3e666c0,size: 30

addr2line -fe ./hook -a 0x55a3d381a59e#檢查具體泄露的出現(xiàn)代碼地址

宏定義實現(xiàn)hook

#define _GNU_SOURCE
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <dlfcn.h>
#define MEM_CONTENT_LEN 128
void *malloc_hook(size_t size,const char* file, int line){
    void *p = malloc(size);
    char buff[MEM_CONTENT_LEN] = {0}; //具體是否泄漏,何處泄漏,打印到文件中
    sprintf(buff,"./mem/%p.mem",p);
    FILE *fp = fopen(buff,"w");
    fprintf(fp,"[+%s:%d]malloc --> addr: %p,size: %lu\n",file,line,p,size);
    fflush(fp);
    return p;
}
void* free_hook(void *p,const char* file,int line)
{
    char buff[MEM_CONTENT_LEN] = {0}; //具體是否泄漏,何處泄漏
    sprintf(buff,"./mem/%p.mem",p);
    if (unlink(buff) <0)
    {
        printf("double free:%p\n",p);
    }
    free(p);
}
//如果宏定義放在函數(shù)實現(xiàn)前面,會出現(xiàn)循環(huán)調(diào)用
#define malloc(size)        malloc_hook(size,__FILE__,__LINE__)  
#define free(p)     free_hook(p,__FILE__,__LINE__)
int main(){
    void *p = malloc(10);
    free(p);
    void *p1 = malloc(20);
    void *p2 = malloc(30);
    free(p1);
}

其中[+hook_def.c:39]說明了文件中的多少行出了問題;

到此這篇關(guān)于C++內(nèi)存泄漏的檢測與實現(xiàn)詳細流程的文章就介紹到這了,更多相關(guān)C++內(nèi)存泄漏內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言代碼實現(xiàn)掃雷小游戲

    C語言代碼實現(xiàn)掃雷小游戲

    這篇文章主要為大家詳細介紹了C語言代碼實現(xiàn)掃雷小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • C語言詳解鏈式隊列與循環(huán)隊列的實現(xiàn)

    C語言詳解鏈式隊列與循環(huán)隊列的實現(xiàn)

    隊列(Queue)與棧一樣,是一種線性存儲結(jié)構(gòu),它具有如下特點:隊列中的數(shù)據(jù)元素遵循“先進先出”(First In First Out)的原則,簡稱FIFO結(jié)構(gòu)。在隊尾添加元素,在隊頭刪除元素,本篇來講解鏈式隊列與循環(huán)隊列的實現(xiàn)
    2022-04-04
  • 數(shù)組指針、指針數(shù)組以及二位數(shù)組的深入解析

    數(shù)組指針、指針數(shù)組以及二位數(shù)組的深入解析

    下面來講講多維數(shù)組與指針的關(guān)系。與普通數(shù)組一樣,使用多維數(shù)組時,實際上將其自動轉(zhuǎn)換為指向該數(shù)組第一個元素的指針
    2013-09-09
  • VC++中圖像處理類CBitmap的用法

    VC++中圖像處理類CBitmap的用法

    使用VC進行圖像處理的時候,CBitmap類為我們提供了豐富的位圖處理函數(shù),本文總結(jié)了該類的相關(guān)函數(shù)和常用使用方法,包括加載位圖,顯示位圖,析構(gòu)CBitmap資源以及在內(nèi)存中保存位圖等內(nèi)容。
    2015-11-11
  • C語言進階幾分鐘帶你理解大小端存儲模式

    C語言進階幾分鐘帶你理解大小端存儲模式

    這篇文章主要為大家介紹了C語言進階大小端模式的示例詳解,帶各位讀者朋友五分鐘腳踩大小端模式,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2022-02-02
  • C語言在頭文件中定義const變量詳解

    C語言在頭文件中定義const變量詳解

    這篇文章主要介紹了C語言在頭文件中定義const變量詳解的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • C++中友元類和嵌套類使用詳解

    C++中友元類和嵌套類使用詳解

    友元是一種允許非類成員函數(shù)訪問類的非公有成員的一種機制??梢园岩粋€函數(shù)指定為類的友元,也可以把整個類指定為另一個類的友元,所謂嵌套類,就是在類中聲明的類。如下代碼中,類Inner就是一個嵌套類,類Outer是外圍類
    2022-08-08
  • C++實現(xiàn)鏈表版本通訊錄

    C++實現(xiàn)鏈表版本通訊錄

    這篇文章主要為大家詳細介紹了C++實現(xiàn)鏈表版本通訊錄,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • Qt/C++編寫視頻監(jiān)控系統(tǒng)之自定義音柱顯示功能

    Qt/C++編寫視頻監(jiān)控系統(tǒng)之自定義音柱顯示功能

    通過音柱控件實時展示當前播放的聲音產(chǎn)生的振幅的大小,得益于音頻播放組件內(nèi)置了音頻振幅的計算,可以動態(tài)開啟和關(guān)閉,開啟后會對發(fā)送過來的要播放的聲音數(shù)據(jù),這篇文章主要介紹了Qt/C++編寫視頻監(jiān)控系統(tǒng)之自定義音柱顯示功能,需要的朋友可以參考下
    2024-01-01
  • C語言基礎(chǔ)隱式類型轉(zhuǎn)換與強制類型轉(zhuǎn)換示例解析

    C語言基礎(chǔ)隱式類型轉(zhuǎn)換與強制類型轉(zhuǎn)換示例解析

    最接地氣的有關(guān)類型轉(zhuǎn)換的介紹,此處對于類型轉(zhuǎn)換的相關(guān)知識點做一些簡要的介紹,作者實屬初學,難免文章中有內(nèi)容理解不到位或者有不當之處,還請朋友們不吝指正,希望大家多多給予支持
    2021-11-11

最新評論