Я пытаюсь отладить эту проблему с Android-приложением, которая, кажется, происходит только на устройстве Samsung G5 v4.4.4. Чтобы попытаться проследить источник исключения NullPointerException, это поможет перейти через открытый код java, где сигнализируется NPE. Проблема в том, что когда мы используем эмулятор для Samsung G5 v4.4.4, приложение не бросает NPE , и мы можем перейти через открытый исходный код по строкам. Однако, когда мы подключаем устройство Samsung G5 к Eclipse и пытаемся выполнить код, когда он входит в java с открытым исходным кодом , отображается исходный код, но он явно неверен. Мы знаем это, например, потому что он, кажется, "перешагивает" строки комментариев в open source. Просмотрели многие статьи, связанные с исходным кодом, которые не найдены, но в нашем случае у нас действительно есть правильный исходный код, по крайней мере, в режиме эмуляции эмулятора.
Если кто-нибудь может дать руководство по этой конкретной проблеме отладки, возможно, это может помочь нам изолировать причину проблемы с нашими приложениями (только для Samsung G5). Все предложения приветствуются.
Чтобы немного продвинуться, я шагнул через Samsung (где исходный код в основном неправильный), а затем эмулятор (где исходный вид верен). Оба, предположительно, Android 4.4.4, но мы предполагаем, что Samsung изменил с AOSP. Сравнивая строки кода и некоторые переменные состояния, мы можем "наблюдать" за тем, что делает Samsung, хотя представление исходного кода неверно. Я бы не пожелал этой техники никому, но она помогла нам немного узнать о ошибке, наблюдаемой в нашем приложении на Samsung G5, и сообщила о этом вопросе SO.
Предпочтительный подход в этом случае, вероятно, заключается в том, чтобы найти исходный файл java файла для конкретного поставщика и включить ссылку на него для Eclipse. Тем не менее, поставщики не делают это легко, и мы так и не смогли его найти.
С заботой и терпением, и немного удачи, можно проследить программу, если она имеет достаточно общности с другой программой. В нашем случае Samsung v4.4.4 можно сравнить с Eclipse v4.4.2 и коррелировать, чтобы определить до строки кода, вызывающей исключение. Сначала давайте базовое понимание области кода (в вашем приложении и через соответствующий открытый исходный код), который имеет отношение к проблеме. Затем вы начнете строить карту того, что должно произойти (без ошибок) по сравнению с тем, что "происходит" с устройством отказа. Это был основной процесс:
1. Получите блокнот для записи пошаговых результатов. У нас был столбец для "номера строки устройства", затем "номер строки эмулятора", затем имя модуля/метода, затем инструкция.
2. Установите точку останова на строке кода в программном обеспечении приложения, которое, как вы знаете, приведет к исключению.
3. Запустите эмулятор и выполните отладку до точки останова.
4. Используйте Step Into для записи каждой строки, указанной в трассировке стека. Обратите внимание на модуль/метод, когда он изменяется, и если строка кода кажется релевантной или интересной, запишите ее также.
5. Продолжайте записывать эту информацию в своем блокноте для каждой строки, пока вы не узнаете, что вы продвинулись в точке, где устройство будет генерировать исключение.
6. Остановите выполнение (возможно, перезапустите Eclipse), подключите устройство и выполните отладку до точки останова.
7. В некоторых случаях отображаемый источник, похоже, будет "исполнять" строки комментариев или будет переходить в середину метода, а не в его точку входа. Вы ищете подсказки, которые помогут вам определить, где устройство может работать в исходном коде. Одним из доказательств является то, что количество строк увеличивается с одного шага на другой. Очевидно, что если число строк увеличивается на единицу, то это однострочная инструкция. Если он прыгает на два или несколько, вероятно, что-то. И так далее. Другая ключевая часть информации - это отладочные переменные. Например, если строка кода в известном "хорошем" источнике a = 10;
, то вы можете иногда просматривать переменную a
до этой строки кода (она может быть нулевой, например), а затем после этой строки кода, Если вы правильно указали свое отображение источника, вы увидите, что значение a
изменится на 10.
Это работает только для кода, который относительно одинаков. Например, мы увидели, что источник 4.4.4 Samsung будет в некоторых случаях отключен на 50 или даже на 100+ линиях, как если бы продавец вставил новый метод. Но мы смогли проследить его через источник, который мы могли бы видеть. Стоит ли это время или нет, трудно сказать. В итоге мы поняли, что нулевой указатель был чем-то, чего мы не могли победить, и мы выбрали совершенно другой подход для достижения цели.