Что такое Native crash android?
Приложение Android аварийно завершает работу всякий раз, когда происходит неожиданный выход из-за необработанного исключения или сигнала. … Приложение, написанное с использованием языков с машинным кодом, аварийно завершает работу, если во время его выполнения присутствует необработанный сигнал, такой как SIGSEGV.
Как отследить сбой на Android?
Совет: если вы никогда раньше не видели собственного сбоя, начните с отладки собственного кода платформы Android.
- Прервать.
- Разыменование чистого нулевого указателя.
- Разыменование нулевого указателя младшего адреса.
- FORTIFY неудач.
- Повреждение стека обнаружено -fstack-protector.
- Seccomp SIGSYS от запрещенного системного вызова.
Как узнать, почему приложение дает сбой в Android?
Найдите свои данные
- Откройте Play Console.
- Выберите приложение.
- В меню слева выберите «Качество»> «Android Vitals»> «Сбои и ошибки ANR».
- В центре экрана используйте фильтры, которые помогут найти и диагностировать проблемы. Либо выберите кластер, чтобы получить более подробную информацию о конкретном сбое или ошибке ANR.
Почему игры вылетают на Android?
Одной из причин может быть нехватка памяти или слабый набор микросхем. Приложения также могут аварийно завершить работу, если они не закодированы должным образом. Иногда причиной также может быть пользовательский скин на вашем телефоне Android. Как исправить приложения, которые продолжают вылетать на Android?
Да кто такой этот ваш краш? Современные слова
Как просмотреть журналы сбоев?
Ведение журнала Android
- Включите параметры разработчика на своем телефоне:
- Откройте настройки и перейдите в раздел Система> О телефоне.
- Коснитесь номера сборки 7 раз.
- Вернитесь в Настройки> Система.
- Найдите параметры разработчика.
- Нажмите «Получить отчет об ошибке» и, если будет предложено, выберите «Интерактивный отчет».
Как отладить сбой?
- Найдите последнюю трассировку стека исключений в Android Monitor (logcat)
- Определите тип исключения, сообщение и файл с номером строки.
- Откройте файл в своем приложении и найдите номер строки.
- Посмотрите на тип исключения и сообщение, чтобы диагностировать проблему.
Что такое собственные библиотеки в Android?
Native Development Kit (NDK) — это набор инструментов, который позволяет использовать код C и C ++ с Android и предоставляет библиотеки платформ, которые вы можете использовать для управления собственными действиями и доступа к компонентам физических устройств, таким как датчики и сенсорный ввод. … Повторно используйте свои собственные библиотеки C или C ++ или библиотеки других разработчиков.
Что такое надгробия в Android?
Надгробие — это файл с дополнительными данными о сбойном процессе. В частности, он содержит трассировки стека для всех потоков в аварийном процессе (а не только для потока, который перехватил сигнал), полную карту памяти и список всех открытых файловых дескрипторов.
ЧТО ТАКОЕ КРАШ?
Как вручную вывести приложение из строя на Android?
Я перечисляю ниже способы сбоя приложения
- Попробуйте вставить тост в ветку.
- Измените ориентацию при загрузке данных в RSS-канал.
- Нажмите кнопку «Назад» при использовании панели вкладок. (вылетает на настраиваемой панели вкладок)
- Нажмите кнопку «Назад» в TabGroupActivity, не отменяя функцию возврата.
20 центов 2011 г.
Как проверить журналы Android?
Как получить журналы устройства с помощью Android Studio
- Подключите устройство Android к компьютеру через USB-кабель.
- Откройте Android Studio.
- Щелкните Logcat.
- Выберите «Без фильтров» на панели в правом верхнем углу. …
- Выделите нужные сообщения журнала и нажмите Command + C.
- Откройте текстовый редактор и вставьте все данные.
- Сохраните этот файл журнала как.
Что такое файл LogCat в Android?
Logcat — это инструмент командной строки, который выгружает журнал системных сообщений, включая трассировку стека, когда устройство выдает ошибку, и сообщения, которые вы написали из своего приложения с помощью класса Log. … Для получения информации о просмотре и фильтрации журналов из Android Studio см. Запись и просмотр журналов с помощью Logcat.
Как очистить кеш Android?
В приложении Chrome
- На вашем телефоне или планшете Android откройте приложение Chrome.
- В правом верхнем углу нажмите на значок «Ещё».
- Коснитесь История. Очистить данные просмотра.
- Вверху выберите временной диапазон. Чтобы удалить все, выберите Все время.
- Установите флажки рядом с «Файлы cookie и данные сайтов» и «Кэшированные изображения и файлы».
- Коснитесь Очистить данные.
Как мне предотвратить сбои в игре?
Что делать, если игра не запускается
- Убедитесь, что ваш компьютер соответствует минимальным требованиям. …
- Перезагрузите компьютер и попробуйте еще раз. …
- Обновите свои видеодрайверы. …
- Отключите антивирус и другое постороннее ПО. …
- Начни отключать все от сети. …
- Попробуйте запустить игровой клиент в режиме администратора. …
- Убедитесь, что игра установлена правильно. …
- Google это.
Как мне запретить приложениям работать в фоновом режиме на Android?
Проведите пальцем вниз по списку и найдите приложение (я), которое, в частности, вы хотите постоянно запускать. Нажмите на название приложения. Из двух вариантов установите флажок «Не оптимизировать». Некоторые пользователи Android предлагали заблокировать приложение, чтобы решить эту проблему.
Почему Google Планета Земля продолжает вылетать на Android?
Очистка кеша и данных из приложения Карты или Google Карты потенциально может решить проблему, если она вызвана поврежденным кешем или временными файлами, хранящимися в приложении.
Источник: frameboxxindore.com
Краш игры или программы: как исправить (ошибка APPCRASH Windows 7)?
Вероятно, любой заядлый геймер, так или иначе, хоть раз в жизни сталкивался с вылетом любимой игры с выдачей сообщения о сбое в самый неподходящий момент. А саму ситуацию как исправить? Ошибка APPCRASH (Windows 7 берем в качестве примера операционной системы), к сожалению, относится к самым распространенным явлениям.
Что за ошибка APPCRASH?
Для начала рассмотрим природу этого сбоя и возможные причины его появления. Ну, не на ровном же месте появилось сообщение, содержащее в описании нечто вроде «APPCRASH. Ошибка». Как исправить (Windows 7), станет ясно после понимания источников ее появления.
Если же рассмотреть трактовку такого сбоя, можно исходить из самого сокращения Application Crash. Грубо говоря, это «вылет» (краш) используемого приложения. Как уже понятно, чаще всего таким сбоям подвержены именно игры с их высокими требованиями к системе и достаточно высокой загрузке ресурсов компьютера на всех уровнях: и в «железной» конфигурации, и в программной среде.
Возможные причины появления сбоя
Вообще, такой сбой может проявляться и в ситуации с конфликтами «железа», и при сбоях в программной среде, и при заражении вирусами, и при многих других обстоятельствах. Тем не менее можно выделить несколько главных аспектов:
- некорректно установленная или взломанная программа;
- воздействие вирусов;
- отсутствие обновления системы;
- неактуальные драйверы;
- отсутствие обновлений DirectX;
- неактуальная версия NET. Framework;
- устаревшая версия пакета Microsoft Visual C++.
Теперь посмотрим на сообщение, содержащее указание на сбой «APPCRASH. Ошибка». Как исправить (Windows 7 64 или 32 бита)? Для этого, как уже, наверное, понятно, предусмотрено несколько базовых решений.
Проверка на вирусы
Оговоримся сразу: вопросы, касающиеся установки неофициальных или «крэкнутых» версий тех же игр, сейчас рассматриваться не будут. Единственное, что можно посоветовать, так это только приобрести лицензионную игру и проверить ее на совместимость со своей компьютерной системой.
Но первым делом следует проверить систему на присутствие вирусов, которые достаточно часто маскируются под системные процессы, а Windows, то ли «по доброте душевной», то ли «по наивности», обращается не к оригинальному процессу, а к вирусу.
При этом, если уж такая беда приключилась, и штатный антивирус угрозу вовремя не распознал, рекомендуется использовать портативные сканеры вроде Kaspersky Virus Removal Tool, Dr. Web Cure It! или что-то подобное. А вообще, по большому счету наилучшим решением станет загрузка со специального антивирусного диска типа Kaspersky Secure Disc, когда антивирус загружается до старта Windows и производит проверку на всех уровнях, включая оперативную память.
Сбой игры. Как исправить (ошибка APPCRASH Windows 7)? Простейшее решение
Теперь перейдем непосредственно к решению проблемы. У нас имеется сообщение о сбое «APPCRASH. Ошибка». Как исправить (Windows 7 32 бита или 64 бита в данном случае не играет роли)?
Самое разумное, что можно предпринять, откатить систему до предыдущего состояния, когда все работало. Для этого, если кто не знает, необходимо использовать стандартную процедуру восстановления из соответствующего раздела в «Панели управления». Соответственно, и точку восстановления нужно выбрать ту, что предшествовала появлению сбоя. Но это самое простое решение, которое, увы, срабатывает не всегда. Проблема может быть гораздо глубже.
Сбой APPCRASH. Ошибка: как исправить (Windows 7 64 и 32 бита)?
Теперь рассмотрим все остальные варианты. Если ничего не поможет, можно будет попытаться отключить один компонент, но об этом чуть позже.
Итак, у нас имеется сбой с описанием сбоя, и надо придумать, что с этим делать и как исправить. Ошибка APPCRASH Windows 7 (в смысле операционной системой) интерпретируется как некорректная реакция на запуск игры, хотя бы только потому, что в системе отсутствуют обязательные к установке пакеты критических обновлений. Такая ситуация может проявляться даже при отключенной системе автоматического апдейта. Система все равно будет следить за ними (так уж в ней заложено).
Допустим, это не помогает, и снова появляется так называемая APPCRASH-ошибка. Как исправить, Windows 7 умалчивает, но можно предположить, что некоторые устройства, задействованные при запуске игры, попросту имеют устаревшие драйверы. Заметьте, «Винда» относительно неактуальных версий драйверов не выдает никаких указаний или предупреждений, а обновлять их вручную – дело весьма трудоемкое, тем более, тут совершенно непонятно, что именно нужно обновлять.
На помощь приходят утилиты вроде Driver Booster, являющиеся мощными (к тому же бесплатными) пакетами с функцией автоматического поиска и обновления драйверов с загрузкой содержимого непосредственно с официального сайта производителя оборудования.
Идем дальше. Снова сбой. После всего предпринятого сложившуюся ситуацию-то как исправить? Ошибка APPCRASH Windows 7 выдается с завидным постоянством. Что делать? Идем на официальный сайт Microsoft и скачиваем самые последние обновления для DirectX, NET.
Framework и Microsoft Visual C++. Во-первых, они требуются для нормальной работы в среде Windows для любой современной игры. А во-вторых, загрузить их можно совершенно бесплатно, после чего останется только установить пакеты, правда, в ручном режиме. Автоматический апдейт здесь не предусмотрен.
Напоследок отключаем службу DEP
Если из всего вышеперечисленного ничего не помогает, остается предпринять самый решительный и последний шаг (ну не удалять же игру, если она до этого работала как часы?).
К сожалению, такой сбой почему-то наиболее часто проявляется именно в «семерке». В других версиях ОС Windows он встречается крайне редко. Считается, что причиной может быть несколько недоработанный модуль DEP, препятствующий выполнению некоторых операций. Он-то и может распознавать запуск игры как попытку несанкционированного доступа к памяти. А раз так, его нужно просто отключить.
Запускаем командную строку от имени админа, после чего прописываем в ней bcedit /set nx AlwaysOff.
Можно отключить службу и в параметрах быстродействия, но использование командной строки – способ более быстрый и надежный.
Заключение
Вот, собственно, и все рекомендации, позволяющие понять, как устранить ошибку APPCRASH. Windows 7 в этом отношении, к сожалению, выглядит не с лучшей стороны, хотя, если последовательно применять все вышеописанные методы, весьма вероятно, можно добиться положительного результата, а игры перестанут «вылетать» или, что называется, «глючить». Да, игры были взяты исключительно в качестве наиболее обобщающего примера, но данный сбой может проявляться и при запуске других программ и приложений.
Источник: fb.ru
CRASH
I [°Ї‡Џ] crash.wav 1. сущ. 1) грохот, треск (обыкн. при столкновении, падении; тж. о ударе грома, громкой музыке и т. п.) The thunder burst with a terrific crash. — Раздался оглушительный удар грома. Syn: crack, crackle 2) авария, крушение (самолета и т. п.), столкновение (автомобилей и т. п.) She died in a car crash. — Она погибла в автокатастрофе.
3) банкротство, крах a stockmarket crash — обвал на фондовой бирже Syn: failure, ruin 4) сл. ломка (у наркоманов) 2. прил. 1) интенсивный, дающий эффект через короткое время crash course in English — интенсивный курс английского языка crash diet — интенсивная диета (способствующая быстрому похудению) 2) аварийный crash landing — аварийная посадка crash barrier — барьер на автостраде, разделяющий полосы с противоположным движением crash helmet — защитная каска; шлем мотоциклиста, автогонщика 3. гл. 1) а) — crash through, crash down с грохотом разрушать, разбивать; рушиться с грохотом, треском, разбиваться вдребезги The tempest that crashes down the forest. — Буря с грохотом валит деревья в лесу. Syn: shiver II 2., shatter 1., smash 2. б) потерпеть аварию, крушение 2) а) производить какие-л. действия или двигаться с грохотом, треском; грохотать (о громе и т. п.); заставлять двигаться с грохотом Two women literally crashing hoarse thunder out of a piano. — Две женщины, в буквальном смысле обрушившиеся на фортепиано и извлекающие из него грохочущие резкие звуки. Two other men crashed their horses through the brushwood. — Два других человека направили своих лошадей в кусты и с треском поскакали через заросли. They crashed into the room. — Они с грохотом ворвались в комнату. б) проскакивать светофор, когда должен загореться или уже загорелся красный свет 3) потерпеть крах, обанкротиться 4) амер.; разг. являться без приглашения crash a party, to crash the gate — явиться без приглашения Syn: gate-crash 5) испытывать последствия наркотического отравления • — crash in — crash into — crash out — crash with 4. нареч. с грохотом, с треском II [°Ї‡Џ] crash.wav сущ. плотная, суровая ткань (используемая для драпировки, укрепления переплетов книг и др.). смотреть
CRASH
1. сущ.1) общ. крушение, авария2) бирж. крах, банкротство, обвал (резкое падение цен на акции, приводящее к значительным убыткам биржевых торговцев и и. смотреть
CRASH
transcription, транскрипция: [ ̈ɪkræʃ ]crash vi sl 1. Can I crash on your floor tonight? Можно мне сегодня переночевать у вас на полу? Can I crash with. смотреть
CRASH
I vi sl 1) Can I crash on your floor tonight? — Можно мне сегодня переночевать у вас на полу? Can I crash with you for tonight? — Можно мне сегодня перекантоваться у тебя? We crashed at friends’ houses — Мы ночевали у друзей The hippies had been up all night because they couldn’t find a place to crash — Хиппи не спали всю ночь, потому что не могли найти место, где переночевать I heard about this place and hoped maybe I could crash here for a day or two — Я слышал об этом месте и подумал, а не перекантоваться ли мне там несколько дней 2) AmE Any drug addict fears the moment of crashing — Любой наркоман боится момента, когда начинается ломка She’s crashing — У нее ломка We keep these pills here to help if we crash — Мы держим эти таблетки на тот случай, если у нас начнется ломка 3) AmE My stereo crashed — У меня испортился стереоприемник I wouldn’t like for my TV to crash too — Я не хотел бы, чтобы у меня также вышел из строя телевизор 4) AmE Let’s get him home before he crashes for good — Давай отведем его домой, прежде чем он отрубится I crashed about midnight — К полуночи я уже напился до потери пульса II vt infml 1) Their mob will crash the prison and turn them loose — Их банда ворвется в тюрьму и освободит их Hoover’s men crashed Doc’s apartment — Люди Гувера проникли в квартиру доктора 2) We crashed the party — Мы явились без приглашения I’m glad to see that he crashed television successfully — Я рад видеть, что он успешно прорвался на телевидение Some clown tried to crash the rally but my dad called the cops — Один придурок пытался прорваться на тусовку, но мой предок вызвал полицию. смотреть
CRASH
Crash: translationA sudden and significant decline in the value of a market. A crash is most often associated with an inflated stock market. Causes for. смотреть
CRASH
1. n 1) гуркіт, грюкіт; тріск; 2) сильний удар під час падіння, зіткнення; 3) поломка; катастрофа, аварія (літака тощо); ~ boat швидкохідний рятувальний катер; ~ crew військ. аварійна команда; ~ truck військ. аварійний вантажний автомобіль; ~ wagon розм. карета швидкої допомоги; 4) крах, банкрутство; 5) сурове (грубе) полотно; 2. adv з гуркотом, з тріском; the stone came ~ through the window камінь з тріском влетів у вікно; 3. v 1) падати, валитися з тріском (гуркотом) (тж ~ through, ~ down); 2) розбити, розтрощити; зруйнувати; зламати; 3) зазнати аварії; розбитися (при падінні); 4) наскочити (на щось); урізатися (в щось); ударитися з гуркотом; the car ~ed up against a wall автомобіль з грюкотом урізався в стіну; 5) гриміти (про грім); 6) зазнати невдачі (краху); розоритися; 7) амер. прийти без запрошення; to ~ the gate а) бути непроханим гостем; б) пройти без квитка («зайцем») (в театр тощо). смотреть
CRASH
1. n1) катастрофа; аварія (літака); аварійна відмова2) пошкодження, руйнування2. v1) зазнати аварії2) зазнавати пошкоджень, руйнувати(ся)•- air crash- . смотреть
CRASH
I1. n1) гуркіт; тріск2) крах, банкрутство3) катастрофа, аварія2. v1) падати; валитися з тріском, гуркотом (часто з through, down)2) розбити; розтрощит. смотреть
CRASH
n1) авария; катастрофа 2) крах, банкротство •to be killed in an air crash — погибнуть в авиационной катастрофеto cushion the impact of the crash — смяг. смотреть
CRASH
crash: übersetzungcrash crash [kʀa∫] <[e]s> Substantif masculin Absturz masculin
CRASH
1. Быстрое и глубокое падение уровня цен на рынке. 2. Аварийный отказ компьютерной системы. О программе говорят, что она отказала, если она после запуска “зависает” (в какой-то момент перестает выполняться). Если в компьютере произошла механическая поломка или какая-либо из программ, запущенных компьютером, имеет такие сбои, что приводит к остановке работы компьютеpa, говорят, что произошел аварийный отказ компьютера. смотреть
CRASH
1) авария; столкновение 2) грохот; треск •- angle crash- central crash- frontal crash- head-on crash- side crash- skidding crash* * *• /vi/ потерпеть к. смотреть
CRASH
падать, рушиться с треском, грохотом (часто crash through, crash down); грохотать; to crash into smth. наскочить на что-л. с треском разбить, разрушить; вызвать аварию потерпеть аварию, крушение; разбиться при падении потерпеть крах amer. coll. проникнуть ‘зайцем’ суровое полотно, холст грохот; треск; сильный удар при падении, столкновении авария, поломка, крушение; крах, банкротство. смотреть
CRASH
1) грохнуться2) катастрофа– crash landing– crash accelerometer– crash crew– crash helmet– crash on landing– crash program– crash tendercrash locator be. смотреть
CRASH
1. авария || терпеть аварию 2. повреждение; разрушение || повреждать(ся); разрушать(ся) — air crash — fatal crash
CRASH
Аварійна відмоваполомкааваріяаварійна ситуаціязбійкрахаварійне завершенняпризводити до аварії
CRASH
m ав. посадка самолёта на «брюхо», авария
CRASH
n. грохот, треск, сильный удар при падении, сильный удар при столкновении; крушение, авария; поломка; крах, банкротство; суровое полотно, холст; зависание компьютера при котором его необходимо перезагрузить [комп.]. смотреть
CRASH
крах, фатальный сбой. Аварийное завершение работы системы. Данные процессов, выполнявшихся в момент краха, могут находиться в неопределенном состоянии, и их согласованность (consistency) может быть нарушена. смотреть
CRASH
v. падать, грохнуться, валиться, рушиться с треском; разбить, вызвать аварию, разбиваться, разбиться при падении, потерпеть аварию, потерпеть крушение; грохотать; грянуть; потерпеть крах; проникнуть ‘зайцем’. смотреть
CRASH
англ. m -s, -s1) столкновение2) ком. крах, банкротство
CRASH
• 1) /vi/ трещать; 2) /vi/ разбиваться • 1) треск; 2) авария
CRASH
Крах, банкротство || потерпеть крах- stock market crash
CRASH
авария; разрушение; полный выход из строя; поломка* * *• полный выход из строя • разрушение
CRASH
1) розм. нещасний випадок 2) сл. вбивати
CRASH
m ав.посадка самолёта на «брюхо», авария
CRASH
̈ɪkræʃкрах, банкротство, крушение, авария развиться, потерпеть аварию, потерпеть неудачу,крах, разориться
CRASH
-en, -erавария (падение) самолёта
CRASH
авария; аварийная ситуация- system crash
Источник: computer.slovaronline.com
Что такое краш в игре?
Крашем называется вылет из приложения в процессе работы (в данном случае игры). Причины могут быть разными: ошибка в программном коде или подобные ошибки (когда доходишь до какого-то места в игре и она вырубается), нехватка оперативной памяти, просто единичный вылет, причины которого не так важны, т.к. игра «крашнулась» 1 раз и далее такого не происходит. Обычно самостоятельно игру проверить на наличие каких-то внутренних ошибок, из-за которых она может не запускаться или вылетать, достаточно проблематично. Но если программа числится в таких приложениях, как Battle.net, Steam и т.д., то там клиент каждой игры можно проверить на наличие недостающих файлов.
автор вопроса выбрал этот ответ лучшим
Источник: www.bolshoyvopros.ru
Краш-репорты в *nix: backtrace, SEGFAULT (и reinterpret_cast)
Привет, уважаемый хабраюзер!
Все разработчики программ рано или поздно сталкиваются с проблемой падения программы у пользователя. Но далеко не все при этом могут получить доступ к конкретному компу, на котором что-то идёт не так, запустить там gdb и повторить падение. И даже получить информацию от пользователя бывает крайне сложно: в багтрекер (или техподдержку) приходит сообщение а-ля «программа падает, что делать?», а вот технической информации, так важной для разработчика, пользователь не прилагает к своему сообщению. Да ещё и не каждый напишет об этом! Просто перестанет пользоваться программой — и всё.
Некоторые ОС предлагают отправить краш-репорт разработчикам. Но! Разработчикам ОС, а не Вам, то есть совсем не тем людям, которым это действительно нужно! И тут на помощь приходят собственные краш-репорты, которая Ваша программа должна бы отправить на Ваш сервер. Но как их сделать?
Как правильно обработать SEGFAULT и при этом отправить вразумительную информацию разработчику?
На Хабре уже была интересная статья от Arenim, посвящённая обработке крашей. Вкратце повторю суть: мы ловим POSIX-сигнал SIGSEGV, а после его обработки выходим из программы.
void catchCrash(int signum) < reportTrouble(); // отправляем краш-репорт signal(signum, SIG_DFL); // перепосылаем сигнал exit(3); //выходим из программы >int main() < signal(SIGSEGV, catchCrash); //— . —// >
Теперь дело за малым: локализовать проблему! И хотя указанный выше способ работает и в Windows, нормальный backtrace мы можем получить только в *nix (на самом деле, можно его получить и в винде, но для этого придётся распространять дебажную сборку, что не очень хорошо). Итак, курим мануалы и делаем вот что:
И всё, репорт ушёл на сервер! Если хочется, можно перед отправкой спросить пользователя — а не отправить ли нам репортик? Конечно, в GUI-программе это немного опасно — ведь после SEGFAULT’а адекватность внутреннего состояния графического фреймворка (ну или голых иксов) не гарантируется, так что тут лучше пользователя предупредить заранее (в лицензионном соглашении, к примеру) и поставить в настройки галочку «отправлять анонимные репорты». Главное — не вписывать в репорт личной информации пользователя и прочих данных, это не только аморально, но и может преследоваться по закону (если, конечно, в конце лицензионного соглашения мелкими буквами не прописано согласие пользователя на это).
Испытаем теперь изложенный метод на практике. Создадим простенькую программу с простеньким классом и простенькими дополнительными функциями. И попробуем этот код уронить. Самое простое — вызвать метод у нулевого указателя на класс, но это слишком примитивно, пусть лучше указатель указывает «в небо», так интереснее. Как этого добиться? Ну конечно же применить всеми нами так горячо любимый reinterpret_cast ! И вот, чтобы бэктрейс был интереснее, создаём функции goCrash() и crash(void *) .
int crash(void *obj) < Crasher *crasher = reinterpret_cast(obj); crasher->doSomething(); return -1; > void goCrash() < const char *str = «Hello, crash!»; const char *str2 = «Hello again, crash!»; char str3[200]; sprintf(str3, «%stt%sn», str, str2); long long add = rand() % 20000 + 1500234000l; // fire in my leg! crash(reinterpret_cast(str3 — add)); >
Что ж, похоже, что мы кастанём к нашему классу Crasher некий заранее не известный адрес. Весьма любопытно! Давайте же класс объявим:
#define P_DOUBLE_COUNT 10000 class Crasher < public: // c-tor Crasher() < myPrivateString = new char[100]; sprintf(myPrivateString, «%sn», «that’s my private string!»); myPrivateInteger = 100; for (int i = 0; i < P_DOUBLE_COUNT; ++i) myPrivateDoubles[i] = i / 100.0; >// func void doSomething() < // here we can (?) crash fprintf(stderr, «%sn», «That’s a function!»); doSomethingPrivate(); >private: void doSomethingPrivate() < // crash? oh, no. fprintf(stderr, «%s myPrivateInteger == %dn», «That’s a private function!», myPrivateInteger); fprintf(stderr, «myPrivateDoubles[1] == %fn», myPrivateDoubles[1]); fprintf(stderr, «myPrivateString == %pn», myPrivateString); // still alive? crash! crash! crash! ((Crasher*)NULL)->doSomething(); > private: char *myPrivateString; int myPrivateInteger; double myPrivateDoubles[P_DOUBLE_COUNT]; >;
Заметим, что в функции doSomethingPrivate() у нас всё ж вызывается функция у нулевого указателя. Так, на всякий случай. Вдруг после вызова doSomething() для неопределённого адреса программа ещё выживет?
Можно теперь собрать и запустить нашу программу. И что же мы увидим? Программа отработала успешно, но curl ругнулся, что сервер не найден. Ну да это ерунда, можно временно заменить его вызов на cat crash_report.txt дабы лицезреть наш краш-репорт сразу же. Итак, что ещё мы видим?
А видим мы строчку «That’s a function!» , выведенную из метода doSomething() ! Интересно, не правда ли? Указатель указывает в небо, а методы работают? Ну, не совсем так.
Программа ведь крашится (скорее всего) на вызове doSomethingPrivate() , и бэктрейс нам об этом красноречиво докладывает:
0 segfault 0x000000010d0a98c8 _Z13reportTroublev + 40 1 segfault 0x000000010d0a99d0 _Z10catchCrashi + 16 2 libsystem_c.dylib 0x00007fff99b5dcfa _sigtramp + 26 3 . 0x00007fff00000000 0x0 + 140733193388032 4 segfault 0x000000010d0a9c67 _ZN7Crasher11doSomethingEv + 71 5 segfault 0x000000010d0a9880 _Z5crashPv + 32 6 segfault 0x000000010d0a9ac7 _Z7goCrashv + 199 7 segfault 0x000000010d0a9b33 main + 67 8 segfault 0x000000010d0a9854 start + 52
Давайте для начала поэкспериментируем, не будем при вызове crash() добавлять лишний сдвиг адреса, что выведет программа? Где крашнется? Кхм!
That’s a function! That’s a private function! myPrivateInteger == 1752392050 myPrivateDoubles[1] == 60993401604041306737928347282702617388988841504491171140800281285302442927306116721201046092641903128620672849302937378251940003901836219046866981678295779355600933772275817062376375849852470059862498765690530537583237171035779906888043337758015488.000000 myPrivateString == 0x63202c6f6c6c6548 That’s a function! 0 segfault 0x0000000109a5e8c8 _Z13reportTroublev + 40 1 segfault 0x0000000109a5e9d0 _Z10catchCrashi + 16 2 libsystem_c.dylib 0x00007fff99b5dcfa _sigtramp + 26 3 . 0x0000040000000000 0x0 + 4398046511104 4 segfault 0x0000000109a5ec67 _ZN7Crasher11doSomethingEv + 71 5 segfault 0x0000000109a5ec1a _ZN7Crasher18doSomethingPrivateEv + 208 6 segfault 0x0000000109a5ec67 _ZN7Crasher11doSomethingEv + 71 7 segfault 0x0000000109a5e880 _Z5crashPv + 32 8 segfault 0x0000000109a5eac4 _Z7goCrashv + 196 9 segfault 0x0000000109a5eb33 main + 67 10 segfault 0x0000000109a5e854 start + 52
Видно, что крашится на втором вызове doSomethingPrivate() , а первый прошёл на ура, хотя и вывел нам не совсем то, что задумывалось.
Итак, почему же даже при вызове метода у нулевого указателя сегфолт возникает только на второй функции? Чем они отличаются? Опытные плюсоводы уже давно догадались и не читают эту статью, а для остальных поясню. Они отличаются использованием переменных класса!
Если переменные не используются, то абсолютно не важно, у какого указателя вызывать функцию, ведь скрытый параметр this не используется, а именно в нём у нас лежит мусор. Во втором примере (без сдвига) вызывается приватная функция с this ‘ом, указывающим на нашу строку, и наши переменные класса будут указывать на части этой строки и содержать, соответственно, любой мусор, входящий в неё. А в первом случае указатель, скорее всего, просто будет ссылаться на недоступную для программы область памяти, поэтому закрашится уже первый вызов приватной функции.
К чему в данной статье описание столь элементарных вещей? Ну как же, надо ведь показать, как программы крашить! И объяснить, почему вызов методов классов по невалидным указателям не всегда приводит к крашу. Если интересен полный код, прошу, как всегда, на гитхаб.
В общем, удачной отладки! И поменьше краш-репортов 😉
Источник: habr.com