Отладка и устранение ошибок памяти

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

вр; доктор

  • По возможности используйте язык, безопасный для памяти , чтобы исключить ошибки памяти.
  • Всегда используйте PAC/BTI для смягчения атак ROP/JOP.
  • Всегда используйте GWP-ASan для обнаружения редких ошибок памяти в рабочей среде.
  • Используйте HWAsan для обнаружения ошибок памяти во время тестирования.
  • Устройства с поддержкой MTE обычно не доступны в 2023 году, но используйте их, если вы можете обнаружить ошибки в производстве.
  • Используйте ASan во время тестирования только в крайнем случае.

Безопасные для памяти языки

Язык, безопасный для памяти, — единственный способ полностью избежать и минимизировать ошибки памяти. Другие инструменты на этой странице могут помочь вам сделать небезопасный для памяти код более безопасным и надежным, но использование безопасного для памяти языка устраняет весь класс проблем.

Официально поддерживаемыми языками безопасности памяти для Android являются Java и Kotlin. Большинство приложений Android легче разрабатывать на одном из этих языков.

Тем не менее, существуют разработчики приложений, поставляющие код, написанный на Rust, и если вы читаете эту страницу, у вас, вероятно, есть веская причина нуждаться в собственном коде (переносимость, производительность или и то, и другое). Rust — лучший выбор для безопасного хранения собственного кода на Android. Команда NDK не обязательно сможет помочь вам с проблемами, с которыми вы столкнетесь, если вы пойдете по этому пути, но нам интересно услышать о них !

ПКК/БТИ

Аутентификация указателя и идентификация целевой ветки , также известные как PAC/BTI, представляют собой инструменты снижения риска, подходящие для использования в производственной среде. Хотя это отдельные технологии, они управляются одним и тем же флагом компилятора, поэтому всегда используются вместе.

Эти функции обратно совместимы с устройствами, которые их не поддерживают, поскольку новые используемые инструкции не выполняются на более ранних устройствах. Также необходимо иметь достаточно новое ядро ​​и достаточно новую версию ОС. Поиск paca и bti в /proc/cpuinfo показывает, достаточно ли у вас нового оборудования и достаточно нового ядра. Android 12 (API 31) имеет необходимую поддержку пользовательского пространства.

Плюсы:

  • Может быть включен во всех сборках, не вызывая проблем на старых устройствах или ядрах (но убедитесь, что вы действительно протестировали комбинацию устройство/ядро/ОС, которая ее поддерживает !)

Минусы:

  • Доступно только для 64-битных приложений.
  • Не устраняет ошибки на устройствах, которые его не поддерживают.
  • 1% накладных расходов на размер кода

ГВП-Асан

GWP-ASan можно использовать для обнаружения ошибок памяти в полевых условиях, но частота выборки слишком мала, чтобы обеспечить эффективное устранение ошибок.

Плюсы:

  • Никаких значительных затрат на процессор или память.
  • Простота развертывания: не требует пересборки машинного кода.
  • Работает для 32-битных приложений.

Минусы:

  • Низкая частота выборки требует большого количества пользователей для эффективного поиска ошибок.
  • Обнаруживает только ошибки кучи, но не ошибки стека

ХВАСан

Аппаратный очиститель адресов , также известный как HWASan, лучше всего подходит для отлова ошибок памяти во время тестирования. Это наиболее полезно при использовании с автоматическим тестированием, особенно если вы проводите нечеткие тесты, но в зависимости от требований к производительности вашего приложения его также можно использовать на телефонах высокого класса в тестовых условиях.

Плюсы:

  • Никаких ложных срабатываний
  • Обнаруживает дополнительные классы ошибок, которые ASan не может (использование стека после возврата)
  • Более низкий уровень ложноотрицательных результатов, чем у MTE (1 из 256 против 1 из 16)
  • Меньшие затраты памяти, чем у ASan, его ближайшей альтернативы.

