使用adb dumpheap生成的hprof文件为0字节问题求助
结合你用root真机执行adb shell am dumpheap com.xxx.xxx /data/local/tmp/com_xxx_xxx.hprof却得到空文件的情况,我整理了几个常见排查方向和解决办法:
确认目标应用进程状态
先检查应用是否真的在运行:执行adb shell ps | grep com.xxx.xxx,如果没有返回进程信息,说明应用没启动,dump自然生成空文件。如果进程存在但状态异常(比如挂起),重启应用后再试一次dump命令。检查输出路径的权限
虽然/data/local/tmp通常是全局可读写的,但还是要确认下:运行adb shell ls -ld /data/local/tmp,确保权限是drwxrwxrwx这类有写权限的。如果权限有问题,换个路径试试,比如外部存储:adb shell am dumpheap com.xxx.xxx /sdcard/com_xxx_xxx.hprof,之后用adb pull /sdcard/com_xxx_xxx.hprof拉到本地。核对包名或改用PID指定进程
有时候包名可能输错了(比如带.debug后缀你没注意),用adb shell pm list packages | grep xxx确认准确的包名。另外,如果应用有多个进程,直接用PID更可靠:先执行adb shell pidof com.xxx.xxx拿到进程ID,再运行adb shell am dumpheap <PID> /data/local/tmp/com_xxx_xxx.hprof。以root身份执行命令
即使设备root了,默认的adb shell可能没拿到最高权限,试试用su提升权限后执行:adb shell su -c "am dumpheap com.xxx.xxx /data/local/tmp/com_xxx_xxx.hprof",确保dump操作以root权限运行,避免系统限制。排查系统或adb兼容性问题
旧版本adb可能和高版本Android不兼容,试试更新adb到最新版。另外,部分定制ROM或高版本Android(比如Android 11+)对调试操作有额外限制,去开发者选项里确认「USB调试」「允许调试应用」都已开启,并且「选择调试应用」指定为com.xxx.xxx。检查设备内存资源
如果设备剩余内存不足,dumpheap可能无法完成内存快照,先清理后台应用释放内存后再尝试。
内容的提问来源于stack exchange,提问作者TonyChou

