最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

 Linux下進(jìn)行 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ù)。

另一個是通過運(yùn)行修改后的程序,生成特殊的 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); //關(guān)閉內(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

運(yùn)行程序,終端輸入:./main.out 命令。當(dāng)前目錄下就會生成 memory_leak.log 文件。

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

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

如下所示:

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

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

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

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

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

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

下來進(jìn)行具體的操作,操作如下:

(1)關(guān)閉 ASLR 功能:

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

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

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

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

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

如下所示:

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

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

總結(jié)

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

相關(guān)文章

  • linux操作系統(tǒng)原理 linux系統(tǒng)基礎(chǔ)教程

    linux操作系統(tǒng)原理 linux系統(tǒng)基礎(chǔ)教程

    很多對linux操作系統(tǒng)有興趣的朋友想有一個深入的學(xué)習(xí),本篇文章給大家詳細(xì)講解了linux操作系統(tǒng)的原理,希望能夠?qū)δ阌兴鶐椭?/div> 2018-01-01
  • linux守護(hù)進(jìn)程服務(wù)daemon、nohup、systemd的區(qū)別

    linux守護(hù)進(jìn)程服務(wù)daemon、nohup、systemd的區(qū)別

    守護(hù)進(jìn)程(Daemon)是指在后臺運(yùn)行的進(jìn)程,不與用戶直接交互,且在系統(tǒng)啟動時自動運(yùn)行,nohup是一個命令行實用程序,用于在用戶注銷后繼續(xù)運(yùn)行命令,?Systemd?用于管理和啟動服務(wù),支持復(fù)雜的依賴管理和自動啟動
    2025-03-03
  • 在linux下玩轉(zhuǎn)帶有超時時間的connect函數(shù)

    在linux下玩轉(zhuǎn)帶有超時時間的connect函數(shù)

    今天小編就為大家分享一篇關(guān)于在linux下玩轉(zhuǎn)帶有超時時間的connect函數(shù),小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • linux c下log輸出代碼模板示例代碼

    linux c下log輸出代碼模板示例代碼

    這篇文章主要給大家介紹了關(guān)于在linux c下log輸出代碼模板的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-12-12
  • 搭建linux服務(wù)器詳細(xì)教程

    搭建linux服務(wù)器詳細(xì)教程

    這篇文章主要介紹了搭建linux服務(wù)器詳細(xì)教程,主要包括linux服務(wù)器的部署、配置和搭建步驟,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-09-09
  • Linux systemctl命令用法及使用說明

    Linux systemctl命令用法及使用說明

    systemctl是Linux中用于管理系統(tǒng)服務(wù)的工具,提供了啟動、停止、重啟和查看服務(wù)狀態(tài)等功能,通過systemctl命令,用戶可以方便地管理各種服務(wù)
    2026-03-03
  • 在Bash腳本中創(chuàng)建和使用數(shù)組方法總結(jié)

    在Bash腳本中創(chuàng)建和使用數(shù)組方法總結(jié)

    在本篇文章里小編給大家整理了關(guān)于在Bash腳本中創(chuàng)建和使用數(shù)組方法和相關(guān)知識點(diǎn),需要的朋友們在學(xué)習(xí)下。
    2019-03-03
  • CentOS7連接XShell與網(wǎng)絡(luò)配置的方法

    CentOS7連接XShell與網(wǎng)絡(luò)配置的方法

    這篇文章主要介紹了如何使用CentOS7連接XShell與網(wǎng)絡(luò)配置的方法,可以更好的幫助大家工作和學(xué)習(xí),感興趣的小伙伴可以了解下
    2020-05-05
  • linux centos7離線安裝telnet包全過程

    linux centos7離線安裝telnet包全過程

    文章詳細(xì)介紹了在CentOS 7系統(tǒng)上離線安裝Telnet及其相關(guān)服務(wù)的步驟,包括下載RPM包、檢測安裝情況、卸載現(xiàn)有包、按正確順序安裝新的包、配置服務(wù)、重啟服務(wù)以及測試安裝是否成功
    2026-03-03
  • Linux中如何查詢運(yùn)行文件的全路徑的方法

    Linux中如何查詢運(yùn)行文件的全路徑的方法

    這篇文章主要介紹了Linux中如何查詢運(yùn)行文件的全路徑的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-03-03

最新評論

庆城县| 六枝特区| 平江县| 花垣县| 澎湖县| 托克托县| 日喀则市| 花垣县| 应用必备| 玛纳斯县| 乐业县| 绥中县| 屏南县| 阿克苏市| 横峰县| 天镇县| 丽水市| 沿河| 汉川市| 遵义县| 内乡县| 丘北县| 金山区| 永胜县| 东方市| 尤溪县| 信丰县| 茶陵县| 高州市| 黔西县| 巴塘县| 邵东县| 嘉黎县| 苍南县| 祁东县| 曲麻莱县| 岳普湖县| 巫溪县| 永济市| 融水| 曲阜市|