【问题标题】:Android: How to strace an app using ADB shell am startAndroid:如何使用 ADB shell 跟踪应用程序 am start
【发布时间】:2012-08-23 09:54:45
【问题描述】:

我需要有关在 SDK 模拟器中跟踪 Android 应用程序的帮助。

这是我的设置:

我有一个运行 Android API 4.03 ADB shell 的 Android SDK 模拟器连接到模拟器。

我可以使用 ADB 安装文件名.apk 安装 APK

我可以使用 ADB shell am start -a android.intent.action.Main -n com.akproduction.notepad/com.akproduction.notepad.NoteList 运行应用程序

我尝试使用(ADB shell)strace am start -a android.intent.action.Main -n com.akproduction.notepad/com.akproduction.notepad.NoteList 进行 strace,但我什么也没得到!

您如何跟踪 Android 应用的运行时行为及其安装?

(P.S. 测试应用位于here

【问题讨论】:

    标签: android shell runtime adb strace


    【解决方案1】:

    “am start”命令不会直接运行您的应用程序;它只是告诉 Android 做任何必要的事情,在你的例子中,启动一个特定的活动。

    strace 命令通常与strace commandname command args 一样使用,它会启动commandname -- 很简单,但在这个 Android 用例中没有帮助。但是,strace 有一个-p 选项对您有帮助:strace -p <process id> 将让您开始使用指定的 id 跟踪进程。

    如果您在 Android 系统上键入 ps,您可以找到名称为 com.akproduction.notepad 的进程(可能;默认情况下,进程以其 Android 包命名,但可以在清单中更改它)。然后你就可以开始追踪它了,不管它在哪里。

    如果您需要在流程的早期捕获事物,您需要修改代码以使其延迟,直到您准备好跟踪它,或者您至少需要在开始活动之前需要让进程运行。第二个选项通常很简单,例如启动 Activity,然后使用后退按钮,然后准备好跟踪,然后再次启动 Activity——但这始终是特定于应用程序的代码。

    【讨论】:

      【解决方案2】:

      这是我今天用来解决这个问题的一个丑陋的单行黑客。假设程序有一些已知的名称,只要它一出现就尝试附加到该进程。在此示例中,我对所有调用 open 感兴趣。

      while true; do
        while ! ps  | grep -q -i MyProgram; do :; done;
        ps | grep -i MyProgram | while read a b c; do
         strace -e open -f -p $b;
        done;
      done
      

      【讨论】:

        【解决方案3】:

        这是grabs the process id 的单行代码,并在am 启动应用程序后立即通过管道将其传输到 strace。您不会执行前几条指令,但它会尽早启动以满足我的需求。

        am start -n com.packagename.here\.ActivityName && set `ps | grep com.packagename.here` && strace -p $2

        【讨论】:

          【解决方案4】:

          Android 应用实际上是通过 fork zygote 进程启动的,因此您可以通过跟踪 zygote 进程和跟随子进程('-f')来跟踪应用初始化:

          setenforce 0  # In Android 4.3 and later, if SELinux is enabled, strace will fail with "strace: wait: Permission denied"
          
          set `ps | grep zygote` ; strace -p $2 -f -tt -T -s 500 -o /sdcard/strace.txt
          

          【讨论】:

          • 面临与 Aaron 提到的相同的问题。有谁知道如何处理/解决这个问题?
          • 我没有看到使用benno.id.au/android/strace 在 Android 5.1 上跟踪 zygote 的任何问题。您遇到什么版本的 strace/Android 问题?当 zygote 崩溃时,adb logcat 是否显示堆栈跟踪或任何其他有用信息?请注意,zygote 可能会在内部抛出和捕获 SIGSEGV 以处理空指针或某些垃圾收集功能,并且 strace 会检测并打印这一点,但这并不一定表明 zygote 实际上正在崩溃。您只是在 strace 输出中看到 SIGSEGV 并假设 zygote 正在崩溃,还是您确定 zygote 实际上正在崩溃?
          【解决方案5】:

          我建议在启动您的应用程序之前在 zygote 进程上启动 strace 并遵循分叉。 Zygote 进程是 Android 中每个新进程的主要进程,包括您的应用程序。然后您可能希望根据您感兴趣的 PID 过滤日志。示例:

          ps合子

          获取zygote PID,然后

          strace -f -p

          【讨论】:

            【解决方案6】:

            我找到了一个棘手的方法来做到这一点,同时保证所有的系统调用都会被捕获。即使应用程序不可调试也可以这样做:

            • 设置活动管理器 (am) 以使用 -w 选项将应用程序置于调试模式,该选项将停止执行,直到附加到调试器为止
            • 手动启动应用程序(您可以点击屏幕上的图标或使用am start调用它
            • 应用程序暂停后,获取其 PID
            • 获得PID后,调用strace跟踪该进程
            • 最后,附加调试器以便开始执行。

            步骤如下:

            adb shell # shell into the device
            am set-debug-app -w com.package.name # put app to debug mode
            am start com.package.name/com.path.to.MainActivity # start the app
            ps -A | grep com.package.name # this will show you the PID
            strace -p <PID> > appoutput.txt 2> appstrace.txt 
            # strace the program and record its output and strace in txt files
            

            现在只需附加调试器并享受,您可以在例如 Android Studio 或 Eclipse 中执行此操作。从此时开始执行将开始,您将能够从第一行代码开始跟踪它。

            【讨论】:

              【解决方案7】:

              如果您有 root 访问权限或设备在未启用 SELinux 的情况下运行,那么您可以按照 Android 站点的方式进行操作:

              设置设备以便您可以运行 strace。您需要成为 root,禁用 SELinux,然后重新启动运行时以删除 seccomp 过滤器,否则会阻止 strace 运行: 亚行根 亚行外壳 setenforce 0 adb 外壳停止 adb shell 启动

              为 strace 日志设置一个全局可写目录,因为 strace 将在应用程序的 uid 下运行: adb shell mkdir -m 777 /data/local/tmp/strace

              选择要跟踪的进程并启动它: adb shell setprop wrap.com.android.calendar '"logwrapper strace -f -o /data/local/tmp/strace/strace.com.android.calendar.txt"'

              正常启动进程。

              https://source.android.com/devices/tech/debug/strace#app-strace

              【讨论】:

                猜你喜欢
                • 2013-12-10
                • 1970-01-01
                • 2022-08-27
                • 2013-12-12
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多