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, TArray80, 8u> >, TSizedDefaultAllocator<32> >::ResizeGrow(int)
libUE4.so, FSetElementId TSet, TDefaultMapHashableKeyFuncsfalse>, FDefaultSetAllocator>::Emplaceconst&, FTextLocalizationManager::FDisplayStringEntry&> >(TPairInitializerconst&, FTextLocalizationManager::FDisplayStringEntry&>&&, bool*)
libUE4.so, FTextLocalizationManager::GetDisplayString(FTextKey const&, FTextKey const&, FString const*)
libUE4.so, FTextHistory_Base::SerializeForDisplayString(FStructuredArchiveRecord, TSharedPtr1>&)
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(集成)

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