是否可以从命令行触发Android堆转储?

hi3rlvi2  于 2023-04-18  发布在  Android
关注(0)|答案(3)|浏览(235)

我希望能够从命令行触发Android堆转储。是否有相应的命令?

具体来说,从命令行,而不是通过Montior或DDMS GUI

也许像使用ddms或adb,例如ddms -head-dumpadb shell heapdump?AFAICT监视器和ddms总是在GUI模式下启动,而adb没有堆转储命令。
更新:我尝试了这个,它看起来很有希望,但它不工作:

  1. adb jdwp
  2. adb forward tcp:8000 jdwp:1234(将1234的输出替换为1)
  3. jmap -dump:format=b,file=heapdump.hprof localhost:8000
    但即使堆摘要也失败了:
jmap -heap localhost:8000
Attaching to remote server localhost:8000, please wait...
Error attaching to remote server: java.rmi.ConnectIOException: error during JRMP connection establishment; nested exception is: 
        java.net.SocketTimeoutException: Read timed out
dwbf0jvd

dwbf0jvd1#

在Android pre 3.0中,您可以使用所谓的
kill -10 <pid>more
在Android 3.0中,添加了一个新的命令行工具:
adb shell am dumpheap <pid> <output-file-name>;more
Detailed description
要获取HPROF,还需要使用hprof-conv更改其格式

6l7fqoea

6l7fqoea2#

简单的方法:

adb shell am dumpheap your.package.name /sdcard/dumpheap.hprof

困难的方式(不记得我最初为什么添加它):

adb shell am dumpheap $(ps | grep your.package.name | awk '{print $2}') /sdcard/dumpheap.hprof

如果您的设备没有awk,请尝试使用busybox awk
之后,拉取创建的文件,使用hprof-conv转换它并在Android Studio中打开它。

p5fdfcr1

p5fdfcr13#

对于那些不想每次都寻找正确的PID,只想使用单行命令的人

将此添加到您的.zshrc或.bashrc:

heap_dump() {
    PACKAGE=$1
    HPROF=/data/local/tmp/$PACKAGE.hprof
    PID=$(adb shell ps | grep $PACKAGE$ | awk '{print $2}')
    out=/Users/$USER/Desktop

    adb shell am dumpheap $PID $HPROF
    adb pull $HPROF $out
}

要从命令行使用它,请使用USB连接Android并运行:

heap_dump my.app.package.name

堆转储保存在/Users/$USER/Desktop

相关问题