我正在编写一个脚本来在Android上进行堆转储,将其拉到我的计算机,并可选择将其转换为标准的hprof。使用的主要命令是:
adb shell "am dumpheap ${PROCESS} /data/local/tmp/${FILENAME}-unconverted.hprof"
adb pull "/data/local/tmp/${FILENAME}-unconverted.hprof"
adb shell "rm /data/local/tmp/${FILENAME}-unconverted.hprof"
当我在终端中逐个执行这些行时,一切正常。但是,当我在bash脚本中运行这些命令时,adb pull会抓取一个空文件。
在终端中运行时,adb pull需要相当长的时间并报告进度百分比,但是当在bash脚本中运行时,它会立即显示
"/data/local/tmp/heapdump-05_22_2017_1807-unconverted.hprof: 1 file pulled"
我浏览了所有可以找到的adb拉/推帖,试图弄清楚这一点,但没有任何工作或真正应用。非常感谢任何帮助!
感谢。
答案 0 :(得分:1)
我发现这是一个没有完成的dumpheap调用,因为它作为一个守护进程运行,并且adb pull实际上在拉空文件时是正确的。
我通过添加等待函数来解决这个问题,该等待函数一直等到设备上的文件完成后继续:
waitForFile() {
# wait for file to stabalize at a size above 0
local lastSize=0
local matchCount=0
while [ ${matchCount} -lt 3 ] ;
do
if [[ ${lastSize} -gt 0 && $(fileSize) = ${lastSize} ]] ;
then
let "matchCount+=1"
echo "match ${matchCount}"
else
matchCount=0
lastSize=$(fileSize)
echo "Dumping file...current size = ${lastSize}"
fi
sleep 0.5
done
echo "Heap Dump Complete, file size = ${lastSize}"
}
fileSize() {
local size=$(echo $(adb shell "ls -s /data/local/tmp/${FILENAME}-unconverted.hprof") | cut -f1 -d' ')
echo $size
}
adb shell "am dumpheap ${PROCESS} /data/local/tmp/${FILENAME}-unconverted.hprof"
waitForFile
adb pull "/data/local/tmp/${FILENAME}-unconverted.hprof"
adb shell "rm /data/local/tmp/${FILENAME}-unconverted.hprof"
对于任何想要使用它来获得标准hprof的读者,可以在最后添加以下行:
hprof-conv -z ${FILENAME}-unconverted.hprof ${FILENAME}-standard.hprof
答案 1 :(得分:0)