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

8
我希望能够通过命令行触发Android堆转储。是否有相应的命令?具体而言,我需要从命令行触发,而不是通过Montior或DDMS GUIs。也许可以使用ddms或adb,例如:ddms -head-dump或adb shell heapdump?据我所知,Monitor和DDMS始终在GUI模式下启动,而adb没有堆转储命令。更新:我尝试了这个方法,看起来很有前途,但它不起作用:
  1. adb jdwp
  2. adb forward tcp:8000 jdwp:1234 (将1的输出替换为1234)
  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

顺便说一句,我能够通过 jdb -attach localhost:8000 连接到转发的 JDWP 端口。 - nmr
可能是"Live" memory analysis tool for Android的重复问题。 - Damian Leszczyński - Vash
不,那个人明确地寻找的是不是堆转储,我正在通过命令行查找堆转储。 - nmr
答案中使用adb命令通过kill -11 <pid>触发一次全局GC并将堆转储为hprof文件。那么,什么是“堆转储”? - Damian Leszczyński - Vash
有趣的是,不幸的是,根据2010年提交的这个提交(https://github.com/android/platform_dalvik/commit/c9dcf262db56d831eb45bb44978a6261e16a2d78?diff=unified),SIGUSR1不再堆转储。 - nmr
不行。我注意到文件缺少描述。我在答案中链接了正确的文件。 - Damian Leszczyński - Vash
3个回答

21

在 Android 3.0 之前,您可以使用所谓的

kill -10 <pid> (更多)

在 Android 3.0 中增加了一个新的命令行工具:

adb shell am dumpheap <pid> <output-file-name>; (更多)

详细描述

要获取 HPROF,您还需要使用 hprof-conv 更改其格式。


1
哇,太棒了,这真的很难找到,谢谢。应该是 adb shell am dumpheap <pid> <output-file-name>(缺少“shell”)。值得注意的是,输出文件名必须是用户可写的,例如写入 /sdcard/heapdump.hprof。 - nmr
调试也是必需的。 - naive
输出文件名是可选的。默认值为/data/local/tmp/heapdump-<date>-<time>.prof - rds
pid 也可以替换为软件包名称。 - Glorin

8

简单的方法:

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中打开它。


0

对于那些不想每次查找正确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

Heapdump 保存在 /Users/$USER/Desktop


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接