Зачем ждать отладчика, а затем прикреплять отладчик к процессу?

Каково значение

android.os.Debug.waitForDebugger();

Я знаю, что нам [иногда] нужно использовать эту функцию для отладки Service, но мой вопрос :

  • ПОЧЕМУ мы должны это делать?
  • Почему существует этот метод? Какой еще цели он служит?
  • Что означает присоединить отладчик к процессу и почему мы должны это делать? Почему именно так нужно отлаживать Service, а не Activity или BroadcastReceiver?

Можно было бы подумать, что отладка любого кода в проекте будет простой задачей. Но это не так. Во всяком случае, не для Service.

В чем причина существования этой специальной процедуры? А для чего еще он используется?

введите здесь описание изображения

Подождите, пока не подключится отладчик. Как только отладчик подключается, это возвращается, поэтому вам нужно будет поставить точку останова после вызова waitForDebugger(), если вы хотите начать трассировку немедленно.

Вопрос ПОЧЕМУ остается без ответа.

ОБНОВЛЕНИЕ:

Я нашел один вариант использования этой функции: когда приложение Android автоматически перезапускается после завершения процесса приложения. Процесс завершается, когда пользователь переключает разрешение среды выполнения в настройках приложения. В более общем случае процесс приложения уничтожается и перезапускается всякий раз, когда...

android.os.Process.killProcess(android.os.Process.myPid());

называется.

Чтобы отлаживать приложение после перезапуска процесса, вы пишете android.os.Debug.waitForDebugger() в своем коде, а затем подключаете отладчик к текущему процессу.

Android: отладка процесса запуска приложения.

Это один из вариантов использования этой функции.

Ссылки:

Отладка службы.

Правильный способ отладки службы в Android Studio?.

Точка останова в службе не работает.

Как отлаживать фоновую службу Android?.

Как отлаживать службу?.

Как подключить отладчик к обработке с первой строки без компиляции кода каждый раз.

вы можете подключить отладчик после того, как приложение уже открыто.

Возможно, связано:

Служба специальных возможностей отключается при каждом запуске отладки

Что означает "Drop Frame" при использовании отладчика Java в Intellij?

Настроить параметры разработчика на устройстве.

Протестируйте свою службу.

Принудительный перезапуск приложения с первого действия.


comment
Человек, который пытался закрыть / понизить этот вопрос, не знает ответа и не может на него ответить. Я задал этот вопрос, потому что его никто не задавал.   -  person Y.S    schedule 24.09.2019
comment
кто сказал в официальной документации по Android, что вам нужно android.os.Debug.waitForDebugger() для отладки кода Service?   -  person pskink    schedule 24.09.2019
comment
Ну, точки останова срабатывают только тогда, когда вы это делаете. В официальных документах это не упоминается, но ведь и много чего нет... :)   -  person Y.S    schedule 24.09.2019
comment
нет, это не так: служебный код не обрабатывается иначе, чем код активности   -  person pskink    schedule 24.09.2019
comment
Вы должны попробовать это в первую очередь. Я знаю, это странно. Вот почему я задал вопрос. Это видели и другие. См. ссылки.   -  person Y.S    schedule 24.09.2019
comment
вопрос действительно интересный, но слишком широкий.   -  person Daniel    schedule 24.09.2019
comment
@Daniel: пенни за твои мысли... :)   -  person Y.S    schedule 24.09.2019
comment
да, я сначала попробовал: я поставил точку останова в первой строке onStartCommand и вызвал startService, и отладчик остановился на этой точке останова - если вы используете службы, которые работают в процессе, отличном от исходного пакета, то напишите это явно в своем вопросе - нормальные сервисы работают без проблем   -  person pskink    schedule 24.09.2019
comment
Я рад за тебя. Однако это известная проблема со службами. Пытаюсь понять зачем это делается, и что значит прицепить отладчик к процессу и ПОЧЕМУ.   -  person Y.S    schedule 24.09.2019
comment
у вашей службы есть атрибут android:process=.. в файле AndroidManifest.xml?   -  person pskink    schedule 24.09.2019
comment
@pskink: нет, но экспортировано = true.   -  person Y.S    schedule 24.09.2019
comment
Таким образом, ваша служба работает в том же процессе, что и весь пакет — просто установите точку останова и отладьте код службы, как вы отлаживаете любой код активности.   -  person pskink    schedule 24.09.2019
comment
@pskink: да, должен. Но это не так.   -  person Y.S    schedule 24.09.2019


Ответы (1)


Я не уверен, что мой ответ был бы правильным, потому что вы могли бы ожидать сложных идей внутри. На самом деле существует довольно простой процесс подключения и перехвата ответов процесса.

введите здесь описание изображения

  • Почему существует этот метод? Какой еще цели он служит?

Как видите, ответить на этот вопрос довольно просто. Из-за состояния гонки во время перехвата процесса вы не сможете остановиться на ранней точке останова и должны вызывать waitForDebugger(). В наиболее частых местах, таких как Service отладка и Application.

  • Что значит "присоединить отладчик к процессу" и почему это нужно делать? Почему именно так нужно отлаживать Службу, а не Активность или BroadcastReceiver?

Это другой вопрос, и я не уверен в контексте здесь, но. Нам нужно вызвать метод и подключиться к процессу вручную в случаях, когда наш Service использует другой процесс из манифеста. Очевидно, что отладочный мост будет установлен на текущем активном процессе с приложением, но поскольку мы можем запустить Service из другого процесса, нам нужно вручную добавить его в отладочный мост и дождаться отладочного соединения.

person GensaGames    schedule 09.10.2019
comment
Очень интересно. Это именно то, что я хочу, с более подробной информацией и примерами. Всегда ли Service запускается в том же процессе, что и приложение, по умолчанию? - person Y.S; 10.10.2019
comment
@Y.S Извините, был занят из-за смены рабочего места) Service всегда работает в том же процессе, что и приложение. Если вы не измените его в манифесте, Почему есть возможность заставить Service работать из другого процесса? Для случаев, когда ваше приложение и фон ДОЛЖНЫ работать отдельно. Просто для экс. Player. Закрывая приложение плеера, вы уничтожаете его процесс, но вам нужно, чтобы музыка играла. Чтобы поддерживать задачи с активной музыкой, у вас может быть Service с отдельным процессом. - person GensaGames; 16.10.2019
comment
@ Y.S Еще один очень сложный пример использования Service с отдельным процессом из-за обработки собственных сбоев. По умолчанию вы НЕ МОЖЕТЕ перехватывать исключения в нативных библиотеках. Вместо этого вы можете поместить собственные рычаги в Service с другим процессом и создать Binder для связи. В случае сбоя фоновая служба отключается, но основное приложение продолжает работать. И может снова перезапустить службу. - person GensaGames; 16.10.2019