linux下內存泄漏整理


了解到的工具有如下幾個

memleak工具 用起來更方便

valgrind(最強大)

mtrace(linux gnu自帶,但是只能檢測malloc和free)

debug_new(針對c++,重載operator new,placement new實現的),原理地址https://www.ibm.com/developerworks/cn/linux/l-mleak2/index.html

還有個命令malloc_stats(),可以在程序里或者gdb調用,可以查看堆內存的靜態統計,在gdb中使用call malloc_stats()

下面介紹下valgrind,內存泄漏用的是memcheck,非常強大,但非常重量級,如果程序本身消耗資源(線程較多或其他),可能不能正常或流暢的跑起來

使用valgrind --tool=memcheck --leak-check=full ./exe 即可,停止的時候會把可能泄露的地方列出來

另外可以使用gdb內加在valg,然后可以輸一些valg的命令功能更加強大

who_points_at這個可以查看一塊內存是屬於哪個指針的命令,那么就能找到申請的地方。這個功能我問了很多人都不知道,對於排查內存泄漏很有用

更詳細的文檔地址

https://stackoverflow.com/questions/12663283/dumping-contents-of-lost-memory-reported-by-valgrind

https://www.valgrind.org/docs/manual/mc-manual.html/manual-core-adv.html#manual-core-adv.gdbserver-commandhandling官方文檔,很全

2020-8-21日更新

pmap可以查看進程分配的內存地址

翻看gdb官網得知可以直接在gdb內看內存地址對應的符號

info symbol [Address]

但使用后發現好像只能查看bss段,css段內的符號(比如全局變量,函數地址等),不能查看堆上的符號

文檔地址https://visualgdb.com/gdbreference/commands/info_address

另外一個根據coredump查看內存泄露的方法,主要是用hexdump查看內存信息,獲取規律。原文地址

https://stackoverflow.com/questions/27598986/how-to-analyze-memory-leak-from-coredump

 

2020-08-28更新

更強大的工具addr2line

 Addr2line 可以將函數地址解析為函數名

dmesg這個命令,是用來顯示開機信息的。若一些程序出錯,也會記錄錯誤信息

性能分析工具有gperftools(需要編譯進代碼),gprof(需編譯)

perf(無須編譯),systemtap 最強

https://zhuanlan.zhihu.com/p/22572231

 

2020-09-05更新

內核提供的工具 Address Sanitizer,消耗性能比valgrind小很多


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM