Команда strace из приложения для Android записывает пустой файл

Я пытаюсь выполнить команду strace для PID из приложения для Android. сегмент кода ниже:

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

Файл sampleTrace11.txt создан, но он пуст. Когда я выполняю ту же команду из командной строки оболочки, файл записывается с данными. Кто-нибудь может мне помочь, пожалуйста..


person srooth    schedule 10.02.2013    source источник
comment
Вы тестировали полный путь strace ?   -  person Gilles Quenot    schedule 10.02.2013
comment
@sputnick, если бы strace не запустился, он не создал бы пустой файл (обратите внимание, что используется опция -o, а не перенаправление вывода или что-то в этом роде)   -  person Anton Kovalenko    schedule 10.02.2013
comment
Можете ли вы сказать, плз, что делать тогда?   -  person srooth    schedule 10.02.2013
comment
@srooth Если бы я только знал java ... Хорошо, у вас есть способ exec программы и получить ее стандартную ошибку и стандартный вывод? Может быть, strace что-то говорит о том, почему он отказывается работать? И если getRuntime().exec поддерживает перенаправления оболочки, может быть, добавить 2> /mnt/sdcard/straceerr.txt >/mnt/sdcard/straceout.txt и посмотреть, не появится ли там что-то полезное?   -  person Anton Kovalenko    schedule 10.02.2013
comment
@Антон, я пробовал с опцией 2› .. Но тогда файл не создается ..   -  person srooth    schedule 10.02.2013
comment
Можете ли вы писать сценарии оболочки на Android? Можете ли вы chmod +x написать сценарий, а затем exec его? Затем можно сделать обертку для strace, добавив необходимые перенаправления.   -  person Anton Kovalenko    schedule 10.02.2013


Ответы (1)


Я ожидаю, что это связано с разрешениями. Хороший способ — использовать run-as из adb shell. Например, предположим, что ваше приложение 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" />

  • Если рассматриваемый процесс не является частью вашего приложения, он будет запущен от имени другого пользователя. Таким образом, ваше приложение не будет иметь разрешения на его проверку. Вы ничего не можете с этим поделать, кроме использования рутированного телефона и добавления su -c в командную строку.

Еще пара идей:

  • Попробуйте запустить процесс вместо присоединения к нему, если сможете. Это не должно иметь никакого значения, но может помочь вам отладить проблему.
  • Вместо использования Runtime.getRuntime().exec() попробуйте использовать класс ProcessBuilder. Это позволит вам делать всевозможные полезные вещи:

    • Wait until the process has finished
    • Посмотрите на его стандартный вывод
    • Посмотрите на его стандартную ошибку
    • Получите его код возврата.
person Adrian Taylor    schedule 11.02.2013
comment
Спасибо за ответ, Адриан... Кажется, это связано с тем, что вы указали... Он отлично работает для processId основного приложения (приложение, в котором написан этот код). Но когда он пытается найти любое другое приложение, возникает проблема ... Я работаю с эмулятором, и он укоренен ... Я также пробовал с опцией su -c, но не работает :( - person srooth; 13.02.2013