Минусы:

  • Значительные затраты на процессор (~100%), размер кода (~50%) и память (10–35%).
  • До API 34 и NDK r26 требуется перепрошивка образа, совместимого с HWASan.
  • Работает только в 64-битных приложениях

МТЕ

Расширение тегирования памяти , также известное как MTE, является более дешевой альтернативой HWASan. Помимо возможностей отладки и тестирования, его можно использовать для обнаружения и устранения повреждений памяти в рабочей среде. Если у вас есть оборудование для тестирования сборок MTE , вам следует включить его.

Плюсы:

  • Достаточно низкие накладные расходы, чтобы их можно было использовать в производстве для многих приложений.
  • Никаких ложных срабатываний
  • Не требует перестройки кода для обнаружения ошибок кучи (но требует для обнаружения ошибок стека)

Минусы:

  • В 2024 году коммерчески доступных устройств с включенным по умолчанию MTE не будет, но в документации Arm объясняется , как включить MTE для тестирования на Pixel 8/Pixel 8 Pro .
  • Ложноотрицательный результат 1 из 16 против 1 из 256 у HWASan.
  • Доступно только для 64-битных приложений.
  • Требуется создание отдельных библиотек для устройств как с поддержкой MTE, так и без нее.

Асан

Средство очистки адресов , также известное как ASan, является старейшим и наиболее широко доступным из доступных инструментов. Это полезно для обнаружения ошибок памяти во время тестирования и отладки проблем, которые затрагивают только старые устройства, на которых нет других инструментов. По возможности отдавайте предпочтение HWAsan.

Плюсы:

  • Широко доступен. Может работать на устройствах старше KitKat.
  • Никаких ложных срабатываний или негативов при правильном использовании.

Минусы:

  • Трудно правильно собрать и упаковать.
  • Самые высокие издержки из всех вариантов: ~100% ЦП, ~50% размер кода, ~100% использование памяти.
  • Больше не поддерживается
  • Имеет известные ошибки, которые не будут исправлены
,

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

вр; доктор

  • По возможности используйте язык, безопасный для памяти , чтобы исключить ошибки памяти.
  • Всегда используйте PAC/BTI для смягчения атак ROP/JOP.
  • Всегда используйте GWP-ASan для обнаружения редких ошибок памяти в рабочей среде.
  • Используйте HWAsan для обнаружения ошибок памяти во время тестирования.
  • Устройства с поддержкой MTE обычно не доступны в 2023 году, но используйте их, если вы можете обнаружить ошибки в производстве.
  • Используйте ASan во время тестирования только в крайнем случае.

Безопасные для памяти языки

Язык, безопасный для памяти, — единственный способ полностью избежать и минимизировать ошибки памяти. Другие инструменты на этой странице могут помочь вам сделать небезопасный для памяти код более безопасным и надежным, но использование безопасного для памяти языка устраняет весь класс проблем.

Официально поддерживаемыми языками безопасности памяти для Android являются Java и Kotlin. Большинство приложений Android легче разрабатывать на одном из этих языков.

Тем не менее, существуют разработчики приложений, поставляющие код, написанный на Rust, и если вы читаете эту страницу, у вас, вероятно, есть веская причина нуждаться в собственном коде (переносимость, производительность или и то, и другое). Rust — лучший выбор для безопасного хранения собственного кода на Android. Команда NDK не обязательно сможет помочь вам с проблемами, с которыми вы столкнетесь, если вы пойдете по этому пути, но нам интересно услышать о них !

ПКК/БТИ

Аутентификация указателя и идентификация целевой ветки , также известные как PAC/BTI, представляют собой инструменты снижения риска, подходящие для использования в производственной среде. Хотя это отдельные технологии, они управляются одним и тем же флагом компилятора, поэтому всегда используются вместе.

Эти функции обратно совместимы с устройствами, которые их не поддерживают, поскольку новые используемые инструкции не выполняются на более ранних устройствах. Также необходимо иметь достаточно новое ядро ​​и достаточно новую версию ОС. Поиск paca и bti в /proc/cpuinfo показывает, достаточно ли у вас нового оборудования и достаточно нового ядра. Android 12 (API 31) имеет необходимую поддержку пользовательского пространства.

Плюсы:

  • Может быть включен во всех сборках, не вызывая проблем на старых устройствах или ядрах (но убедитесь, что вы действительно протестировали комбинацию устройство/ядро/ОС, которая ее поддерживает !)

Минусы:

  • Доступно только для 64-битных приложений.
  • Не устраняет ошибки на устройствах, которые его не поддерживают.
  • 1% накладных расходов на размер кода

ГВП-Асан

GWP-ASan можно использовать для обнаружения ошибок памяти в полевых условиях, но частота выборки слишком мала, чтобы обеспечить эффективное устранение ошибок.

Плюсы:

  • Никаких значительных затрат на процессор или память.
  • Простота развертывания: не требует пересборки машинного кода.
  • Работает для 32-битных приложений.

Минусы:

  • Низкая частота выборки требует большого количества пользователей для эффективного поиска ошибок.
  • Обнаруживает только ошибки кучи, но не ошибки стека

ХВАСан

Аппаратный очиститель адресов , также известный как HWASan, лучше всего подходит для отлова ошибок памяти во время тестирования. Это наиболее полезно при использовании с автоматическим тестированием, особенно если вы проводите нечеткие тесты, но в зависимости от требований к производительности вашего приложения его также можно использовать на телефонах высокого класса в тестовых условиях.

Плюсы:

  • Никаких ложных срабатываний
  • Обнаруживает дополнительные классы ошибок, которые ASan не может (использование стека после возврата)
  • Более низкий уровень ложноотрицательных результатов, чем у MTE (1 из 256 против 1 из 16)
  • Меньшие затраты памяти, чем у ASan, его ближайшей альтернативы.

Минусы:

  • Значительные затраты на процессор (~100%), размер кода (~50%) и память (10–35%).
  • До API 34 и NDK r26 требуется перепрошивка образа, совместимого с HWASan.
  • Работает только в 64-битных приложениях

МТЕ

Расширение тегирования памяти , также известное как MTE, является более дешевой альтернативой HWASan. Помимо возможностей отладки и тестирования, его можно использовать для обнаружения и устранения повреждений памяти в рабочей среде. Если у вас есть оборудование для тестирования сборок MTE , вам следует включить его.

Плюсы:

  • Достаточно низкие накладные расходы, чтобы их можно было использовать в производстве для многих приложений.
  • Никаких ложных срабатываний
  • Не требует перестройки кода для обнаружения ошибок кучи (но требует для обнаружения ошибок стека)

Минусы:

  • В 2024 году коммерчески доступных устройств с включенным по умолчанию MTE не будет, но в документации Arm объясняется , как включить MTE для тестирования на Pixel 8/Pixel 8 Pro .
  • Ложноотрицательный результат 1 из 16 против 1 из 256 у HWASan.
  • Доступно только для 64-битных приложений.
  • Требуется создание отдельных библиотек для устройств как с поддержкой MTE, так и без нее.

Асан

Средство очистки адресов , также известное как ASan, является старейшим и наиболее широко доступным из доступных инструментов. Это полезно для обнаружения ошибок памяти во время тестирования и отладки проблем, которые затрагивают только старые устройства, на которых нет других инструментов. По возможности отдавайте предпочтение HWAsan.

Плюсы:

  • Широко доступен. Может работать на устройствах старше KitKat.
  • Никаких ложных срабатываний или негативов при правильном использовании.

Минусы:

  • Трудно правильно собрать и упаковать.
  • Самые высокие издержки из всех вариантов: ~100% ЦП, ~50% размер кода, ~100% использование памяти.
  • Больше не поддерживается
  • Имеет известные ошибки, которые не будут исправлены
