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

Linux下關于mtrace工具排查內(nèi)存泄露的問題

 更新時間:2023年09月04日 09:09:52   作者:凌肖戰(zhàn)  
這篇文章主要介紹了Linux下關于mtrace工具排查內(nèi)存泄露的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

mtrace工具排查內(nèi)存泄露

內(nèi)存泄露為申請了堆內(nèi)存,但沒有釋放,即未還給操作系統(tǒng)。長此以往,系統(tǒng)的可分配內(nèi)存越來越少,造成系統(tǒng)內(nèi)存的浪費,導致程序運行速度減慢甚至系統(tǒng)崩潰等嚴重后果。

 Linux下進行 C/C++ 開發(fā),常常會動態(tài)分配一些堆內(nèi)存。那就可能會存在"內(nèi)存泄露"的問題。

如果 Linux下做 C/C++ 開發(fā)時,出現(xiàn)內(nèi)存泄漏了,我們該如何去定位呢?

常用的定位工具:

mtrace 工具 與 valgrind工具 ,這兩個都是典型的內(nèi)存泄漏分析工具。

1. mtrace 工具使用思路

在我們的調(diào)用內(nèi)存分配和釋放的函數(shù)中裝載 “鉤子(hook)” 函數(shù),通過 “鉤子” 函數(shù)打印的 log 日志,對日志文件的分析來幫助我們分析對內(nèi)存的使用是否存在問題。

對該工具的使用包括兩部分內(nèi)容:一個是要修改源碼,裝載 hook 函數(shù)。

另一個是通過運行修改后的程序,生成特殊的 log 文件。

然后利用  mtrace工具分析日志,判斷是否存在內(nèi)存泄露以及定位可能發(fā)生內(nèi)存泄露的代碼位置。

2. mtrace 工具使用說明

接下來用一段代碼說明一下, mtrace 工具如何定位 "內(nèi)存泄露" 。

在使用之前,需要修改我們的源碼,用來跟蹤內(nèi)存分配和釋放,其中需要使用兩個函數(shù):

#include <mcheck.h>
void mtrace(void);   //開啟內(nèi)存分配跟蹤  
void muntrace(void); //關閉內(nèi)存分配跟蹤

將上述函數(shù)接口加入待檢測的代碼中,代碼如下:

#include <stdlib.h>
#include <stdio.h>
#include <mcheck.h>
int main(int argc, char **argv)
{
    setenv("MALLOC_TRACE", "memery_leak.log", 1);
    mtrace();
    char *p1 = (char*)malloc(16);
    char* p2 = (char*)malloc(20);
    free(p1);
    p1 = NULL;
    muntrace();
    return 0;
}

編譯代碼,終端輸入命令:gcc -g main.c -o main.out

運行程序,終端輸入:./main.out 命令。當前目錄下就會生成 memory_leak.log 文件。

定位問題,終端輸入:mtrace main.out memory_leak.log 命令后,并沒有定位到 C 源碼的具體行數(shù),如下所示:

下面使用 地址轉(zhuǎn)化工具 addr2line 工具分析一下,上面地址是對應到哪一行 C 代碼行。

如下所示:

可以看出,能夠猜到可能是后面的地址不對。導致 addr2line 工具轉(zhuǎn)換失敗。

網(wǎng)上百度到,可能的原因如下:

1. 關閉 Linux 系統(tǒng)的 ASLR 功能。

ASLR 功能全稱為 Address Space Layout Randomization,地址空間布局隨機化。

它將進程的某些內(nèi)存空間地址進行隨機化來增大入侵者預測目的地址的難度,從而降低進程被成功入侵的風險。

2. 編譯源碼時,加上 "-no-pie" 選項。

下來進行具體的操作,操作如下:

(1)關閉 ASLR 功能:

輸入命令:cat /proc/sys/kernel/randomize_va_space ,查看 Linux 系統(tǒng)的 ASLR 值是 2,說明默認 ASLR 功能是開啟的。

