• LoliProfile Native内存分析工具


    LoliProfiler是一款针对Android程序开发设计的轻量开源Native内存分析工具。以XCode Instrument Allocations为目标,实现即插即用的Profile体验。

    通过PLT Hook内存分配和释放函数(malloccallocreallocmemalignfree),来发现内存泄漏等问题。

    LoliProfiler的日志文件与exe在同一目录,文件名为profiler.log。另外可使用logcat想得到更多日志信息。

    02-21 15:55:54.571 24683 24683 I Loli    : JNI_OnLoad
    02-21 15:55:54.572 24683 24683 I Loli    : mode: 2, build: framepointer, minRecSize: 0, blacklist: 0, hookLibs: libUE4,libgsdk,libitophttpdns,libturinggt,libtdmbeaconid,libCrashSight,libc++_shared,libhttpdns,libGVoice,libgrobot,libtersafe,libGPM,libHttpDnsPlugin,libMSDKCore,libtgpa,libTDataMaster,libCrashSightCore,libCrashSightPlugin,libAkReflect,libAkConvolutionReverb,libAkGuitarDistortion,libAkRoomVerb,libAkPeakLimiter,libAkDelay,libAkParametricEQ,
    02-21 15:55:54.572 24683 24683 I Loli    : loli start status 0
    02-21 15:55:54.575 24683 25051 I Loli    : libitophttpdns (/data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libitophttpdns.so) is loaded
    02-21 15:55:54.575 24683 25051 I Loli    : libUE4 (/data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libUE4.so) is loaded
    02-21 15:55:54.575 24683 25051 I Loli    : libCrashSight (/data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libCrashSight.so) is loaded
    02-21 15:55:54.576 24683 25051 I Loli    : libc++_shared (/data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libc++_shared.so) is loaded
    02-21 15:55:54.576 24683 25051 I Loli    : libhttpdns (/data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libhttpdns.so) is loaded
    02-21 15:55:54.576 24683 25051 I Loli    : libGVoice (/data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libGVoice.so) is loaded
    02-21 15:55:54.576 24683 25051 I Loli    : libtersafe (/data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libtersafe.so) is loaded
    02-21 15:55:54.576 24683 25051 I Loli    : libgrobot (/data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libgrobot.so) is loaded
    02-21 15:55:54.576 24683 25051 I Loli    : libGPM (/data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libGPM.so) is loaded
    02-21 15:55:54.576 24683 25051 I Loli    : libHttpDnsPlugin (/data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libHttpDnsPlugin.so) is loaded
    02-21 15:55:54.576 24683 25051 I Loli    : libMSDKCore (/data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libMSDKCore.so) is loaded
    02-21 15:55:54.576 24683 25051 I Loli    : libtgpa (/data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libtgpa.so) is loaded
    02-21 15:55:54.577 24683 25051 I Loli    : libCrashSightCore (/data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libCrashSightCore.so) is loaded
    02-21 15:55:54.577 24683 25051 I Loli    : libCrashSight (/data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libCrashSightCore.so) is loaded
    02-21 15:55:54.577 24683 25051 I Loli    : libCrashSightPlugin (/data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libCrashSightPlugin.so) is loaded
    02-21 15:55:54.577 24683 25051 I Loli    : libCrashSight (/data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libCrashSightPlugin.so) is loaded
    02-21 15:55:54.577 24683 25051 I Loli    : libTDataMaster (/data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libTDataMaster.so) is loaded
    02-21 15:55:54.577 24683 25051 I Loli    : libturinggt (/data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libturinggt.so) is loaded
    02-21 15:55:54.577 24683 25051 I Loli    : libtdmbeaconid (/data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libtdmbeaconid.so) is loaded
    02-21 15:55:54.595 24683 25051 I Loli    :  loaded in Android at 0x70e6e000
    02-21 15:55:54.595 24683 25051 E Loli    : failed to open 
    02-21 15:55:54.595 24683 25051 I Loli    : Error dlopen: 
    02-21 15:55:54.595 24683 25051 I Loli    :  loaded in Android at 0x70e6e000
    02-21 15:55:54.595 24683 25051 E Loli    : failed to open 
    02-21 15:55:54.595 24683 25051 I Loli    : Error dlopen: 
    02-21 15:55:54.599 24683 25051 I Loli    : /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libtdmbeaconid.so loaded in Android at 0x74c36c5000
    02-21 15:55:54.599 24683 25051 I Loli    :  loaded in Android at 0x70e6e000
    02-21 15:55:54.599 24683 25051 E Loli    : failed to open 
    02-21 15:55:54.599 24683 25051 I Loli    : Error dlopen: 
    02-21 15:55:54.599 24683 25051 I Loli    :  loaded in Android at 0x70e6e000
    02-21 15:55:54.599 24683 25051 E Loli    : failed to open 
    02-21 15:55:54.599 24683 25051 I Loli    : Error dlopen: 
    02-21 15:55:54.601 24683 25051 I Loli    : /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libUE4.so loaded in Android at 0x74afe80000
    02-21 15:55:54.615 24683 25051 I Loli    :  loaded in Android at 0x70e6e000
    02-21 15:55:54.615 24683 25051 E Loli    : failed to open 
    02-21 15:55:54.615 24683 25051 I Loli    : Error dlopen: 
    02-21 15:55:54.617 24683 25051 I Loli    : /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libCrashSightPlugin.so loaded in Android at 0x74c2d86000
    02-21 15:55:54.619 24683 25051 I Loli    : /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libc++_shared.so loaded in Android at 0x74be6c2000
    02-21 15:55:54.621 24683 25051 I Loli    : /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libCrashSightCore.so loaded in Android at 0x74c2640000
    02-21 15:55:54.623 24683 25051 I Loli    : /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libTDataMaster.so loaded in Android at 0x74c2e02000
    02-21 15:55:54.625 24683 25051 I Loli    : /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libtgpa.so loaded in Android at 0x74c1440000
    02-21 15:55:54.625 24683 25051 I Loli    :  loaded in Android at 0x70e6e000
    02-21 15:55:54.625 24683 25051 E Loli    : failed to open 
    02-21 15:55:54.625 24683 25051 I Loli    : Error dlopen: 
    02-21 15:55:54.627 24683 25051 I Loli    : /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libHttpDnsPlugin.so loaded in Android at 0x74c09c5000
    02-21 15:55:54.628 24683 25051 I Loli    : /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libGPM.so loaded in Android at 0x74c070c000
    02-21 15:55:54.630 24683 25051 I Loli    : /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libGVoice.so loaded in Android at 0x74be840000
    02-21 15:55:54.631 24683 25051 I Loli    : /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libMSDKCore.so loaded in Android at 0x74c0ac8000
    02-21 15:55:54.632 24683 25051 I Loli    : /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libhttpdns.so loaded in Android at 0x74be7d1000
    02-21 15:55:54.633 24683 25051 I Loli    : /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libitophttpdns.so loaded in Android at 0x6b6e062000
    02-21 15:55:54.633 24683 25051 I Loli    :  loaded in Android at 0x70e6e000
    02-21 15:55:54.633 24683 25051 E Loli    : failed to open 
    02-21 15:55:54.633 24683 25051 I Loli    : Error dlopen: 
    02-21 15:55:54.633 24683 25051 I Loli    : /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libCrashSight.so loaded in Android at 0x74be3cc000
    02-21 15:55:54.634 24683 25051 I Loli    : /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libtersafe.so loaded in Android at 0x74bff12000
    02-21 15:55:54.635 24683 25051 I Loli    : /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libgrobot.so loaded in Android at 0x74c0698000
    02-21 15:55:54.636 24683 25051 I Loli    : /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libturinggt.so loaded in Android at 0x74c3682000
    02-21 15:55:54.636 24683 25051 I Loli    :  loaded in Android at 0x70e6e000
    02-21 15:55:54.636 24683 25051 E Loli    : failed to open 
    02-21 15:55:54.636 24683 25051 I Loli    : Error dlopen: 
    02-21 15:55:54.636 24683 25051 I xhook   : libxhook 1.1.12 (aarch64)
    02-21 15:55:54.639 24683 25051 I xhook   : init OK: /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libitophttpdns.so (RELA ELF_HASH PLT:2712 DYN:13080 ANDROID:0)
    02-21 15:55:54.639 24683 25051 I xhook   : hooking malloc in /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libitophttpdns.so
    02-21 15:55:54.639 24683 25051 I xhook   : found malloc at symidx: 193 (ELF_HASH)
    02-21 15:55:54.639 24683 25051 I xhook   : found malloc at .rela.plt offset: 0x40d70
    02-21 15:55:54.639 24683 25051 I xhook   : XH_HK_OK 0x6b6e0a2d70: 0x75635b59ec -> 0x6b6cde6350 malloc /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libitophttpdns.so
    02-21 15:55:54.639 24683 25051 I xhook   : hooking free in /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libitophttpdns.so
    02-21 15:55:54.639 24683 25051 I xhook   : found free at symidx: 213 (ELF_HASH)
    02-21 15:55:54.639 24683 25051 I xhook   : found free at .rela.plt offset: 0x40dd0
    02-21 15:55:54.640 24683 25051 I xhook   : XH_HK_OK 0x6b6e0a2dd0: 0x75635b59a4 -> 0x6b6cdcc558 free /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libitophttpdns.so
    02-21 15:55:54.640 24683 25051 I xhook   : hooking calloc in /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libitophttpdns.so
    02-21 15:55:54.640 24683 25051 I xhook   : hooking memalign in /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libitophttpdns.so
    02-21 15:55:54.640 24683 25051 I xhook   : hooking aligned_alloc in /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libitophttpdns.so
    02-21 15:55:54.640 24683 25051 I xhook   : hooking posix_memalign in /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libitophttpdns.so
    02-21 15:55:54.640 24683 25051 I xhook   : hooking realloc in /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libitophttpdns.so
    02-21 15:55:54.640 24683 25051 I xhook   : found realloc at symidx: 19 (ELF_HASH)
    02-21 15:55:54.640 24683 25051 I xhook   : found realloc at .rela.plt offset: 0x40ab0
    02-21 15:55:54.641 24683 25051 I xhook   : XH_HK_OK 0x6b6e0a2ab0: 0x75635b5a64 -> 0x6b6cdea350 realloc /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libitophttpdns.so
    02-21 15:55:54.641 24683 25051 I xhook   : init OK: /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libUE4.so (RELA GNU_HASH PLT:19656 DYN:32134656 ANDROID:0)
    02-21 15:55:54.641 24683 25051 I xhook   : hooking malloc in /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libUE4.so
    02-21 15:55:54.641 24683 25051 I xhook   : found malloc at symidx: 81 (GNU_HASH UNDEF)
    02-21 15:55:54.641 24683 25051 I xhook   : found malloc at .rela.plt offset: 0xded9060
    02-21 15:55:54.642 24683 25051 I xhook   : XH_HK_OK 0x74bdd59060: 0x75635b59ec -> 0x6b6cde62e8 malloc /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libUE4.so
    02-21 15:55:54.657 24683 25051 I xhook   : found malloc at .rela.dyn offset: 0xded8910
    02-21 15:55:54.658 24683 25051 I xhook   : XH_HK_OK 0x74bdd58910: 0x75635b59ec -> 0x6b6cde62e8 malloc /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libUE4.so
    02-21 15:55:54.658 24683 25051 I xhook   : found malloc at .rela.dyn offset: 0xdefe580
    02-21 15:55:54.658 24683 25051 I xhook   : XH_HK_OK 0x74bdd7e580: 0x75635b59ec -> 0x6b6cde62e8 malloc /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libUE4.so
    02-21 15:55:54.658 24683 25051 I xhook   : found malloc at .rela.dyn offset: 0xdefe5a8
    02-21 15:55:54.659 24683 25051 I xhook   : XH_HK_OK 0x74bdd7e5a8: 0x75635b59ec -> 0x6b6cde62e8 malloc /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libUE4.so
    02-21 15:55:54.659 24683 25051 I xhook   : found malloc at .rela.dyn offset: 0xdf02af0
    02-21 15:55:54.659 24683 25051 I xhook   : XH_HK_OK 0x74bdd82af0: 0x75635b59ec -> 0x6b6cde62e8 malloc /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libUE4.so
    02-21 15:55:54.660 24683 25051 I xhook   : hooking free in /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libUE4.so
    02-21 15:55:54.660 24683 25051 I xhook   : found free at symidx: 80 (GNU_HASH UNDEF)
    02-21 15:55:54.660 24683 25051 I xhook   : found free at .rela.plt offset: 0xded9020
    02-21 15:55:54.660 24683 25051 I xhook   : XH_HK_OK 0x74bdd59020: 0x75635b59a4 -> 0x6b6cdcc558 free /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libUE4.so
    02-21 15:55:54.675 24683 25051 I xhook   : found free at .rela.dyn offset: 0xded8920
    02-21 15:55:54.676 24683 25051 I xhook   : XH_HK_OK 0x74bdd58920: 0x75635b59a4 -> 0x6b6cdcc558 free /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libUE4.so
    02-21 15:55:54.676 24683 25051 I xhook   : found free at .rela.dyn offset: 0xdefe5a0
    02-21 15:55:54.677 24683 25051 I xhook   : XH_HK_OK 0x74bdd7e5a0: 0x75635b59a4 -> 0x6b6cdcc558 free /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libUE4.so
    02-21 15:55:54.677 24683 25051 I xhook   : found free at .rela.dyn offset: 0xdefe5b8
    02-21 15:55:54.677 24683 25051 I xhook   : XH_HK_OK 0x74bdd7e5b8: 0x75635b59a4 -> 0x6b6cdcc558 free /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libUE4.so
    02-21 15:55:54.677 24683 25051 I xhook   : found free at .rela.dyn offset: 0xdf02af8
    02-21 15:55:54.678 24683 25051 I xhook   : XH_HK_OK 0x74bdd82af8: 0x75635b59a4 -> 0x6b6cdcc558 free /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libUE4.so
    02-21 15:55:54.678 24683 25051 I xhook   : hooking calloc in /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libUE4.so
    02-21 15:55:54.678 24683 25051 I xhook   : found calloc at symidx: 265 (GNU_HASH UNDEF)
    02-21 15:55:54.678 24683 25051 I xhook   : found calloc at .rela.plt offset: 0xded9190
    02-21 15:55:54.679 24683 25051 I xhook   : XH_HK_OK 0x74bdd59190: 0x75635b598c -> 0x6b6cde72e8 calloc /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libUE4.so
    02-21 15:55:54.694 24683 25051 I xhook   : found calloc at .rela.dyn offset: 0xded8950
    02-21 15:55:54.695 24683 25051 I xhook   : XH_HK_OK 0x74bdd58950: 0x75635b598c -> 0x6b6cde72e8 calloc /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libUE4.so
    02-21 15:55:54.695 24683 25051 I xhook   : found calloc at .rela.dyn offset: 0xdf02b10
    02-21 15:55:54.695 24683 25051 I xhook   : XH_HK_OK 0x74bdd82b10: 0x75635b598c -> 0x6b6cde72e8 calloc /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libUE4.so
    02-21 15:55:54.695 24683 25051 I xhook   : hooking memalign in /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libUE4.so
    02-21 15:55:54.695 24683 25051 I xhook   : hooking aligned_alloc in /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libUE4.so
    02-21 15:55:54.695 24683 25051 I xhook   : hooking posix_memalign in /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libUE4.so
    02-21 15:55:54.695 24683 25051 I xhook   : found posix_memalign at symidx: 473 (GNU_HASH UNDEF)
    02-21 15:55:54.696 24683 25051 I xhook   : found posix_memalign at .rela.plt offset: 0xded9b38
    02-21 15:55:54.696 24683 25051 I xhook   : XH_HK_OK 0x74bdd59b38: 0x75635b5a34 -> 0x6b6cde92e8 posix_memalign /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libUE4.so
    02-21 15:55:54.711 24683 25051 I xhook   : hooking realloc in /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libUE4.so
    02-21 15:55:54.711 24683 25051 I xhook   : found realloc at symidx: 277 (GNU_HASH UNDEF)
    02-21 15:55:54.711 24683 25051 I xhook   : found realloc at .rela.plt offset: 0xded9600
    02-21 15:55:54.712 24683 25051 I xhook   : XH_HK_OK 0x74bdd59600: 0x75635b5a64 -> 0x6b6cdea2e8 realloc /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libUE4.so
    02-21 15:55:54.727 24683 25051 I xhook   : found realloc at .rela.dyn offset: 0xded8930
    02-21 15:55:54.728 24683 25051 I xhook   : XH_HK_OK 0x74bdd58930: 0x75635b5a64 -> 0x6b6cdea2e8 realloc /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libUE4.so
    02-21 15:55:54.728 24683 25051 I xhook   : found realloc at .rela.dyn offset: 0xdefe590
    02-21 15:55:54.729 24683 25051 I xhook   : XH_HK_OK 0x74bdd7e590: 0x75635b5a64 -> 0x6b6cdea2e8 realloc /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libUE4.so
    02-21 15:55:54.729 24683 25051 I xhook   : found realloc at .rela.dyn offset: 0xdf02b00
    02-21 15:55:54.729 24683 25051 I xhook   : XH_HK_OK 0x74bdd82b00: 0x75635b5a64 -> 0x6b6cdea2e8 realloc /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libUE4.so
    
                                              。。。 。。。
    										  
    02-21 15:55:54.815 24683 25051 I xhook   : init OK: /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libtdmbeaconid.so (RELA ELF_HASH PLT:816 DYN:1848 ANDROID:0)
    02-21 15:55:54.815 24683 25051 I xhook   : hooking malloc in /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libtdmbeaconid.so
    02-21 15:55:54.815 24683 25051 I xhook   : found malloc at symidx: 115 (ELF_HASH)
    02-21 15:55:54.815 24683 25051 I xhook   : found malloc at .rela.plt offset: 0x24d70
    02-21 15:55:54.816 24683 25051 I xhook   : XH_HK_OK 0x74c36e9d70: 0x75635b59ec -> 0x6b6cde62d0 malloc /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libtdmbeaconid.so
    02-21 15:55:54.816 24683 25051 I xhook   : hooking free in /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libtdmbeaconid.so
    02-21 15:55:54.816 24683 25051 I xhook   : found free at symidx: 130 (ELF_HASH)
    02-21 15:55:54.816 24683 25051 I xhook   : found free at .rela.plt offset: 0x24da0
    02-21 15:55:54.817 24683 25051 I xhook   : XH_HK_OK 0x74c36e9da0: 0x75635b59a4 -> 0x6b6cdcc558 free /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libtdmbeaconid.so
    02-21 15:55:54.817 24683 25051 I xhook   : hooking calloc in /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libtdmbeaconid.so
    02-21 15:55:54.817 24683 25051 I xhook   : hooking memalign in /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libtdmbeaconid.so
    02-21 15:55:54.817 24683 25051 I xhook   : hooking aligned_alloc in /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libtdmbeaconid.so
    02-21 15:55:54.817 24683 25051 I xhook   : hooking posix_memalign in /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libtdmbeaconid.so
    02-21 15:55:54.817 24683 25051 I xhook   : hooking realloc in /data/app/com.tencent.mf.uam-C22Ym-EQQ3m-bNtokxs1Tg==/lib/arm64/libtdmbeaconid.so
    02-21 15:55:54.826 24683 25051 I xhook   : map refreshed

    在Launch或Attach应用时,一定要kill掉当前机器上所有的adb进程(taskkill /f /im adb.exe),否则会导致Launch或Attach游戏时,一直卡住无法成功。

    ① Compiler包括llvm和gcc,因为技术限制LoliProfiler不支持同时调试gcc与clang 的动态库,只能二则选其一。注:如果同时 Hook了clang和gcc的动态库,程序可能会崩溃或卡死。

    ② Mode包括strict(抓取每一条符合阈值的记录)、loose(按统计学方法抓取部分符合阈值的记录)、nostack(不抓取堆栈信息)三种模式

    ③ Build包括三种:

        (a) default -- 不需要修改编译参数,使用libunwind.so进行栈回溯,性能低下

        (b) instrumented -- 带上-finstrument-functions-finstrument-functions-after-inlining编译参数,会在所有函数进出时插入__cyg_profile_func_enter__cyg_profile_func_exit函数

                                      LoliProfiler会在这2个函数中记录堆栈调用。缺点是导致包体膨胀。

        (c) framepointer -- 带上-fno-omit-frame-pointer编译参数,将FramePointer存储到一个通用寄存器中,结合__builtin_frame_address(0)来获得函数调用堆栈。

                                      仅占用少量内存来存放各个栈帧的FramePointer及少量FramePointer的cpu运算,缺点非常小。UE4的Debug版本的apk包默认会开启-fno-omit-frame-pointer编译参数

                                       

    ④ Architecture(cpu架构),包括:armeabi-v7a、arm64-v8a和armeabi。

    ⑤ Threshold即阈值,当为0 byte时,表示会抓取所有记录;为8 bytes时,表示会抓取大于8字节的记录。注:阈值设得越小,抓取的记录越多,对游戏的性能影响也就越大。

    ⑥ Type分为white list(白名单)和black list(黑名单)。当使用gcc编译器时,建议把这些动态库加入到黑名单中,因为它们是用 clang 编译的:

    libloli,libart,libc++,libc,libcutils,libart_base,libart_compiler

    ⑦ gles可尝试hook libGLESv2_adreno.so,vulkan可尝试hook vulkan.msm8998.so 

    LoliProfiler可以大致得到App的各个so的Native内存占用:

    如图所示的设置就可以抓取整体的Native内存了。要点是将Mode改为nostack,通过记录这些信息得出内存是从哪个so申请来的。由于没有堆栈回溯,所以速度比较快,不太影响实际的游戏运行。

    注:所有被hook的so需要都为同一类型,gcc或llvm。确定类型后,在面板的Compiler上设定为该类型。

    对测试游戏,采用llvm,white list,列表为:

    libUE4,libgsdk,libitophttpdns,libturinggt,libtdmbeaconid,libCrashSight,libc++_shared,libhttpdns,libGVoice,libgrobot,libtersafe,libGPM,libHttpDnsPlugin,libMSDKCore,libtgpa,libTDataMaster,libCrashSightCore,libCrashSightPlugin

    libxgVipSecurity,libMcDSP,libMasteringSuite,libgcloud,libgcloudcore vulkan.msm8998,eglSubDriverAndroid,libqdMetaData,gralloc.msm8998,libgrallocutils,libGLESv2_adreno,libGLESv1_CM_adreno,libEGL_adreno,libGLESv3,libGLESv2,libGLESv1_CM,libEGL,libunwind,libvulkan,libETC1,libsqlite

    结果如下:

    模块名                                   记录数     内存大小
    All Libraries                            201449     157 MB
          libtgpa.so                         59         10.14 KB
          libTDataMaster.so                  77         26.42 KB
          libgcloud.so                       3496       2.59 MB
          libMSDKCore.so                     81         10.63 KB
          libEGL_adreno.so                   4          352 Bytes
          libCrashSightCore.so               6          388 Bytes
          libsqlite.so                       772        682.20 KB
          eglSubDriverAndroid.so             12         864 Bytes
          libGLESv2_adreno.so                173064     145 MB     // 显存相关
          libgcloudcore.so                   110        6.55 KB
          libUE4.so                          19630      1.68 MB
          libCrashSightPlugin.so             12         83.87 KB
          libEGL.so                          476        1.98 MB
          libGPM.so                          1170       911.75 KB
          libGVoice.so                       1336       2.36 MB
          libgrobot.so                       1          8 Bytes
          libtersafe.so                      1143       1.5 MB

    UE4项目在Android和iOS平台缺省并没有使用Ansi(即:C标准库内存分配器),因此若想使用LoliProfiler工具跟踪Native内存,有两种方法:

    方法①:将内存分配器修改为Ansi

    方法②:集成LoliProfiler轻量API,在Binned、Binned2内存分配器的分配和释放函数中调用loli_alloc、loli_free来主动通知LoliProfiler记录   详见:GAME_ENGINE_CN.md

    注:Binned、Binned2等内存分配器直接使用mmap、munmap向OS申请和释放虚拟内存,因此LoliProfiler无法直接跟踪到

    注:Load Symbols加载debug so必须与运行时的so的名字。以上例来说,debug so的名字需为libUE4.so 

    注1:All Sizes为所有size的分配记录,Large为大size的分配记录,Medium为中等size的分配记录,Small为小size的分配记录。

    注2:All Allocations为所有malloc过的记录,Persistent为malloc后还没有被free的记录。

    注3:All Libraries为所有动态库。

    注4:18800为记录数,1.38MB为内存总大小。

    Copy to Clipboard

    libUE4.so, AnsiRealloc(void*, unsigned long long, unsigned int)
    libUE4.so, FMallocAnsi::Realloc(void*, unsigned long long, unsigned int)
    libUE4.so, FMallocThreadSafeProxy::Realloc(void*, unsigned long long, unsigned int)
    libUE4.so, FMallocPoisonProxy::Realloc(void*, unsigned long long, unsigned int)
    libUE4.so, FMemory::Realloc(void*, unsigned long long, unsigned int)
    libUE4.so, TArray<TSparseArrayElementOrFreeListLink<TAlignedBytes<80, 8u> >, TSizedDefaultAllocator<32> >::ResizeGrow(int)
    libUE4.so, FSetElementId TSet<TTuple<FTextId, FTextLocalizationManager::FDisplayStringEntry>, TDefaultMapHashableKeyFuncs<FTextId, FTextLocalizationManager::FDisplayStringEntry, false>, FDefaultSetAllocator>::Emplace<TPairInitializer<FTextId const&, FTextLocalizationManager::FDisplayStringEntry&> >(TPairInitializer<FTextId const&, FTextLocalizationManager::FDisplayStringEntry&>&&, bool*)
    libUE4.so, FTextLocalizationManager::GetDisplayString(FTextKey const&, FTextKey const&, FString const*)
    libUE4.so, FTextHistory_Base::SerializeForDisplayString(FStructuredArchiveRecord, TSharedPtr<FString, (ESPMode)1>&)
    libUE4.so, FText::SerializeText(FStructuredArchiveSlot, FText&)
    libUE4.so, FText::SerializeText(FArchive&, FText&)
    libUE4.so, FArchive::operator<<(FText&)
    libUE4.so, FPropertyTag::SerializeTaggedProperty(FStructuredArchiveSlot, FProperty*, unsigned char*, unsigned char*) const
    libUE4.so, UStruct::SerializeVersionedTaggedProperties(FStructuredArchiveSlot, unsigned char*, UStruct*, unsigned char*, UObject const*) const
    libUE4.so, UScriptStruct::SerializeItem(FStructuredArchiveSlot, void*, void const*)
    libUE4.so, UDataTable::LoadStructData(FStructuredArchiveSlot)
    libUE4.so, UDataTable::Serialize(FStructuredArchiveRecord)
    libUE4.so, UDataTable::Serialize(FArchive&)
    libUE4.so, FAsyncPackage::EventDrivenSerializeExport(int)
    libUE4.so, FAsyncPackage::ProcessImportsAndExports_Event()
    libUE4.so, FAsyncPackage::Event_ProcessImportsAndExports()
    libUE4.so, FAsyncLoadingThread::ProcessAsyncLoading(int&, bool, bool, float, FFlushTree*)
    libUE4.so, FAsyncLoadingThread::TickAsyncThread(bool, bool, float, bool&, FFlushTree*)
    libUE4.so, FAsyncLoadingThread::Run()
    libUE4.so, FRunnableThreadPThread::Run()
    libUE4.so, FRunnableThreadPThread::_ThreadProc(void*)
    libc.so, 0xe69d4
    libc.so, 0x84b70

    Copy with LineNumber

    点击后,需要选择debug so所在目录,等待片刻后,就会使用ndk中的addr2line工具得到代码及LineNumber信息,并写入到剪切板中

    libUE4.so, E:/UAGroup/UnrealEngine/Engine/Source/Runtime/Core/Private/HAL/MallocAnsi.cpp:39
    libUE4.so, E:/UAGroup/UnrealEngine/Engine/Source/Runtime/Core/Private/HAL/MallocAnsi.cpp:195
    libUE4.so, E:/UAGroup/UnrealEngine/Engine/Source/Runtime/Core/Public\HAL/MallocThreadSafeProxy.h:52
    libUE4.so, E:/UAGroup/UnrealEngine/Engine/Source/Runtime/Core/Public\HAL/MallocPoisonProxy.h:66
    libUE4.so, emutls.c:?
    libUE4.so, E:/UAGroup\UnrealEngine\Engine\Source\Runtime\Core\Public\Containers/ContainerAllocationPolicies.h:480
    libUE4.so, E:/UAGroup\UnrealEngine\Engine\Source\Runtime\Core\Public\Containers/SparseArray.h:130
    libUE4.so, E:/UAGroup/UnrealEngine/Engine/Source/Runtime/Core/Public\Containers/Map.h:404
    libUE4.so, E:/UAGroup/UnrealEngine/Engine/Source/Runtime/Core/Public\Templates/SharedPointer.h:680
    libUE4.so, E:/UAGroup/UnrealEngine/Engine/Source/Runtime/Core/Private/Internationalization/Text.cpp:1010
    libUE4.so, E:/UAGroup/UnrealEngine/Engine/Source/Runtime/Core/Private/Internationalization/Text.cpp:802
    libUE4.so, E:/UAGroup/UnrealEngine/Engine/Source/Runtime/Core/Private/Serialization/Archive.cpp:450
    libUE4.so, emutls.c:?
    libUE4.so, E:/UAGroup/UnrealEngine/Engine/Source/Runtime/Core/Public\Serialization/Archive.h:304
    libUE4.so, E:/UAGroup/UnrealEngine/Engine/Source/Runtime/CoreUObject/Private/UObject/Class.cpp:2779
    libUE4.so, E:/UAGroup/UnrealEngine/Engine/Source/Runtime/Core/Public\Containers/Map.h:404
    libUE4.so, E:/UAGroup/UnrealEngine/Engine/Source/Runtime/Engine/Private/DataTable.cpp:252
    libUE4.so, E:/UAGroup/R6Game/Intermediate/Build/Android/UAGame/Inc/Engine/DataTable.gen.cpp:552
    libUE4.so, E:/UAGroup/UnrealEngine/Engine/Source/Runtime/CoreUObject/Private/Serialization/AsyncLoading.cpp:3217
    libUE4.so, E:/UAGroup/UnrealEngine/Engine/Source/Runtime/CoreUObject/Private/Serialization/AsyncLoading.cpp:3542
    libUE4.so, E:/UAGroup/UnrealEngine/Engine/Source/Runtime/CoreUObject/Private/Serialization/AsyncLoading.cpp:2390
    libUE4.so, E:/UAGroup/UnrealEngine/Engine/Source/Runtime/Core/Public\Templates/Function.h:681
    libUE4.so, E:/UAGroup/UnrealEngine/Engine/Source/Runtime/CoreUObject/Private/Serialization/AsyncLoading.cpp:4882
    libUE4.so, E:/UAGroup/UnrealEngine/Engine/Source/Runtime/CoreUObject/Private/Serialization/AsyncLoading.cpp:4807
    libUE4.so, E:/UAGroup/UnrealEngine/Engine/Source/Runtime/Core/Private/HAL/PThreadRunnableThread.cpp:27
    libUE4.so, E:/UAGroup/UnrealEngine/Engine/Source\Runtime/Core/Private/HAL/PThreadRunnableThread.h:186
    libc.so, 0xe69d4
    libc.so, 0x84b70

    按住Shift,然后在曲线图上拖动鼠标左键,可查看该选中范围的内存分配数据。

    在 MacOS的触摸板上,用一个手指点击,另一个手指拖拽,即可选择时间区间。

    TreeView模式

    显示合并后的Callstacks

    注:在底部输入框中,支持模糊搜索,可根据函数名称进行搜索

    TreeMap模式

    此模式比TreeView模式更直观,适合检查筛选问题最大的地方

    点击“TreeView”,就是用TreeView的方式显示选择区域的起始线与终止线的内存分配diff差量

    点击“TreeMap”,就是用TreeMap的方式显示选择区域的起始线与终止线的内存分配diff差量

    在采集结束后,LoliProfiler会请求一次当前app的smaps数据。可通过菜单“Tools” -- “Stat proc/pid/smaps”弹出的面板来查看:

    注:面板底部状态栏上,有VM(Virtual Memory)、Rss、Pss、PC(Private Clean)、PD(Private Dirty)、SC(Shared Clean)和SD(Shared Dirty)的统计信息。

    查看hook到的malloc、calloc等创建的堆内存(All Sizes,Persistent,All Libraries)在smaps中的分布情况,即为近似的内存碎片查看功能。可通过菜单“Tools” -- “Vasualize proc/pid/smaps”弹出的面板来查看:

    注1:smaps中共有21个[anon:libc_malloc]段

    注2:共hook了1601578次malloc、calloc等创建的堆内存,size数之和为336.7MB

    注3:1.34GB为21个[anon:libc_malloc]段的虚拟地址空间之和

    注4:红色的部分是被malloc、calloc等分配出去的堆内存;绿色部分为未分配的

    参考 

    QUICK_START_CN.md(如何使用)

    GAME_ENGINE_CN.md(集成)

    高效安卓非托管内存分析解决方案

  • 相关阅读:
    2014-5-28 技能
    Python的包管理工具Pip
    vi 命令 使用方法
    oracle实例名,数据库名,服务名等概念差别与联系
    自己动手写操作系统--个人实践
    D3DXMatrixMultiply 函数
    port大全及port关闭方法
    原型模式
    ExecuteScalar
    第三章_JSP
  • 原文地址:https://www.cnblogs.com/kekec/p/14913548.html
Copyright © 2020-2023  润新知