,

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

вр; доктор

  • По возможности используйте язык, безопасный для памяти , чтобы исключить ошибки памяти.
  • Всегда используйте PAC/BTI для смягчения атак ROP/JOP.
  • Всегда используйте GWP-ASan для обнаружения редких ошибок памяти в рабочей среде.
  • Используйте HWAsan для обнаружения ошибок памяти во время тестирования.
  • Устройства с поддержкой MTE обычно не доступны в 2023 году, но используйте их, если вы можете обнаружить ошибки в производстве.
  • Используйте ASan во время тестирования только в крайнем случае.

Безопасные для памяти языки

Язык, безопасный для памяти, — единственный способ полностью избежать и минимизировать ошибки памяти. Другие инструменты на этой странице могут помочь вам сделать небезопасный для памяти код более безопасным и надежным, но использование безопасного для памяти языка устраняет весь класс проблем.

Официально поддерживаемыми языками безопасности памяти для Android являются Java и Kotlin. Большинство приложений Android легче разрабатывать на одном из этих языков.

Тем не менее, существуют разработчики приложений, поставляющие код, написанный на Rust, и если вы читаете эту страницу, у вас, вероятно, есть веская причина нуждаться в собственном коде (переносимость, производительность или и то, и другое). Rust — лучший выбор для безопасного хранения собственного кода на Android. Команда NDK не обязательно сможет помочь вам с проблемами, с которыми вы столкнетесь, если вы пойдете по этому пути, но нам интересно услышать о них !

ПКК/БТИ

Аутентификация указателя и идентификация целевой ветви , также известные как PAC/BTI, — это инструменты снижения риска, подходящие для использования в производственной среде. Хотя это отдельные технологии, они управляются одним и тем же флагом компилятора, поэтому всегда используются вместе.

Эти функции обратно совместимы с устройствами, которые их не поддерживают, поскольку новые используемые инструкции не выполняются на более ранних устройствах. Также необходимо иметь достаточно новое ядро ​​и достаточно новую версию ОС. Поиск paca и bti в /proc/cpuinfo показывает, достаточно ли у вас нового оборудования и достаточно нового ядра. Android 12 (API 31) имеет необходимую поддержку пользовательского пространства.

Плюсы:

  • Может быть включен во всех сборках, не вызывая проблем на старых устройствах или ядрах (но убедитесь, что вы действительно протестировали комбинацию устройство/ядро/ОС, которая ее поддерживает !)

Минусы:

  • Доступно только для 64-битных приложений.
  • Не устраняет ошибки на устройствах, которые его не поддерживают.
  • 1% накладных расходов на размер кода

ГВП-Асан

GWP-ASan можно использовать для обнаружения ошибок памяти в полевых условиях, но частота выборки слишком мала, чтобы обеспечить эффективное устранение ошибок.

Плюсы:

  • Никаких значительных затрат на процессор или память.
  • Простота развертывания: не требует пересборки машинного кода.
  • Работает для 32-битных приложений.

Минусы:

  • Низкая частота выборки требует большого количества пользователей для эффективного поиска ошибок.
  • Обнаруживает только ошибки кучи, но не ошибки стека

ХВАСан

Аппаратный очиститель адресов , также известный как HWASan, лучше всего подходит для отлова ошибок памяти во время тестирования. Это наиболее полезно при использовании с автоматическим тестированием, особенно если вы проводите нечеткие тесты, но в зависимости от требований к производительности вашего приложения его также можно использовать на телефонах высокого класса в тестовых условиях.

Плюсы:

  • Никаких ложных срабатываний
  • Обнаруживает дополнительные классы ошибок, которые ASan не может (использование стека после возврата)
  • Более низкий уровень ложноотрицательных результатов, чем у MTE (1 из 256 против 1 из 16)
  • Меньшие затраты памяти, чем у ASan, его ближайшей альтернативы.

