Я пытаюсь обработать код smali с помощью dexlib2, чтобы измерить охват филиала.В частности, я вставляю в каждую ветку (если и соответствующую метку) в основном две инструкции;const-string для загрузки уникальной трассировки для каждой ветви и invoke-static для вызова статического метода.Однако есть несколько проблем:
Сначала мне пришлось увеличить количество регистров на один.Это привело к реорганизации регистров некоторых команд, что, кажется, работает (использовало отражение для увеличения номера регистра, например, первоначально p0 получил v20 путем введения нового локального регистра v21).Тем не менее, я заметил, что некоторые метки, например .end local v15, также требуют такого рода модификации, что, по-видимому, невозможно при использовании dexlib2, поскольку метки не отслеживают ни такую информацию, ни имя.Я также не знаю, в чем смысл / намерение тех .end / .restart. / Start местных меток.Интересны ли эти метки для сборки мусора или также какая-то информация о типе для соответствующих регистров?
Во-вторых, некоторые инструкции принимают только в качестве аргументов v0-v15.Вот почему мне пришлось различать, превышает ли количество локальных регистров 16 или нет.В этом случае я в основном использую две дополнительные инструкции перемещения: (в другом случае инструментарий намного проще)
move-object / 16 vNew, v0 # значение сохранения v0
(две вышеупомянутыеинструкции) # использовать v0 для хранения трассировки
move-object / 16 v0, vNew # восстановить значение v0
Однако недавно я получаю следующую ошибку (и подобные ошибки проверки):
[0x25C] 'this' аргумент 'Ссылка: java.lang.Object' не экземпляр 'Reference: com.android.calendar.GeneralPreferences'
Я заметил, что это имеет значение между использованием перемещенияи переместить объект, но я не знаю о конкретной разнице.Я бы предположил, что константы не являются объектами, в то время как остальные представляют объекты.Если это различие необходимо, мне пришлось бы провести некоторый анализ последнего типа v0 в каждой ветви, что делает все еще более сложным.
В-третьих, я заметил, что метки, связанные с ветвями, ведут себя несколько странно внекоторые редкие случаи.Во всем файле smali есть ветки, которые инструментируются дважды.Отладка показывает, что запрос команды if для ее целевых меток (другой ветви) один раз возвращает больше меток, чем в другой раз.Вот почему я сейчас использую индекс целевой метки (инструкция.getTarget (). GetLocation (). GetIndex ()), но я все еще получаю одну ветвь, которая получает инструментарий дважды.
Я прошулюбая помощь по этому конкретному вопросу, а также общие советы / факты, которые я должен рассмотреть.Есть ли лучший способ получить более подробную информацию об ошибках;вывод logcat не лучший, например, какая именно инструкция вызвала ошибку проверки (шестнадцатеричное значение, рассматриваемое как offest, не имеет для меня никакого смысла).
Заранее спасибо.