echo off setlocal enabledelayedexpansion echo echo Memory Data Grab Script v3.0.2 echo Usage: grab_mem_data.bat [rounds] [interval_sec] echo Example: grab_mem_data.bat 5 30 echo set “ROUNDS%~1” set “INTERVAL%~2” if “%ROUNDS%”“” set “ROUNDS5” if “%INTERVAL%”“” set “INTERVAL30” echo Rounds: %ROUNDS%, Interval: %INTERVAL%s echo. set “OUT_DIR%~dp0grab_mem_out” if not exist “%OUT_DIR%” mkdir “%OUT_DIR%” :: Check adb adb get-state nul 21 if errorlevel 1 ( echo [ERROR] No adb device found pause exit /b 1 ) :: Get PIDs of key processes set “SYSTEM_PID” set “SYSTEMUI_PID” set “LAUNCHER_PID” for /f “tokens2” %%a in (‘adb shell “ps -A | grep system_server$”’) do set “SYSTEM_PID%%a” for /f “tokens2” %%a in (‘adb shell “ps -A | grep com.android.systemui$”’) do set “SYSTEMUI_PID%%a” for /f “tokens2” %%a in (‘adb shell “ps -A | grep com.android.launcher$”’) do set “LAUNCHER_PID%%a” echo Key PIDs: echo system_server: [%SYSTEM_PID%] echo systemui: [%SYSTEMUI_PID%] echo launcher: [%LAUNCHER_PID%] echo. :: :: MAIN LOOP :: for /L %%i in (1,1,%ROUNDS%) do ( call :grab_round %%i if %%i LSS %ROUNDS% ( echo Waiting %INTERVAL% seconds… timeout /t %INTERVAL% /nobreak nul ) ) echo. echo echo All %ROUNDS% rounds completed! echo Output: %OUT_DIR% echo echo. set /p GRAB_HPROFGrab Java Heap Dump (.hprof)? This takes time (y/n): if /i “!GRAB_HPROF!”“y” call :grab_hprof pause exit /b 0 :: :: SUB: grab one round :: :grab_round set “IDX%~1” echo echo Round %IDX% / %ROUNDS% start echo :: ---- 1. /proc/meminfo ---- echo [1/16] /proc/meminfo adb shell cat /proc/meminfo “%OUT_DIR%\proc_meminfo_%IDX%.txt” :: ---- 2. /proc/slabinfo ---- echo [2/16] /proc/slabinfo adb shell cat /proc/slabinfo “%OUT_DIR%\slab_info_%IDX%.txt” :: ---- 3. /proc/vmallocinfo ---- echo [3/16] /proc/vmallocinfo adb shell cat /proc/vmallocinfo “%OUT_DIR%\vml_info_%IDX%.txt” :: ---- 4. dma_buf/bufinfo ---- echo [4/16] dma_buf/bufinfo adb shell cat /proc/dma_buf/bufinfo “%OUT_DIR%\bufinfo_info_%IDX%.txt” 21 :: ---- 5. dma_buf/dmaprocs ---- echo [5/16] dma_buf/dmaprocs adb shell cat /proc/dma_buf/dmaprocs “%OUT_DIR%\dmaprocs_info_%IDX%.txt” 21 :: ---- 6. GPU memory (try multiple paths) ---- echo [6/16] GPU memory adb shell cat /sys/kernel/debug/mali/memory “%OUT_DIR%\gpu_memory_%IDX%.txt” 21 for %%f in ( /sys/kernel/debug/mali/memory /d/mali/memory /proc/mali/memory /sys/class/misc/mali/memory /d/gpu/memory /proc/gpu/memory ) do ( adb shell cat %%f “%OUT_DIR%\gpu_memory_%IDX%.txt” 21 ) :: ---- 7. ION memory (try multiple paths) ---- echo [7/16] ION memory if not exist “%OUT_DIR%\ion” mkdir “%OUT_DIR%\ion” adb shell cat /proc/ion/ion_mm_heap “%OUT_DIR%\ion\ion1_%IDX%.txt” 21 adb shell cat /proc/ion/ion_system_heap “%OUT_DIR%\ion\ion2_%IDX%.txt” 21 adb shell cat /proc/ion/clients/clients_summary “%OUT_DIR%\ion\ion3_%IDX%.txt” 21 adb shell cat /d/ion/clients/clients_summary “%OUT_DIR%\ion\ion4_%IDX%.txt” 21 adb shell cat /proc/ion/ion_secure_heap “%OUT_DIR%\ion\ion5_%IDX%.txt” 21 :: ---- 8. RssShmem (use simpler approach) ---- echo [8/16] RssShmem echo proc_name pid RssShmem(kB) “%OUT_DIR%\rssshmem_%IDX%.txt” adb shell for pid in (ls/proc/2/dev/null∣grep−E′[0−9](ls/proc/2/dev/null∣grep−E′[0−9]); do cmd$(cat /proc/$pid/cmdline 2/dev/null | tr ‘\0’ ’ ); if [ -z “cmd];thencontinue;fi;rsscmd];thencontinue;fi;rss(grep RssShmem /proc/$pid/smaps_rollup 2/dev/null | awk ‘{print$2}’); if [ -n “$rss” ] [ “$rss” -gt 0 ] 2/dev/null; then echo $cmd $pid $rss; fi; done” “%OUT_DIR%\rssshmem_%IDX%.txt” 21 :: ---- 9. osvelte meminfo ---- echo [9/16] osvelte meminfo adb shell osvelte meminfo “%OUT_DIR%\osvelte_meminfo_%IDX%.txt” 21 :: ---- 10. proc_startinfo ---- echo [10/16] proc_startinfo echo ---- TIME %date% %time% ---- “%OUT_DIR%\proc_startinfo_%IDX%.txt” echo — v3.0.2 — “%OUT_DIR%\proc_startinfo_%IDX%.txt” adb shell cat /proc/startinfo “%OUT_DIR%\proc_startinfo_%IDX%.txt” 21 :: ---- 11. dumpsys meminfo (overview) ---- echo [11/16] dumpsys meminfo adb shell dumpsys meminfo “%OUT_DIR%\dumpsys_meminfo_%IDX%.txt” :: ---- 12. dumpsys meminfo -a (full detail) ---- echo [12/16] dumpsys meminfo -a adb shell dumpsys meminfo -a “%OUT_DIR%\dumpsys_meminfo_-a_%IDX%.txt” :: ---- 13. SurfaceFlinger ---- echo [13/16] SurfaceFlinger adb shell dumpsys SurfaceFlinger “%OUT_DIR%\sf_%IDX%.txt” :: ---- 14. ps ---- echo [14/16] ps adb shell ps -A “%OUT_DIR%\ps_info_%IDX%.txt” adb shell ps -T -A “%OUT_DIR%\pst_info_%IDX%.txt” :: ---- 15. GPU Total Used Detail Data ---- echo [15/16] GPU detail set “GPU_DIR%OUT_DIR%\GPUTotalUsedDetailData_%IDX%” if not exist “!GPU_DIR!” mkdir “!GPU_DIR!” adb shell cat /sys/kernel/debug/mali/memory “!GPU_DIR!\TotalGPUMem.txt” 21 adb shell cat /proc/meminfo “!GPU_DIR!\TotalGPUMem.txt” 21 :: ---- 16. dumpsys meminfo --local (per key process) ---- set “LOCAL_DIR%OUT_DIR%\dumpsys_meminfo_–local_%IDX%” if not exist “!LOCAL_DIR!” mkdir “!LOCAL_DIR!” if defined SYSTEM_PID adb shell dumpsys meminfo --local system “!LOCAL_DIR!\system.txt” 21 if defined SYSTEMUI_PID adb shell dumpsys meminfo --local com.android.systemui “!LOCAL_DIR!\com.android.systemui.txt” 21 if defined LAUNCHER_PID adb shell dumpsys meminfo --local com.android.launcher “!LOCAL_DIR!\com.android.launcher.txt” 21 :: ---- extra: deep analysis for key processes ---- set “EXTRA_DIR%OUT_DIR%\extra_%IDX%” if not exist “!EXTRA_DIR!” mkdir “!EXTRA_DIR!” if defined SYSTEM_PID call :grab_extra system %SYSTEM_PID% if defined SYSTEMUI_PID call :grab_extra com.android.systemui %SYSTEMUI_PID% if defined LAUNCHER_PID call :grab_extra com.android.launcher %LAUNCHER_PID% echo Round %IDX% done echo. goto :eof :: :: SUB: grab extra data for one process :: %1process_name %2pid :: :grab_extra set “PNAME%~1” set “PPID%~2” echo [extra] %PNAME% (PID: %PPID%) :: showmap adb shell showmap %PPID% “!EXTRA_DIR!\showmap_%PNAME%_%PPID%.txt” 21 :: smaps (full) adb shell cat /proc/%PPID%/smaps “!EXTRA_DIR!\smps_%PNAME%_%PPID%.txt” 21 :: backtrace adb shell debuggerd -b %PPID% “!EXTRA_DIR!\backtrace_%PNAME%_%PPID%.txt” 21 :: gfxinfo - use package name for app processes if “%PNAME%”“system” ( adb shell dumpsys gfxinfo system_server “!EXTRA_DIR!\gfxinfo_%PNAME%%PPID%.txt 21 ) else ( adb shell dumpsys gfxinfo %PNAME% !EXTRA_DIR!\gfxinfo%PNAME%_%PPID%.txt” 21 ) :: native heap dump for system_server if “%PNAME%”“system” ( echo — native heap dump for system_server — “!EXTRA_DIR!\nativeheap_%PNAME%.txt” adb shell “kill -47 %PPID% sleep 3 cat /proc/%PPID%/smaps_rollup” “!EXTRA_DIR!\nativeheap_%PNAME%.txt” 21 adb shell debuggerd --backtrace %PPID% “!EXTRA_DIR!\nativeheap_%PNAME%.txt” 21 ) :: native heap dump for other processes (try kill -47 with wait) if not “%PNAME%”“system” ( adb shell “kill -47 %PPID% 2/dev/null; sleep 2; ls /data/local/tmp/native_heap_%PPID%.* 2/dev/null || echo ‘native heap not available’” “!EXTRA_DIR!\nativeheap_%PNAME%.txt” 21 ) goto :eof :: :: SUB: grab hprof files (with proper wait) :: :grab_hprof echo. echo Grabbing hprof files (this may take several minutes each)… if defined SYSTEM_PID ( echo system_server hprof… adb shell am dumpheap %SYSTEM_PID% /data/local/tmp/system.hprof echo Waiting for dumpheap to complete… timeout /t 30 /nobreak nul adb shell ls -la /data/local/tmp/system.hprof adb pull /data/local/tmp/system.hprof “%OUT_DIR%\extra_1\system.hprof” adb shell rm /data/local/tmp/system.hprof ) if defined SYSTEMUI_PID ( echo systemui hprof… adb shell am dumpheap %SYSTEMUI_PID% /data/local/tmp/com.android.systemui.hprof echo Waiting for dumpheap to complete… timeout /t 30 /nobreak nul adb shell ls -la /data/local/tmp/com.android.systemui.hprof adb pull /data/local/tmp/com.android.systemui.hprof “%OUT_DIR%\extra_1\com.android.systemui.hprof” adb shell rm /data/local/tmp/com.android.systemui.hprof ) if defined LAUNCHER_PID ( echo launcher hprof… adb shell am dumpheap %LAUNCHER_PID% /data/local/tmp/com.android.launcher.hprof echo Waiting for dumpheap to complete… timeout /t 30 /nobreak nul adb shell ls -la /data/local/tmp/com.android.launcher.hprof adb pull /data/local/tmp/com.android.launcher.hprof “%OUT_DIR%\extra_1\com.android.launcher.hprof” adb shell rm /data/local/tmp/com.android.launcher.hprof ) echo hprof done! goto :eof