Минусы:

  • Значительные затраты на процессор (~100%), размер кода (~50%) и память (10–35%).
  • До API 34 и NDK r26 требуется перепрошивка образа, совместимого с HWASan.
  • Работает только в 64-битных приложениях

МТЕ

Расширение тегирования памяти , также известное как MTE, является более дешевой альтернативой HWASan. Помимо возможностей отладки и тестирования, его можно использовать для обнаружения и устранения повреждений памяти в рабочей среде. Если у вас есть оборудование для тестирования сборок MTE , вам следует включить его.

Плюсы:

  • Достаточно низкие накладные расходы, чтобы их можно было использовать в производстве для многих приложений.
  • Никаких ложных срабатываний
  • Не требует перестройки кода для обнаружения ошибок кучи (но требует для обнаружения ошибок стека)

Минусы:

  • В 2024 году коммерчески доступных устройств с включенным по умолчанию MTE не будет, но в документации Arm объясняется , как включить MTE для тестирования на Pixel 8/Pixel 8 Pro .
  • Ложноотрицательный результат 1 из 16 против 1 из 256 у HWASan.
  • Доступно только для 64-битных приложений.
  • Требуется создание отдельных библиотек для устройств как с поддержкой MTE, так и без нее.

Асан

Средство очистки адресов , также известное как ASan, является старейшим и наиболее широко доступным из доступных инструментов. Это полезно для обнаружения ошибок памяти во время тестирования и отладки проблем, которые затрагивают только старые устройства, на которых нет других инструментов. По возможности отдавайте предпочтение HWAsan.

Плюсы:

  • Широко доступен. Может работать на устройствах старше KitKat.
  • Никаких ложных срабатываний или негативов при правильном использовании.

Минусы:

  • Трудно правильно собрать и упаковать.
  • Самые высокие издержки из всех вариантов: ~100% ЦП, ~50% размер кода, ~100% использование памяти.
  • Больше не поддерживается
  • Имеет известные ошибки, которые не будут исправлены
,

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

вр; доктор

  • По возможности используйте язык, безопасный для памяти , чтобы исключить ошибки памяти.
  • Всегда используйте PAC/BTI для смягчения атак ROP/JOP.
  • Всегда используйте GWP-ASan для обнаружения редких ошибок памяти в рабочей среде.
  • Используйте HWAsan для обнаружения ошибок памяти во время тестирования.
  • Устройства с поддержкой MTE обычно не доступны в 2023 году, но используйте их, если вы можете обнаружить ошибки в производстве.
  • Используйте ASan во время тестирования только в крайнем случае.

Безопасные для памяти языки

Язык, безопасный для памяти, — единственный способ полностью избежать и минимизировать ошибки памяти. Другие инструменты на этой странице могут помочь вам сделать небезопасный для памяти код более безопасным и надежным, но использование безопасного для памяти языка устраняет весь класс проблем.

Официально поддерживаемыми языками безопасности памяти для Android являются Java и Kotlin. Большинство приложений Android легче разрабатывать на одном из этих языков.

Тем не менее, существуют разработчики приложений, поставляющие код, написанный на Rust, и если вы читаете эту страницу, у вас, вероятно, есть веская причина нуждаться в собственном коде (переносимость, производительность или и то, и другое). Rust — лучший выбор для безопасного хранения собственного кода на Android. Команда NDK не обязательно сможет помочь вам с проблемами, с которыми вы столкнетесь, если вы пойдете по этому пути, но нам интересно услышать о них !

ПКК/БТИ

Аутентификация указателя и идентификация целевой ветки , также известные как PAC/BTI, представляют собой инструменты снижения риска, подходящие для использования в производственной среде. Хотя это отдельные технологии, они управляются одним и тем же флагом компилятора, поэтому всегда используются вместе.

