1. MemoryLeakDetector內(nèi)存泄漏監(jiān)控工具

        聯(lián)合創(chuàng)作 · 2023-09-27 08:27

        MemoryLeakDetector 是字節(jié)跳動(dòng)西瓜視頻基礎(chǔ)技術(shù)團(tuán)隊(duì)開發(fā)的一款 native 內(nèi)存泄漏監(jiān)控工具,具有接入簡(jiǎn)單、監(jiān)控范圍廣、性能優(yōu)良、 穩(wěn)定性好的特點(diǎn)。廣泛用于字節(jié)跳動(dòng)旗下各大 App 的 native 內(nèi)存泄漏治理,收益顯著。

        快速開始

        步驟1:將 JitPack 存儲(chǔ)庫(kù)添加到構(gòu)建文件

        allprojects {
            repositories {
                maven { url 'https://jitpack.io' }
            }
        }

        步驟2:添加依賴項(xiàng)

        dependencies {
            implementation 'com.github.bytedance:memory-leak-detector:0.1.8'
        }

        步驟3:添加用于簡(jiǎn)單使用的代碼(使用廣播控件不需要此步驟)

        // 監(jiān)控指定的so
        Raphael.start(
            Raphael.MAP64_MODE|Raphael.ALLOC_MODE|0x0F0000|1024,
            "/storage/emulated/0/raphael", // need sdcard permission
            ".*libxxx\\\\\\\\.so$"
        );
        // 監(jiān)控整個(gè)進(jìn)程
        Raphael.start(
            Raphael.MAP64_MODE|Raphael.ALLOC_MODE|0x0F0000|1024,
            "/storage/emulated/0/raphael", // need sdcard permission
            null
        );
        ## 通過(guò)本地廣播監(jiān)控指定的so
        ## 0x0CF0400=Raphael.MAP64_MODE|Raphael.ALLOC_MODE|0x0F0000|1024
        adb shell am broadcast -a com.bytedance.raphael.ACTION_START -f 0x01000000 --es configs 0xCF0400 --es regex ".*libXXX\\\\\\\\.so$"
        ## 監(jiān)控整個(gè)進(jìn)程(RaphaelReceiver 組件所在的進(jìn)程)
        ## 0x0CF0400=Raphael.MAP64_MODE|Raphael.ALLOC_MODE|0x0F0000|1024
        adb shell am broadcast -a com.bytedance.raphael.ACTION_START -f 0x01000000 --es configs 0xCF0400

        步驟4: 打印結(jié)果

        // 代碼控制
        Raphael.print();
        ## 本地廣播
        adb shell am broadcast -a com.bytedance.raphael.ACTION_PRINT -f 0x01000000

        步驟5:分析

        ## 聚合 report,該文件在 print/stop 之后生成,需要手動(dòng) pull 出來(lái)
        ## 用到離線符號(hào)符號(hào)化功能的,需將raphael.py里的addr2line改為自己本地的NDK路徑
        ##   -r: 日志路徑, 必需,手機(jī)端生成的report文件
        ##   -o: 輸出文件名,非必需,默認(rèn)為 leak-doubts.txt
        ##   -s: 符號(hào)表目錄,非必需,有符號(hào)化需求時(shí)可傳,符號(hào)表文件需跟so同名,如:libXXX.so,多個(gè)文件需放在同一目錄下兒
        python3 library/src/main/python/raphael.py -r report -o leak-doubts.txt -s ./symbol/
        
        ## 數(shù)據(jù)格式說(shuō)明
        ##  201,852,591	totals // 單指raphael攔截到的未釋放的虛擬內(nèi)存總和
        ##  118,212,424	libandroid_runtime.so
        ##   28,822,002	libhwui.so
        ##   24,145,920	libstagefright.so
        ##   15,679,488	libv8.cr.so
        ##    9,566,192	libc++_shared.so
        ##       25,536	libsqlite.so
        ##       12,288	libv8_libbase.cr.so
        ##    5,388,741	extras // raphael.py里預(yù)設(shè)了一些通用配置,可以通過(guò)修改規(guī)則進(jìn)一步識(shí)別分組到extras里的數(shù)據(jù)
        ##
        ##
        ## bdb11000, 70828032, 66 => bdb11000是report里此堆棧第一次分配出的內(nèi)存地址,70828032是report里此堆棧的內(nèi)存總和,66是report里此堆棧的總次數(shù)
        ## 0x000656cf /system/lib/libc.so (pthread_create + 246)
        ## 0x0037c129 /system/lib/libart.so (art::Thread::CreateNativeThread(_JNIEnv*, _jobject*, unsigned int, bool) + 448)
        ## 0x00112137 /system/framework/arm/boot.oat (java.lang.Thread.nativeCreate + 142)
        ## 分析 maps
        ##  -m: maps文件路徑,必需
        python3 library/src/main/python/mmap.py -m maps

        步驟6:停止監(jiān)控

        // 代碼控制
        Raphael.stop();
         
        ## 廣播控制
        adb shell am broadcast -a com.bytedance.raphael.ACTION_STOP -f 0x01000000

         

        瀏覽 60
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        編輯 分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        編輯 分享
        舉報(bào)
          
          

            1. www骚 | 丝袜美女被操 | 一道本不卡视频 | 我与一位67老妇的性往事 | 色色色色色色色色色网 |