三星S8(Oreo系统)adb原生堆dump失败求助(已root)
我之前在三星S8(Android Oreo)上也碰到过一模一样的问题——明明已经root并严格按照提示设置了libc.debug.malloc,但运行am dumpheap -n <pid> /data/local/tmp/dump.txt时,还是只返回那句Native heap dump not available。折腾了好一阵,总结出几个能解决问题的办法,你可以挨个试试:
先确认
libc.debug.malloc的设置真的生效了
有时候执行完setprop命令后,系统重启会把这个属性重置回默认值。你可以在重启设备后立刻运行:adb shell getprop libc.debug.malloc如果返回的不是
1,说明属性没保留住。这时候可以把它写入/system/build.prop来永久生效(注意要先把/system分区挂载为读写模式):adb shell su -c "mount -o rw,remount /system" adb shell su -c "echo 'libc.debug.malloc=1' >> /system/build.prop" adb shell su -c "mount -o ro,remount /system" adb shell stop && adb shell start重启后再用
getprop验证,确保值是1。必须让目标进程在设置属性后重新启动
libc.debug.malloc的调试开关只对设置之后启动的进程生效。如果你在设置属性前已经打开了目标APP,一定要先彻底杀掉它:adb shell am force-stop <你的APP包名>然后重新打开APP,再执行
dumpheap命令试试。换用
gcore工具生成核心转储(Root必备)
三星Oreo上的am dumpheap -n似乎有兼容性bug,你可以试试用gcore直接生成进程的核心转储文件,这个方法更可靠:adb shell su -c "gcore -o /data/local/tmp/core_dump <pid>"生成的
core_dump文件可以用adb pull /data/local/tmp/core_dump拉到本地,之后用对应Android架构的GDB来分析原生堆内容。临时关闭SELinux试试
三星Oreo默认的SELinux是Enforcing模式,可能会拦截dump操作。你可以临时把它改成Permissive模式:adb shell su -c "setenforce 0"然后再执行
dumpheap命令,如果成功了,说明是SELinux的限制导致的(不过不建议永久关闭,会降低设备安全性)。检查dump路径的权限
最后确认一下/data/local/tmp目录有没有可写权限,执行:adb shell ls -ld /data/local/tmp正常权限应该是
drwxrwxrwx,如果不是,用Root权限修改:adb shell su -c "chmod 777 /data/local/tmp"
内容的提问来源于stack exchange,提问作者Amit Kumar