Эти функции обратно совместимы с устройствами, которые их не поддерживают, поскольку новые используемые инструкции не выполняются на более ранних устройствах. Также необходимо иметь достаточно новое ядро ​​и достаточно новую версию ОС. Поиск paca и bti в /proc/cpuinfo показывает, достаточно ли у вас нового оборудования и достаточно нового ядра. Android 12 (API 31) имеет необходимую поддержку пользовательского пространства.

Плюсы:

  • Может быть включен во всех сборках, не вызывая проблем на старых устройствах или ядрах (но убедитесь, что вы действительно протестировали комбинацию устройство/ядро/ОС, которая ее поддерживает !)

Минусы:

  • Доступно только для 64-битных приложений.
  • Не устраняет ошибки на устройствах, которые его не поддерживают.
  • 1% накладных расходов на размер кода

ГВП-Асан

GWP-ASan можно использовать для обнаружения ошибок памяти в полевых условиях, но частота выборки слишком мала, чтобы обеспечить эффективное устранение ошибок.

Плюсы:

  • Никаких значительных затрат на процессор или память.
  • Простота развертывания: не требует пересборки машинного кода.
  • Работает для 32-битных приложений.

Минусы:

  • Низкая частота выборки требует большого количества пользователей для эффективного поиска ошибок.
  • Обнаруживает только ошибки кучи, но не ошибки стека

ХВАСан

Аппаратный очиститель адресов , также известный как HWASan, лучше всего подходит для отлова ошибок памяти во время тестирования. Это наиболее полезно при использовании с автоматическим тестированием, особенно если вы проводите нечеткие тесты, но в зависимости от требований к производительности вашего приложения его также можно использовать на телефонах высокого класса в тестовых условиях.

Плюсы:

  • Никаких ложных срабатываний
  • Обнаруживает дополнительные классы ошибок, которые ASan не может (использование стека после возврата)
  • Более низкий уровень ложноотрицательных результатов, чем у MTE (1 из 256 против 1 из 16)
  • Меньшие затраты памяти, чем у ASan, его ближайшей альтернативы.

Минусы:

  • Значительные затраты на процессор (~100%), размер кода (~50%) и память (10–35%).
  • До API 34 и NDK r26 требуется перепрошивка образа, совместимого с HWASan.
  • Работает только в 64-битных приложениях

МТЕ

Расширение тегирования памяти , также известное как MTE, является более дешевой альтернативой HWASan. Помимо возможностей отладки и тестирования, его можно использовать для обнаружения и устранения повреждений памяти в рабочей среде. Если у вас есть оборудование для тестирования сборок MTE , вам следует включить его.

Плюсы:

  • Достаточно низкие накладные расходы, чтобы их можно было использовать в производстве для многих приложений.
  • Никаких ложных срабатываний
  • Не требует перестройки кода для обнаружения ошибок кучи (но требует для обнаружения ошибок стека)

Минусы:

  • В 2024 году коммерчески доступных устройств с включенным по умолчанию MTE не будет, но в документации Arm объясняется , как включить MTE для тестирования на Pixel 8/Pixel 8 Pro .
  • Ложноотрицательный результат 1 из 16 против 1 из 256 у HWASan.
  • Доступно только для 64-битных приложений.
  • Требуется создание отдельных библиотек для устройств как с поддержкой MTE, так и без нее.

Асан

Средство очистки адресов , также известное как ASan, является старейшим и наиболее широко доступным из доступных инструментов. Это полезно для обнаружения ошибок памяти во время тестирования и отладки проблем, которые затрагивают только старые устройства, на которых нет других инструментов. По возможности отдавайте предпочтение HWAsan.

Плюсы:

  • Широко доступен. Может работать на устройствах старше KitKat.
  • Никаких ложных срабатываний или негативов при правильном использовании.

Минусы:

  • Трудно правильно собрать и упаковать.
  • Самые высокие издержки из всех вариантов: ~100% ЦП, ~50% размер кода, ~100% использование памяти.
  • Больше не поддерживается
  • Имеет известные ошибки, которые не будут исправлены