設置 ASLR 的值:輸入命令 : echo 0 > /proc/sys/kernel/randomize_va_space

(2)加入 "-no-pie" 選項后重新編譯程序。輸入命令: gcc -g -no-pie main.c -o main.out

(3)然后運行程序,終端輸入命令: ./main.out

(4)使用 mtrace 工具查看 新生成的 memory_leak.log 文件。

如下所示:

可以看到,定位到了 C 代碼中的具體行。

到此,mtrace 工具定位到 C 代碼的具體的 11 行代碼存在內(nèi)存泄露 。

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • linux下NFS配置教程詳解

    linux下NFS配置教程詳解

    這篇文章主要為大家詳細介紹了linux下NFS配置教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • linux下使用cmake編譯安裝mysql的詳細教程

    linux下使用cmake編譯安裝mysql的詳細教程

    這篇文章主要介紹了linux下使用cmake編譯安裝mysql的詳細教程,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-10-10
  • ubuntu下安裝程序的三種方法總結(jié)(推薦)

    ubuntu下安裝程序的三種方法總結(jié)(推薦)

    下面小編就為大家?guī)硪黄猽buntu下安裝程序的三種方法總結(jié)(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12
  • ubuntu16.04自動設置行號的步驟詳解

    ubuntu16.04自動設置行號的步驟詳解

    這篇文章主要介紹了ubuntu16.04自動設置行號的步驟,文中給大家提到了Ubuntu vi設置行號的方法,感興趣的朋友跟隨腳本之家小編一起看看吧
    2018-08-08
  • CentOS7系統(tǒng)增加swap的操作方法實例

    CentOS7系統(tǒng)增加swap的操作方法實例

    這篇文章主要給大家介紹了關于CentOS7系統(tǒng)增加swap的操作方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者使用CentOS7系統(tǒng)具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-10-10
  • Vim 強制保存只讀類型文件的方法

    Vim 強制保存只讀類型文件的方法

    你是否會和我一樣經(jīng)常碰到這樣的情景:在VIM中編輯了一個系統(tǒng)配置文件,當需要保存時才發(fā)現(xiàn)當前的用戶對該文件沒有寫入的權限。這個時候就需要強制保存只讀類型文件的方法了,這篇文章就介紹了Vim強制保存只讀類型文件的方法,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-01-01
  • Linux啟動過程分析和常見錯誤匯總

    Linux啟動過程分析和常見錯誤匯總

    這篇文章介紹了Linux系統(tǒng)的引導過程、系統(tǒng)初始化進程及文件、MBR扇區(qū)故障處理、GRUB引導故障處理、服務控制及優(yōu)化啟動過程等內(nèi)容
    2025-04-04
  • 在Windows的Apache服務器上配置對PHP和CGI的支持

    在Windows的Apache服務器上配置對PHP和CGI的支持

    這篇文章主要介紹了在Windows的Apache服務器上配置對PHP和CGI的支持,其中CGI腳本文中演示的為Perl示例,需要的朋友可以參考下
    2015-07-07
  • Apache?Log4j2?遠程代碼執(zhí)行漏洞分析+檢測+防護(最新推薦)

    Apache?Log4j2?遠程代碼執(zhí)行漏洞分析+檢測+防護(最新推薦)

    Apache?Log4j2是一款開源的Java日志框架,被廣泛地應用在中間件、開發(fā)框架與Web應用中,用來記錄日志信息,這篇文章主要介紹了Apache?Log4j2?遠程代碼執(zhí)行漏洞分析+檢測+防護(最新推薦),需要的朋友可以參考下
    2024-07-07
  • Ubuntu 14.04下Django和MySQL環(huán)境部署全過程

    Ubuntu 14.04下Django和MySQL環(huán)境部署全過程

    這篇文章主要介紹了Ubuntu 14.04下Django和MySQL環(huán)境部署全過程,文中通過一步步的安裝步驟介紹的很詳細,相信對大家具有一定的參考借鑒價值,有需要的朋友們下面來一起來看看吧。
    2017-02-02

最新評論