【问题标题】:Strace command from Android app writes empty file [duplicate]Android应用程序的Strace命令写入空文件[重复]
【发布时间】:2013-02-10 16:47:25
【问题描述】:

我正在尝试从 android 应用程序执行 strace 命令以获取 PID。代码段如下:

Runtime.getRuntime().exec("strace -p 20436 -o /mnt/sdcard/sampleTrace11.txt");

文件 sampleTrace11.txt 已创建,但它是空的。当我从 shell 命令提示符执行相同的命令时,文件会写入数据。谁能帮帮我..

【问题讨论】:

  • 你用strace的全路径测试了吗?
  • @sputnick 如果strace 没有启动,它不会创建一个空文件(注意使用-o 选项,而不是输出重定向或类似的东西)
  • 你能告诉我该怎么做吗?
  • @srooth 如果我知道 java... 好吧,你有办法exec 一个程序并获得它的标准错误和标准输出吗?也许strace 说明了它为什么拒绝工作?如果getRuntime().exec 支持shell 重定向,也许添加2> /mnt/sdcard/straceerr.txt >/mnt/sdcard/straceout.txt 看看那里是否出现了有用的东西?
  • @Anton 我尝试了 2> 选项..但是没有创建文件..

标签: android shell strace


【解决方案1】:

我希望它与权限相关。一个好方法是使用来自adb shellrun-as。例如,假设您的应用程序是com.srooth.fancyapp,请执行以下操作:

adb shell run-as com.srooth.fancyapp strace -p 20436 -o /mnt/sdcard/sampleTrace11.txt

如果这不起作用,您知道这与 com.srooth.fancyapp 的权限有关,并且您可以期望在 Java 中运行时得到相同的结果。

一些可能的权限问题:

  • 您的应用没有写入 SD 卡的权限。此功能将由以您的用户身份运行的所有其他应用程序继承,因此请务必确保您的 AndroidManifest.xml 指定权限:

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

  • 如果有问题的进程不是您的应用程序的一部分,它将以不同的用户身份运行。因此,您的应用程序将无权检查它。对此您无能为力,除了使用 root 手机并将 su -c 附加到您的命令行。

其他几个想法:

  • 如果可以,请尝试启动进程而不是附加到它。这应该没有任何区别,但可以帮助您调试问题。
  • 尝试使用ProcessBuilder 类,而不是使用Runtime.getRuntime().exec()。这将使您能够做各种有用的事情:

    • 等待进程完成
    • 看看它的标准输出
    • 看看它的标准错误
    • 获取其返回码。

【讨论】:

  • 感谢您回复阿德里安...似乎它与您指出的有关...对于主应用程序(编写此代码的应用程序)的 processId 工作正常。但是当它试图 strace 任何其他应用程序时,问题就出现了......我正在使用模拟器并且它已经植根......我也尝试了 su -c 选项,但没有工作:(
猜你喜欢
  • 2012-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多