отладка kotlin: найдите, что изменяет наблюдаемую переменную

#android-studio #kotlin #debugging #observable

#android-studio #kotlin #отладка #наблюдаемый

Вопрос:

Все еще новичок в kotlin. Поскольку большая часть моего опыта отладки теперь бесполезна, я пытаюсь выяснить методы отладки некоторых радикально новых функций этого языка (с использованием Android studio). Итак, я ищу подсказки, подсказки, стратегии и т. Д.

особенности

Я ищу, когда установлена конкретная переменная: error.code (см. Точку останова 2). Это должно было быть 401, но по какой-то причине оно было изменено на 13! Пытаюсь отследить ее.

Единственное место, где я могу найти, где это значение изменяется в наблюдателе. Когда я устанавливаю отладчик на остановку в точке останова 1, я вижу, что it.code это уже неправильное значение. Но когда я смотрю на все варианты использования error.code, все они являются экземплярами ЧТЕНИЯ — без записи! И единственный вызов handleError() находится в коде наблюдателя (точка останова 1).

  override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
     super.onViewCreated(view, savedInstanceState)

     viewModel.onProvisionError.observe(viewLifecycleOwner, EventObserver {
         handleError(viewModel.lastContext, it).  // breakpoint 1
     })
 

и позже

 private fun handleError(pc: ProvisionContext, error: ProvisioningError) {
    viewModel.errorCode = error.code    // breakpoint 2  <--first noticed error here
    viewModel.errorString = error.errorString
    error.extraDetails?.let {
        viewModel.errorDetails = it
    }
 

Стек вызовов при достижении точки останова 1 не помогает. Вызывающий объект — это просто библиотека : EventObserver.onChanged() . И в этом суть: я не знаю, что вызывает наблюдателя с неверными данными. Любые подсказки будут высоко оценены.

Комментарии:

1. LiveData передает свое значение наблюдателям без изменений, когда значение установлено. Значение не изменяется, если только это не настроенный подкласс LiveData. В этом случае code свойство, очевидно, видоизменяется. Если она не изменяется при выполнении поиска по использованию, следующее, что я бы проверил, это возможно ли, что LiveData был назначен совершенно другой экземпляр класса (независимо от того, какой класс имеет code свойство).

2. Да, я понимаю. И похоже, что происходит что-то, что меня смущает. Генерируются исключения и создаются новые экземпляры — каждый из них может изменять значения, не отображаясь как очевидная запись переменной. Хммм, все еще нужно немного покопаться в коде.