Сбой В Программе (Компьют.) 4 Буквы

Решение этого кроссворда состоит из 4 букв длиной и начинается с буквы Г


Ниже вы найдете правильный ответ на Сбой в программе (компьют.) 4 буквы, если вам нужна дополнительная помощь в завершении кроссворда, продолжайте навигацию и воспользуйтесь нашей функцией поиска.

ответ на кроссворд и сканворд

Суббота, 27 Апреля 2019 Г.




ГЛЮК

предыдущий следующий



ты знаешь ответ ?

ответ:

связанные кроссворды

  1. Глюк
    1. (gluck) кристоф виллибальд (1714—1787) австрийский композитор, оперы «орфей и эвридика», «альцеста», «парис и елена», «ифигения в авлиде», «армида», «ифигения в тавриде»
    2. Ошибка, сбой программы на языке компьютерщиков
  2. Глюк
    1. Композитор xviii в. , автор оперы «орфей и эвридика 4 буквы
    2. Немецкий, австрийский композитор, опера «альцеста 4 буквы
    3. Ошибка в программе (жаргон.) 4 буквы
    4. Ошибка программы на языке компьютерщиков 4 буквы

похожие кроссворды

  1. (жарг. ) непонятный сбой в программе (если повторяется, то это уже баг) 4 буквы
  2. Сбой в программе 4 буквы
  3. Ошибка, сбой программы на языке компьютерщиков
  4. Сбой в работе компьютера
  5. В астрономии — сбой периода вращения пульсара
  6. Нервный сбой 4 буквы
  7. Нервный сбой от стресса 4 буквы
  8. Сбой психики 4 буквы
  9. Сбой в памяти 7 букв
  10. Сбой при выстреле 6 букв
  11. Сбой у компьютера (разг.
    ) 4 буквы
  12. Сбой нервишек 4 буквы
  13. Сбой в экономики 6 букв
  14. Сбой в работе электрической сети, короткое __
  15. Психический сбой 4 буквы
  16. Сбой координации движений 7 букв
  17. Сбой у компьютера 4 буквы
  18. Сбой в экономике 6 букв
  19. Экспертная система (компьют.
    )
  20. Название русского текстового редактора (компьют.) 8 букв

Читать онлайн «Детский мир. Книга первая. Сбой в программе», Андрей Васильев – ЛитРес, страница 2

Побег

– А я не верю, – угрюмо произнес Зуб, когда они возвращались в жилую зону. – Это ты специально придумал. Чтобы отговорить нас от побега.

– Так чего я раньше так не сделал? – возмутился Джем. – Я же все это время не против был.

Они шли по центральному коридору. Зуб вдруг резко остановился и повернулся к ребятам.

– Ладно, делаем, как задумали. Сейчас расходимся по отсекам. Как объявят посадку, собираемся в транспортном трюме, кто не передумает. А я снова скажу: планета большая, вся в лесах и горах. Не найдут они нас. А мы проживем – как древние люди. Мы же все для этого знаем. Так что думайте, кто со мной. А я все равно убегу, даже один. Под надзор Компании не пойду.

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

Скоро в отсеке стало шумно – многие из его обитателей тоже решили лечь в капсулы заранее, хотя находиться в них никому не нравилось. Эти узкие норы в стене вызывали у людей чувство беспомощности и страха, едва они в них забирались. Только все это скрывали. Если хочешь навсегда покинуть подземный мирок Марса с теснотой и затхлым воздухом – будь добр согласиться на такую экономию места.

Они согласились. Правда, когда проходили метеорный поток и на капсулах для безопасности закрылись крышки, кое-кто запаниковал. Даже лекарство специальное им давали.

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

Джем наблюдал, как люди выдвигают из капсул ложа, неуклюже умещаются на них и закатываются в квадратные отверстия, рядами зиявшие в стенах отсека. Кто-то делал это с пола, а кому-то приходилось забираться на третий ярус – под самый потолок.

Меньше, чем через час, из динамика в отсеке прозвучало сообщение о начале посадки и стало еще шумней – прибыли остальные пассажиры и столпились в узком проходе между стенами.

Гремели ложа, выкатываемые из капсул и закатываемые обратно; слышалась ругань тех, кому не особо расторопные загородили путь к их местам; галдели дети, хвастаясь друг перед другом умением заскакивать внутрь своей норы, не выдвигая ложа.

Через десять минут все стихло – колонисты улеглись. Старший отсека прошел с проверкой, доложил в микрофон на стене, что все на местах, и залез в свою капсулу.

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

Отверстия в стенах в основном пестрели ногами – забираться в них вперед головой было удобнее. А те немногие, кто предпочел разместиться по инструкции, головой наружу, думали лишь о предстоящей посадке, глядя в потолок перед собой. Поэтому бегство Джема никто не увидел, а из-за гудения двигателей и не услышал.

Постояв немного у капсул своих родителей, он грустно вздохнул и, закинув на спину заранее собранный рюкзак, двинулся к выходу.

Когда Джем добрался до транспортного трюма, Зуб и Скип уже стояли с рюкзаками на плечах возле катера. Зуб вертел в руках небольшую коробочку, нажимая на ней кнопки, а Скип внимательно за ним наблюдал. Увидев Джема, он расплылся в широкой улыбке:

– Наш человек. Зуб, мужики в сборе.

– Ждем девочек. Время еще есть.

Зуб нажал на самодельном приборе очередную комбинацию кнопок и поднес его к пластине замка на двери катера.

– Уверен, что получится? – спросил Скип.

– Я такие замки с отцом на других катерах ремонтировал. Здесь простая электроника.

– А что-то еще пробовал открыть?

Зуб вмиг стал серьезным.

– Такими делами не занимаюсь. И катер мы вернем. Оставим на видном месте.

Он поднес к замку прибор с новой комбинацией кнопок. С легким щелчком дверь катера сдвинулась вверх.

– Ловко, – восхитился Скип. – На раз-два.

– И зачем ты от меня код требовал? – недовольно произнес Джем. – Мог бы этой своей штукой открыть.

– Не мог. На воротах замок не электронный, обычная механика, – Зуб нажал на приборной панели кнопку открытия багажника. – Вещи складывайте.

– Ты им управлять точно сможешь? – спросил Джем, боязливо заглядывая в кабину.

– Отец обучил. Он не только ремонтником, но еще и техником-инструктором был. Я же рассказывал.

– Да помню, – сказал Джем. – Все равно страшновато.

Скип и Джем положили свои рюкзаки в багажник. Зуб тоже хотел, но, увидев Милу с небольшой сумкой и Иву вообще без вещей, удивленно на них уставился и машинально поставил свой рюкзак на переднее сиденье.

– Мила, это все твои вещи? – растерянно произнес он.

– Я не смогла больше, – сказала Мила с виноватым видом. – Мать заподозрила. А потом уже времени не было.

– А у тебя что? – обратился Зуб к Иве, стоявшей с опущенной головой.

– Она передумала, – ответила за нее Мила.

– Ива, может все-таки с нами, – неуверенно произнес Скип, выглядевший ужасно расстроенным.

– Ребята, простите меня, я боюсь, – тихо сказала Ива. – Тимка страхов наговорил. Поймают нас. Не пойду я.

– Зачем тогда пришла? – сердито спросил Зуб.

Ива всхлипнула.

– Проводить. Все-таки мы… с детства…

Она еле сдерживала слезы. Зуб смягчился.

– Ладно, Ива, – сказал он. – Ты проводила. А теперь иди скорей обратно, пока болтанки нет.

Он сел в кресло пилота и повернулся к Джему:

– Давай к воротам, вводи код.

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

– Все, Ива, пора. Мы уже в атмосфере, – сказал Скип, грустно глядя на остающуюся девочку.

Ива кинулась к Миле и крепко ее обняла.

– Милка, прости. Не могу я.

– Ну что, ты. Не грусти, Иветка. Мы еще встретимся, ведь правда?

Ива быстро закивала головой и улыбнулась, хотя по ее щекам и текли слезы. Тряска меж тем усилилась.

– Ива, уходи быстрее, – крикнул Зуб. – Скип, Мила – в катер.

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

– Ребята, что это?! – испуганно крикнула Мила.

– В катер, быстро! – крикнул Зуб. – Джем, открывай!

Скип и Мила быстро вскочили и уселись на заднее сиденье катера, а Джем нажал нужные кнопки на замке ворот и отпрыгнул назад. Ворота рывком сдвинулись вбок и остановились, приоткрыв только узкую щель. Надсадно загудел мотор их привода. Озадаченный Джем повернулся к катеру.

– Похоже, заклинило, – растерянно произнес он и уставился на щель, соображая, можно ли ее сделать шире.

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

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

Со стороны стража что-то прозвучало, но из-за крика Ивы, от которого заложило уши, он ничего не расслышал. Откуда-то снизу у стража вылезло гибкое металлическое щупальце с четырьмя захватами и потянулось к Джему, но тот, перебирая по полу руками и ногами, быстро отполз к катеру и забрался в кабину.

В корпус стража, наполовину торчавший за бортом, ударило снаружи что-то яркое. Сбитый с корабля, он вместе с остатками ворот полетел вниз.

Пол внезапно накренился и катер, от удара слетевший со стопорных замков, медленно заскользил наружу. Вновь закричала Ива, которая единственная из ребят не была в катере. Распластавшись на наклонном полу, она пыталась удержаться на месте, но ее тянуло в открытый проем ворот.

Скип бросился из катера и успел схватить девочку за руку, но заскользил вместе с нею, хотя изо всех сил упирался и старался ползти обратно. Зуб бросил ему свой рюкзак, держа его за лямку, и крикнул:

– Хватай!

Скип дотянулся до другой лямки и Зуб подтянул их к катеру.

– Закрывай все двери, – крикнул он, как только Скип и Ива забрались внутрь, и, снова усевшись в кресло пилота, стал быстро нажимать кнопки на приборной панели.

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

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

– Баловство все это… У тебя теперь убежища нет… Поймают нас… Все было раньше… А потом уже времени не было… Тебе здорово повезло…

Голоса сливались в неразборчивый гул других голосов, а силуэт стража расплывался, превращаясь в постепенно исчезающую фантасмагорию непонятных образов. Но это уже не было воспоминание – это был сон.

Тревога

Сквозь трещины наверху внутрь грота вливался солнечный свет и яркими пятнами ложился на неровные стены. Джем открыл глаза и некоторое время разглядывал каменный потолок.

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

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

 

Покончив с завтраком, Джем отправился к ручью недалеко от грота, чтобы вымыть тарелку. У ручья Мила полоскала в проточной воде посуду и негромко напевала грустную песню с непонятными словами. Она любила петь эту песню, еще в детстве услышанную от матери. Та говорила, что это колыбельная на древнем языке ее народа, но слов даже она уже не понимала. Только бабка Милы их знала, но переводить ни за что не хотела, будто боялась чего-то.

Услышав шуршание камешков, скатившихся по склону из-под башмаков Джема, Мила обернулась.

– Добрут, – поприветствовал ее Джем и поставил свою тарелку к остальной, пока еще грязной, посуде.

– И тебе, – ответила Мила.

– Чего меня не разбудили?

– Пожалели. Ты вчера устал сильно.

– Мне гамак плести надо. Зуб разве не говорил?

– Да плетем мы твой гамак. Вон Ива у болота. Сейчас я все домою и к ней пойду.

– Мне прочный надо и чтоб не выпасть. И до завтра успеть.

– Не волнуйся, мы поняли для чего – Зуб рассказал. Вдвоем успеем, иди лучше ребятам с рыбалкой помоги, а то вяленка почти закончилась.

– А вы точно успеете? И какой надо?

– Точно успеем. Будет в лучшем виде. Шагай.

Джем двинулся в сторону темневшего вдали леса, но Мила его окликнула:

– Тима, – голос девочки задрожал. – Зуб и про людей все объяснил, – лицо ее словно окаменело. – Ты найди их, успей… Пожалуйста.

– Найду, обещаю, – твердо ответил Джем.

***

От ручья до леса идти было недалеко – километра полтора, не больше. Лес этот ребята называли Цветочным. На Балии многие растения напоминали земные, только были во много раз больше, просто гигантскими. Вот и в Цветочном лесу росли деревья, которые фактически являлись цветами.

Конечно, были там и цветы привычного размера. Из некоторых Ива научилась собирать нектар и уваривать до густого сиропа – его использовали вместо сахара. Лепестки тоже шли в пищу. Но главной ценностью в этом лесу была неглубокая речная протока.

Живность, которая в ней водилась, немного походила на земных рыб и раков. Их мясо оказалось вполне съедобным и даже вкусным. Не то что мерзкая слизь внутри насекомых и моллюсков, обитавших на суше, на которых даже в жареном виде смотреть было противно. Один Скип рискнул пару раз ее попробовать и оба раза выплевывал.

Хотя, будь животные суши съедобными, охота на них дала бы пропитания на месяц – размерами они были под стать растениям – от самых маленьких до гигантских.

Встречались среди них и опасные хищники, способные убить человека. К счастью, появлялись они в основном по ночам и чаще всего в лесу или на равнине, а горный склон, где находился грот, интереса у них не вызывал. Наверно потому, что привычной для них еды среди камней почти не встречалось.

Только бестии изредка сюда залетали, высматривая добычу сотней маленьких глаз и вибрируя жалом на конце тонкого и гибкого хвоста. Но пролететь на своих длинных прозрачных крыльях сквозь узкую расщелину они не могли, а привычки ползать по земле, сложив их вдоль тела, за ними не водилось.

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

А днем эту сеть они использовали по назначению в глубоких местах на середине реки. Там, к разбросанной приманке, на нее приползали донные обитатели – существа, похожие на раков, только с жалами вместо клешней. Рыб приходилось ловить по-другому. Зуб и Скип с раннего утра как раз этим и занимались.

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

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

Там дела шли похуже – уже давно Скип не слышал бренчания трубок из тростника, привязанных к концам удочек. А значит новых поклевок не было.

За удочками, лежа в прибрежных кустах, наблюдал Зуб. За два часа всего одна рыба попалась ему на крючок, а еще две сорвались. Взглянув на солнечные часы, сделанные им на берегу из тростины и камней, он вздохнул – до полудня оставалось часа полтора. Догнать за это время Скипа по числу добытых рыбин шансов почти не было.

Настроение у Зуба испортилось. И не только от этой мысли. Он единственный определял здесь время по солнцу. Остальным его показывали наручные тайм-браслеты, специально изготовленные для Балии. Их выдали всем сюда улетавшим.

Был такой таймер и у Зуба, но тот его не носил. Он напоминал ему о горькой судьбе его родителей. Заменив его на палку и тень от нее, Зуб хотел избавиться от этих воспоминаний. Но не избавился. Всякий раз, глядя на солнечные часы, он понимал, зачем их сделал. И снова вспоминал родителей. Вспомнил он их и сейчас. И тот день, когда узнал, что его семья полетит на Балию.

***

В тот день отец пришел домой раньше обычного. Лицо его сияло от радости. Он вытащил из своей рабочей сумки три тайм-браслета. Не такие, что носили все люди в марсианской колонии – красного цвета, а синие и с серебристой полосой посредине.

– Радуйтесь! Мне это удалось! – объявил он.

Зуб, смотревший по телеку инструкцию на случай встречи с шипастой многоножкой, не понял, чему нужно радоваться. Но мама, видимо, была посвящена в дела отца.

– Неужто получилось? А говорили, что ценных работников не отпускают.

– Броксон помог. Один из Наилучших, что полетит, оказался помешанным на охоте. А на Земле она запрещена, его там несколько раз ловили и больше уже не пустят. Вот он ради охоты на Балию и летит. Стив ему напел на уши про стратосферных скатов, что их только с высотного катера можно достать. Тот услышал и целых два аппарата на корабль возьмет. А меня к катерам берут техником.

– Что, там до него никто не летал? – спросила мама.

– Летали и летают, но в основном на ротапланах и флайерах, причем на старье. Для них обслуга там есть. А вот для новейших высотных катеров – нет.

– Пап, ты что, один летишь? – тревожно спросил Зуб.

– Нет, конечно. Видишь эти три браслета. Каждый из них – билет и пропуск на корабль. Для тебя, меня и мамы. Через месяц мы навсегда улетим с Марса.

– И Броксон все это бесплатно сделал? – спросила мама. – Никогда не поверю. Он и сам-то в Службу полетов наверняка не за просто так попал.

– Не бесплатно. Пришлось ему все наши накопления отдать и еще в долг попросить. Так что придется до полета серьезно экономить.

– Так ведь с долгом не отпустят. Как мы ему за месяц все отдать сможем? – забеспокоилась мама.

– Сможем. Продадим все, что есть. И еще я на обслуживание реактора ушел, там в два раза больше платят. Завтра выхожу.

– А я на подработку пойду. Есть место уборщицы по вечерам.

– Вот и замечательно, – отец обнял маму, нежно глядя ей в глаза.

Зуб любил отца и мать. И любил видеть их любовь друг к другу. Он радостно подскочил к ним и обхватил руками. Родители взглянули на него с улыбкой и притянули к себе. Так они и стояли несколько минут втроем, крепко обнявшись.

– Мы справимся, – сказал отец. – Еще немного потерпеть, а там нас ждет новый мир – просторный и чистый.

Если бы он знал тогда, что их ждет и как дорого обойдутся им эти три браслета.

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

А на третьей неделе случилась беда. У Наилучшего, в квартире которого убиралась мама, исчезла старинная и очень ценная вещь. Он обвинил маму в воровстве и ее арестовали.

Зуб считал, что это недоразумение и скоро маму отпустят. Но ее не отпустили – этот богач заявил, что выбьет у воровки признание, где она спрятала украденную вещь, чего бы это ему не стоило.

Через несколько дней хмурый офицер полиции, отводя глаза в сторону, сообщил ему и отцу, что у мамы будто бы был сердечный приступ.

Проститься с нею им не разрешили.

А еще через два дня к ним в ячейку пришел пожилой человек усталого вида и представился юристом этого самого богача. Он сказал отцу, что сожалеет о случившемся и что для них на Балии куплена просторная квартира. А уходя, взглянул на Зуба и сказал отцу:

– Надеюсь, что своего сына Вы воспитали честным и порядочным человеком. К сожалению, не у всех родителей это получается.

Зуб после его ухода спросил у отца, причем здесь его воспитание. Отец тяжело вздохнул и ответил, что человек этот сказал то, что мог сказать, но он его понял.

Еще он сказал, что уже не хочет улетать, а хочет остаться там, где навсегда осталась мама. Но она не хотела бы такой же судьбы и для сына, и поэтому они полетят.

Через пять дней они сменили свою тесную жилую ячейку в марсианской колонии, где хотя бы могли стоять и сидеть, на две персональные капсулы для каждого, в которых могли только лежать. Причем по графику. Ночью по времени корабля в них спали все пассажиры, а днем вылезать разрешалось поочередно, чтобы не создавать толчеи в помещениях и коридорах. Всего несколько раз за день и не больше часа за один раз удавалось пассажирам размять затекшие мышцы и хоть немного пройтись по центральному коридору. За соблюдением графика строго следили старшие по жилым отсекам. И люди все терпели в надежде, что это их последние мучения перед счастливой жизнью на Балии.

Так прошли полгода. За это время звездолет набрал достаточную скорость, чтобы перейти в варп-режим. Полгода люди терпели неудобства, чтобы всего за пять минут совершить прыжок на сто с лишним световых лет. Но и этому были рады – семнадцать лет назад, когда эту технологию только создали, терпеть приходилось дольше.

После прыжка звездолет начал торможение еще на полгода. Но теперь, когда большая часть пути была пройдена, ожидание людям давалось легче. Но только не Зубу.

Эти пять минут прыжка в пространстве оказались роковыми для его отца. Сразу после них его вызвали в реакторный отсек. Там в трубе с охладителем открылась скрытая трещина и он стал вытекать, распространяя вокруг смертельно опасное излучение.

Устранить аварию могли бы роботы, но Компания ради одного полета решила не тратиться. И заменить их пришлось человеку. Зубу потом сказали, что если бы не его отец, то звездолет превратился бы в облако раскаленного газа. Только от этого не стало легче.

С отцом ему тоже не дали проститься – сказали, что это небезопасно.

После этого он возненавидел всех этих уродов, называющих себя Наилучшими, а на самом деле способных обворовать собственного отца и свалить все на невинного человека; уродов, способных до смерти выбивать из человека признание вины за преступление, которого тот не совершал; уродов, способных наживаться на экономии, оплаченной чужими жизнями.

Компания считала их своими лучшими людьми, и он возненавидел Компанию. Уничтожить ее он не мог, а жить под ее властью не хотел. И он решил от нее сбежать.

***

Его грустные воспоминания прервал стук тростниковых трубочек, подвешенных на конце одной из удочек. Зуб в одно мгновенье выскочил из своего укрытия и бросился к воде. Резко выдернув удочку из земли и пятясь назад, он вытащил на берег отчаянно извивающуюся рыбу. Скип у поворота реки победно вскинул над головой кулак, радуясь его успеху.

Когда на крючке появилась новая наживка, а удочка вернулась на свое место, Зуб снова улегся в кустах и память не замедлила возвратить его к пережитому.

***

Сначала он не хотел посвящать друзей в свой план побега, ведь отправка в приют для детей-сирот грозила только ему. Но однажды случайно обмолвился, как бы ему хотелось сбежать и жить на Балии свободно, подальше от неусыпного ока и цепких лап ненавистной ему Компании. И оказалось, что друзья его желание разделяют и тоже об этом думали. Но жить так хотят вместе с родителями.

Зуб сказал, что Компания никого не отпустит, а сбежать можно только с корабля, пока катер рядом. Но с родителями они в него не влезут. Да те и не согласятся, скорее даже запретят. Поэтому бежать нужно без них, а к себе их потом переманить.

 

Хоть и с колебаниями, но все с ним, в конце концов, согласились. Тогда и началась их подготовка к побегу.

Из вещей, которые они взяли с собой, приспособить что-либо для жизни в лесу было сложно. Да им и разрешили взять самый минимум, в основном одежду и обувь.

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

Нашли немного – в большинстве ящиков везли запчасти для шахтного оборудования. Из легкого, что можно было унести, в избытке были лишь брикеты растворимой еды, подготовленной для полета. Три десятка они на первое время взяли, а дальше собирались добывать еду охотой, рыбалкой и собирательством. Как в сериале про первобытные времена, который все видели много раз.

Еще им посчастливилось найти нейлоновый трос, из которого потом сделали сеть, распустив на нити, и несколько железок, сгодившихся под лезвия для ножей.

Бежать решили во время посадки на Балию, когда все внимание экипажа будет приковано к экранам и приборам и нет времени следить за тем, что происходит в коридорах и трюмах.

– Пилоты у пульта, пассажиры в капсулах. Если не шуметь, никто нас и не заметит, – говорил Зуб ребятам в последний вечер перед побегом. – И не забудьте в сумки родителей записки положить…

***

Позади послышался шорох. Стараясь не шуметь, чтобы не распугать рыбу, к Зубу подошел Джем и улегся рядом.

– Ну как рыбалка? – прошептал он.

Зуб приподнял рядом с собой охапку травы и показал под ней двух рыбин.

– Так себе, – ответил он тоже шепотом. – Круглороты.

– Лучше, чем ничего. А Скип где?

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

– Хороша, – с довольным видом произнес Зуб, снимая рыбу с крючка, и показал пальцем вниз по течению, где в воде маячила фигура Скипа. – Вон он. Вторая хваталка у него.

– Не-а. Я лучше краков с дерева половлю.

– А-а… Сеть возле лежанки, приманка тоже, – сказал Зуб, сосредоточенно насаживая на крючок наживку.

Вдалеке раздался тонкий пронзительный свист. Зуб и Джем замерли, а услышав второй такой же, повалили удочки и бросились в реку к зарослям тростника. Быстро сняв с поясов пустотелые тростинки, они сунули их себе в рот и с головой погрузились в воду, оставив другие концы торчать на поверхности.

У поворота реки Скип тоже опустился под воду, а его накидка из водорослей плавала сверху.

Над лесом возник и стал нарастать тонкий шипящий звук. Из-за верхушек деревьев показался страж. Пролетая вдоль берега, он задержался над пойманной рыбой, еще трепыхавшейся на берегу, и скрылся за поворотом реки.

Через минуту над водой показались головы ребят. Убедившись, что опасность миновала, Зуб и Джем быстро вылезли на берег. К ним подбежал встревоженный Скип.

– Милкин свист! Два сразу!

– И оба длинные, – сказал Зуб. – Значит, просто сигналила. Боялась, что так далеко не услышим.

– Она у ручья была, – сообщил Джем. – Должна была к болоту пойти, гамак с Ивой плести.

Скип встревожился еще больше:

– А вдруг Ива одна была и в болото не полезла? Она же слизней ужасно боится. Торчала на берегу… и все.

– Ты два коротких слышал? – сказал Зуб. – Нет? Вот и не паникуй. Наверняка у болота вместе были, и Мила ее затащила.

Он озабоченно взглянул на небо.

– Второй раз за утро. В это время никогда их не было.

– У, гады, расписание меняют, – погрозил Скип кулаком в сторону, куда улетел страж.

– Похоже, это из-за него, – кивнул Зуб на Джема.

– Из-за ночевки что ли? – удивился Скип. – Да ведь это просто давно разбившийся ротаплан. Ну нашли они его только сейчас, и что?

– Наверно Джем что-то там оставил.

– Да ничего я не оставлял! – возмутился Джем. – Все свое ношу с собой.

– Ты хорошо подумай, – сказал Зуб. – Может ты что внутри изменил?

Джем задумался и стал рассуждать вслух:

– Трещину на днище я колючками зарастил, в разбитых окнах вонючие пауки ядовитую паутину сами свили, неважно, что я их принес.

Он сморщил губы в недоумении:

– Вроде не я, а природа все сделала. Что тогда не так?

И вдруг хлопнул себя ладонью по лбу:

– Вот зараза! У ротаплана замок двери при падении сорвало, так я изнутри засов из палки сделал. Похоже, его страж через паутину и высмотрел.

– Мо-ло-дец! – по слогам произнес Зуб. – Изнутри заперто, а хозяев нет.

Джем вздохнул и виновато опустил голову.

– И надолго они к нам зачастят? – спросил Скип.

– Не знаю, – сказал Зуб. – Собирайте рыбу и пошли домой.

К счастью, больше в этот день стражи не появлялись. И с девочками беды не случилось. Вечером ребята обсуждали у костра утреннее происшествие.

– Ты точно нормально? – спросил Скип, заботливо глядя на Иву.

– Точно, – сказала Ива и, улыбнувшись, неуверенно добавила: – Они совсем не страшные, если их не видишь. Только противные, когда тела касаются.

А Мила насмешливо рассказывала, как они с Ивой прятались от стража:

– Он уже совсем близко, а Ивка стоит, как вкопанная, на воду смотрит. Я ее прямо с разбега и пихнула.

И уже совершенно серьезно добавила:

– Ели успели.

– Давно надо было там укрытие сделать, – сказал Зуб.

– Мы ж на болоте уже ничего не берем, – возразил Скип. – Только сегодня, для гамака.

– Все равно надо сделать.

– Ладно, завтра сделаю, – пообещал Скип.

Зуб встал и хлопнул его по плечу.

– Пошли. И ты давай, – махнул он рукой Джему.

– Куда? – спросил Джем.

– Гамак твой испытывать. Мы со Скипом концы подержим.

Ранний сбой и частый сбой для более надежного программного обеспечения | Мэтт Кляйн

Я все чаще замечаю тревожную тенденцию в разработке программного обеспечения: идея о том, что любой полный сбой программы (из-за ошибки сегментации, паники, исключения нулевого указателя, утверждения и т. д.) является признаком того, что часть программного обеспечения плохо написаны и им нельзя доверять.

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

В конечном счете, каждая строка кода в программе — это ответственность, которая может привести к дефектам программного обеспечения. Одним из особенно пагубных источников кода и объема дефектов является редко (или никогда) используемый код обработки ошибок.

 def doSomethingWithBar(bar): 
если bar равен None:
# Может ли это когда-нибудь произойти?
return False bar.doSomething()
return True

В предыдущем примере я показываю Python, который проверяет, является ли bar нулевым значением, прежде чем что-то делать. Для индикации неисправности ( bar is null), функция возвращает логическое значение (до того, как комитет по чистоте функционального программирования придет за мной, вместо проверки на null предположим, что bar является необязательным, и проверим, имеет ли оно значение — применима та же идея ).

Этот пример может показаться надуманным, но я часто вижу этот шаблон в обзоре кода, и мой комментарий к обзору всегда такой: c а такое когда-нибудь происходило на самом деле? Иногда это может произойти, но очень часто это невозможно, и инженер написал код в таком стиле, потому что он ошибочно полагает, что во всем коде должна быть проверка ошибок.

Единственная проверка ошибок, необходимая программе, — это ошибки, которые действительно могут произойти во время нормального потока управления.

Если в предыдущем примере бар никогда не может быть нулевым, doSomethingWithBar() можно полностью удалить из кода, а вызов метода doSomething() встроить. Кроме того, вызывающему функцию больше не нужно иметь дело с когнитивной нагрузкой, связанной с пониманием того, нужно ли и как обрабатывать ошибку после вызова функции 9.0006 doSomethingWithBar() .

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

Что делать, если автор кода ошибся и bar действительно может быть нулевым? Пусть программа выйдет из строя ! Полученный в результате сбой и трассировка стека будут чрезвычайно очевидными, их будет легко отлаживать и исправлять. Может стать ясно, что инвариант bar , всегда равный нулю, неверен. Если также может стать ясно, что какой-то вызывающий doSomething() не работает и должен иметь правильный бар . В любом случае код останется максимально простым и без лишней логики, о которой сложно рассуждать.

Следствием фразы «сбой рано и сбой часто» является «утверждать рано и утверждать часто». Утверждения — чрезвычайно мощный механизм для проверки инвариантов кода (вещей, которые всегда должны быть верными). Я предпочитаю два типа утверждений:

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

Утверждений отладки должно быть намного больше, чем утверждений выпуска.

Я рассматриваю утверждения как невероятно мощный инструмент для уменьшения сложности кода по следующим причинам:

  1. Утверждения действуют как документация. Читатель ясно понимает состояние, в котором ожидается, что программа будет находиться при выполнении утверждения.
  2. Утверждения по определению ограничивают посторонние переходы и обработку ошибок. Зачем обрабатывать состояние, которое никогда не должно произойти?

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

Что произойдет, если программист ошибается и утверждение не во всех случаях верно? Пусть программа выйдет из строя ! Как и в случае с проверкой null в предыдущем разделе, отладка сбоя утверждения является тривиальной задачей. Исправление может заключаться либо в удалении утверждения и добавлении кода обработки, либо в том, чтобы заставить вызывающий код придерживаться утверждения.

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

В рекомендациях по обработке ошибок Envoy мы пишем:

Совет: если мысль о добавлении дополнительного тестового покрытия, ведения журнала и статистики для обработки ошибки и продолжения кажется нелепой, потому что «это никогда не должно произойти» , это очень хороший показатель того, что надлежащее поведение состоит в том, чтобы завершить процесс и не обрабатывать ошибку. Если есть сомнения, пожалуйста, обсудите.

По сути, мы заставляем все ошибочные ветки и утверждения покрываться тестами. Если программист считает, что это время бесполезно, это полезная принудительная функция для упрощения логики кода.

Еще одна область, в которой я часто вижу дополнительные сложности и ошибки, добавленные якобы для предотвращения сбоев, — это семантика владения объектами/данными. По сути, существует три разных способа размещения и отслеживания данных в программе:

  1. Стек
  2. Куча с одним владельцем (например, std::unique_ptr<> в C++, стандартная проверка заимствования в Rust и т. д. ). Обратите внимание, что во многих популярных языках этот тип собственности недоступен на практике, потому что все объекты, выделенные в куче, подсчитываются по ссылкам и допускают возможное непреднамеренное совместное использование (например, Java, Python, JS, Go и т. д.).
  3. Куча с несколькими владельцами (например, std::shared_ptr<> в C++, Java, Go, Python, общие указатели Rust и т. д.).

Распределение стека относительно просто и понятно, поэтому я собираюсь в первую очередь обсудить, как (2) и (3) связаны с ранним сбоем и сложностью кода.

На высоком уровне код, который использует данные кучи с одним владельцем, значительно легче рассуждать, чем код, который использует данные с подсчетом ссылок. Один фрагмент кода выделяет данные, а другой фрагмент освобождает их. Очень простой. Альтернатива — долевая собственность. Использование совместного владения может сделать код чрезвычайно трудным для понимания. Как и когда объект будет освобожден? Будут ли утечки памяти из-за циклических ссылок? (Несколько иронично, но я видел намного больше утечек рабочей памяти в программном обеспечении, написанном на Java и Python, из-за циклических общих ссылок по сравнению с хорошо написанным C++, который активно использует семантику с одним владельцем.)

Недостатком подхода с единоличным владением является простота создания ситуаций «использование после освобождения» в C/C++. Rust полностью избегает «использовать после освобождения» с помощью средства проверки заимствования, но при этом допускает семантику с одним владельцем. Это невероятно мощно как с точки зрения правильности, так и с точки зрения одного владельца данных, и я с нетерпением жду того дня, когда большая часть кода будет написана на языках с семантикой, подобной Rust. Тем не менее, учитывая, что большая часть кода в мире по-прежнему написана на C/C++, Java, Python, JS и подобных языках, я продолжу обсуждение с этой точки зрения.

В C/C++ сбой «использовать после освобождения» иногда может быть трудно отладить (опять же делает заимствование семантики Rust очень заманчивым с точки зрения производительности), но это очень явный признак того, что программа дала сбой, и инвариант изменился. было нарушено . Альтернатива, которую я иногда вижу в C/C++, заключается в том, чтобы отдать предпочтение общему владению объектами, подобным Java/Python, чтобы избежать подобных сбоев. Мысль состоит в том, что если объект никогда не освобождается, пока на него есть ссылка, программа никогда не рухнет. Тем не менее, по моему опыту, это неизбежно приводит к большей сложности кода и большему количеству ошибок из-за циклических ссылок, трудных рассуждений о логике и т. д.

Используйте совместно используемую память только тогда, когда этого требует логика программы.

По тем же причинам, по которым я выступаю за ограниченную обработку ошибок и дополнительные утверждения выше, предпочтительнее использовать семантику с одним владельцем. В Rust компилятор проверит правильность. В C/C++ компилятор этого не сделает, но допустить сбой программы и исправить непокрытое нарушение инварианта гораздо предпочтительнее, чем вводить ненужное владение и сложность кода в попытке вообще избежать сбоев такого типа.

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

Ограничение сложности программного обеспечения — один из основных доступных нам механизмов ограничения дефектов. Очень часто инвариантные нарушения, вызывающие фатальные сбои, значительно легче отлаживать и исправлять, чем сложный код, который изначально пытался предотвратить сбои. В частности, я рекомендую использовать следующие три метода для ограничения обработки ошибок и сложности кода:0003

  1. Ограничьте обработку ошибок только теми ошибками, которые действительно могут произойти во время нормального потока управления. Сбой в противном случае.
  2. Свободно используйте утверждения для документирования инвариантного состояния и аварийного завершения в случае нарушения.
  3. Используйте семантику данных с одним владельцем, если это вообще возможно, чтобы ограничить сложность кода, и если вы делаете это с помощью C/C++, пусть программа аварийно завершает работу, если нарушается инвариант владения.

Приведенные выше три стратегии ограничивают сложность кода и, как правило, приводят к более очевидным ошибкам, которые легче исправить.

Сбои | Разработчики Android

Приложение для Android аварийно завершает работу всякий раз, когда происходит непредвиденный выход, вызванный необработанное исключение или сигнал. Приложение, написанное с использованием Java или Kotlin. аварийно завершает работу, если выдает необработанное исключение, представленное Метательный класс . Ан приложение, написанное с использованием машинного кода или C++, дает сбой при наличии необработанного сигнал, такой как

SIGSEGV , во время его выполнения.

При сбое приложения Android завершает процесс приложения и отображает диалоговое окно чтобы пользователь знал, что приложение остановлено, как показано на рис. 1.

Рисунок 1. Сбой приложения на Android-устройстве

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

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

Обнаружение проблемы

Вы можете не всегда знать, что ваши пользователи испытывают сбои, когда они используют ваше приложение. Если вы уже опубликовали свое приложение, вы можете использовать Android Vitals, чтобы увидеть частоту сбоев для вашего приложения.

Android Vitals

Android Vitals может помочь вам отслеживать и улучшать частоту сбоев вашего приложения. Android Vitals измеряет несколько коэффициентов сбоев:

  • Коэффициент сбоев: Процент ваших ежедневных активных пользователей, которые испытал любой тип аварии.
  • Частота сбоев, воспринимаемая пользователями: Процент ваших ежедневных активных пользователей которые столкнулись хотя бы с одним сбоем во время активного использования вашего приложения. (сбой, воспринимаемый пользователем). Приложение считается активно используемым если он отображает какую-либо активность или выполняет какие-либо служба переднего плана.
  • Частота множественных сбоев: Процент ваших ежедневных активных пользователей, которые побывал как минимум в двух авариях.

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

Частота сбоев, воспринимаемая пользователем, составляет основных жизненно важных , что означает, что она влияет на доступность вашего приложения в Google Play. Это важно, потому что это приводит к сбою. счетчики всегда происходят, когда пользователь взаимодействует с приложением, что приводит к наибольшему нарушение.

Play определил два порога плохого поведения по этому показателю:

  • Общий порог плохого поведения: Не менее 1,09% активных пользователей в день испытать воспринимаемый пользователем сбой на всех моделях устройств.
  • Порог плохого поведения для каждого устройства: Не менее 8% активных пользователей в день испытать воспринимаемый пользователем сбой, для одной модели устройства .

Если ваше приложение превышает общий порог плохого поведения, оно, скорее всего, будет меньше обнаруживаются на всех устройствах. Если ваше приложение превышает допустимое поведение для каждого устройства порог на некоторых устройствах, он, вероятно, будет менее заметен на этих устройствах, и предупреждение может быть показано на вашем листе магазина.

Android Vitals может предупредить вас через Игровая консоль когда ваше приложение демонстрирует чрезмерные сбои.

Информацию о том, как Google Play собирает данные Android Vitals, см. Игровая консоль документация.

Диагностика сбоев

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

Существует множество ситуаций, которые могут привести к сбою в вашем приложении. Некоторые причины очевидны, например, проверка на нулевое значение или пустую строку, но есть и более тонкие, такие как передача недопустимых аргументов в API или даже сложные многопоточные взаимодействия.

Сбои на Android создают трассировку стека, которая представляет собой моментальный снимок последовательности вложенные функции, вызываемые в вашей программе до момента ее сбоя. Ты можешь просмотреть трассировки стека сбоя в Android Vitals.

Как читать трассировку стека

Первый шаг к устранению сбоя — определить место, где он произошел. Ты можешь используйте трассировку стека, доступную в деталях отчета, если вы используете Play Консоль или выходные данные инструмента logcat. если ты нет доступной трассировки стека, вы должны локально воспроизвести сбой, либо вручную протестировав приложение, либо связавшись с затронутыми пользователями, и воспроизвести его при использовании logcat.

В следующей трассировке показан пример сбоя приложения, написанного с использованием Java. язык программирования:

 --------- начало краха
AndroidRuntime: НЕИСПРАВНОЕ ИСКЛЮЧЕНИЕ: основной
Процесс: com.android.developer.crashsample, PID: 3686
java.lang.NullPointerException: пример сбоя
в com.android.developer.crashsample.MainActivity$1.onClick(MainActivity.java:27)
в android.view.View. performClick(View.java:6134)
в android.view.View$PerformClick.run(View.java:23965)
в android.os.Handler.handleCallback(Handler.java:751)
в android.os.Handler.dispatchMessage(Handler.java:95)
на android.os.Looper.loop(Looper.java:156)
в android.app.ActivityThread.main(ActivityThread.java:6440)
в java.lang.reflect.Method.invoke (собственный метод)
на com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
на com.android.internal.os.ZygoteInit.main(ZygoteInit.java:746)
--------- начало системы
 

Трассировка стека показывает две части информации, которые имеют решающее значение для отладки сбой:

  • Тип выброшенного исключения.
  • Раздел кода, в котором создается исключение.

Тип выброшенного исключения обычно является очень сильным намеком на то, что произошло. неправильный. Посмотрите, является ли это IOException , OutOfMemoryError , или что-то еще, и найдите документацию по классу исключений.

Класс, метод, файл и номер строки исходного файла, где возникло исключение брошено показано во второй строке трассировки стека. Для каждой функции, которая был вызван, другая строка показывает предшествующий сайт вызова (называемый кадром стека). Поднявшись по стеку и изучив код, вы можете найти место, которое передать неверное значение. Если ваш код не отображается в трассировке стека, он скорее всего, вы где-то передали неверный параметр в асинхронный операция. Часто можно понять, что произошло, изучив каждую строку трассировка стека, поиск любых классов API, которые вы использовали, и подтверждение того, что параметры, которые вы передали, были правильными, и что вы вызвали его из места, которое позволил.

Трассировки стека для приложений с кодом C и C++ работают практически одинаково.

 *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
Отпечаток сборки: 'google/foo/bar:10/123.456/78910:user/release-keys'
ABI: «arm64»
Отметка времени: 2020-02-16 11:16:31+0100
pid: 8288, tid: 8288, имя: com. example.testapp >>> com.example.testapp <<<
ИД: 1010332
сигнал 11 (SIGSEGV), код 1 (SEGV_MAPERR), адрес ошибки 0x0
Причина: разыменование нулевого указателя
    x0 0000007da81396c0 x1 0000007fc91522d4 x2 0000000000000001 x3 000000000000206e
    x4 0000007da8087000 x5 0000007fc9152310 x6 0000007d209c6c68 x7 0000007da8087000
    x8 0000000000000000 x9 0000007cba01b660 x10 0000000000430000 x11 0000007d80000000
    x12 0000000000000060 x13 0000000023fafc10 x14 00000000000000006 x15 ffffffffffffffffff
    x16 0000007cba01b618 x17 0000007da44c88c0 x18 0000007da943c000 x19 0000007da8087000
    x20 0000000000000000 x21 0000007da8087000 x22 0000007fc9152540 x23 0000007d17982d6b
    x24 0000000000000004 x25 0000007da823c020 x26 0000007da80870b0 x27 0000000000000001
    x28 0000007fc91522d0 x29 0000007fc91522a0
    сп 0000007fc9152290 лр 0000007d22d4e354 шт 0000007cba01b640
след:
  #00 pc 0000000000042f89 /data/app/com.example.testapp/lib/arm64/libexample.so (com::example::Crasher::crash() const)
  #01 pc 0000000000000640 /data/app/com. example.testapp/lib/arm64/libexample.so (com::example::runCrashThread())
  #02 ПК 0000000000065a3b /system/lib/libc.so (__pthread_start(void*))
  #03 ПК 000000000001e4fd /system/lib/libc.so (__start_thread)
 

Если вы не видите информацию о классах и функциях в собственных трассировках стека, вам может понадобиться создать собственный файл символов отладки и загрузите его в консоль Google Play. Для получения дополнительной информации см. Деобфускация следов стека сбоя. Общие сведения о собственных сбоях см. Диагностика нативных сбоев.

Советы по воспроизведению сбоя

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

Ошибки памяти

Если у вас OutOfMemoryError , тогда вы можете создать эмулятор с небольшим объемом памяти для тестирования. Фигура 2 показаны настройки AVD-менеджера, где вы можете контролировать объем памяти на Устройство.

Рисунок 2. Настройка памяти в диспетчере AVD

Сетевые исключения

сетевые исключения приложений обычно не следует рассматривать как ошибки , но скорее как нормальные рабочие условия, которые случаются неожиданно.

Если вам нужно воспроизвести сетевое исключение, например UnknownHostException , затем попробуйте включить режим полета, пока ваше приложение пытается использовать сеть.

Другой вариант — снизить качество сети в эмуляторе на выбор эмуляции скорости сети и/или сетевой задержки. Вы можете использовать Скорость и Задержка настройки в диспетчере AVD, или вы можете запустить эмулятор с -netdelay и -netspeed флаги, как показано ниже пример командной строки:

 emulator -avd [your-avd-image] -netdelay 20000 -netspeed gsm
 

В этом примере устанавливается 20-секундная задержка для всех сетевых запросов и загрузки и скорость загрузки 14,4 Кбит/с. Дополнительные сведения о параметрах командной строки для эмулятора см. Запустите эмулятор из командной строки.

Чтение с помощью logcat

После того, как вы сможете воспроизвести сбой, вы можете использовать такой инструмент, как логарифм для получения дополнительной информации.

Вывод logcat покажет вам, какие другие сообщения журнала вы распечатали, а также с другими из системы. Не забудьте отключить дополнительные Журнал заявлений, которые вы добавили, потому что их печать тратит ресурсы ЦП и батареи, пока ваше приложение Бег.

Предотвращение сбоев, вызванных исключениями нулевого указателя

Исключения нулевого указателя (идентифицируемыми по типу ошибки времени выполнения NullPointerException ) возникают, когда вы пытаетесь получить доступ к объекту, который null, обычно вызывая его методы или обращаясь к его членам. Нулевой указатель исключения являются основной причиной сбоев приложений в Google Play. Цель null означает, что объект отсутствует, например, он не создан или назначен еще. Чтобы избежать исключений нулевого указателя, вам необходимо убедиться, что что ссылки на объекты, с которыми вы работаете, не равны нулю перед вызовом методы на них или пытаясь получить доступ к их элементам. Если ссылка на объект null, хорошо обработайте этот случай (например, выйдите из метода перед выполнением любые операции со ссылкой на объект и запись информации в журнал отладки).

Потому что вы не хотите проверять null для каждого параметра каждого метода вызванный, вы можете положиться на IDE или на тип объекта, чтобы обозначить обнуляемость.

Язык программирования Java

Следующие разделы относятся к языку программирования Java.

Предупреждения о времени компиляции

Аннотируйте параметры методов и возвращаемые значения с помощью @Nullable и @NonNull для получения времени компиляции предупреждения от IDE. Эти предупреждения подсказывают вам ожидать объект, допускающий значение NULL:

Эти проверки нулевых значений предназначены для объектов, которые, как вы знаете, могут быть нулевыми. Исключение на Объект @NonNull указывает на ошибку в вашем коде, которую необходимо устранить. адресованный.

Ошибки времени компиляции

Поскольку допустимость значений NULL должна быть значимой, вы можете внедрить ее в используемые вами типы так что есть проверка времени компиляции на нуль. Если вы знаете, что объект может быть null, и что обнуляемость должна быть обработана, вы можете обернуть его в объект, например Дополнительно . Вы всегда должны отдавать предпочтение типам, которые передают значение NULL.

Котлин

Котлин, обнуляемость является частью системы типов. Например, переменная должна быть объявлена ​​из начало как обнуляемое или не обнуляемое. Типы, допускающие значение NULL, помечаются символом ? :

 // ненулевой
var s: String = "Привет"
// ноль
вар с: Строка? = "Привет"
 

Переменным, не допускающим значение NULL, нельзя присвоить нулевое значение и переменным, допускающим значение NULL необходимо проверить на обнуляемость, прежде чем использовать как ненулевой.

Если вы не хотите явно проверять значение null, вы можете использовать ?. безопасный вызов оператор:

 val длина: Int? = string?.length // длина — целое число, допускающее значение NULL
                                   // если строка равна нулю, то и длина равна нулю
 

Рекомендуется убедиться, что вы обращаетесь к нулевому регистру для объекта, допускающего значение NULL, или ваше приложение может попасть в неожиданное состояние. Если ваше приложение не будет падать больше с NullPointerException вы не будете знать, что эти ошибки существуют.

Ниже приведены некоторые способы проверки на нуль:

  • если проверяет

     val length = if(string != null) string.length иначе 0
     

    Из-за смарт-приведения и проверки нуля компилятор Kotlin знает, что строковое значение не равно нулю, поэтому оно позволяет вам напрямую использовать ссылку, без необходимости оператора безопасного вызова.

  • ?: Оператор Элвиса

    Этот оператор позволяет указать «если объект не нулевой, вернуть объект; в противном случае верните что-нибудь еще».

     val длина = строка?.длина?: 0
     

Вы все еще можете получить NullPointerException в Kotlin. Ниже приведены наиболее распространенные ситуации:

  • Когда вы явно выдаете NullPointerException .
  • При использовании нулевое утверждение !! оператор. Этот оператор преобразует любое значение в ненулевой тип, выдавая NullPointerException , если значение равно null.
  • При доступе к нулевой ссылке типа платформы.

Типы платформ

Типы платформ — это объявления объектов из Java. Эти типы специально обработаны; нулевые проверки не так принудительны, поэтому ненулевая гарантия такая же, как в Ява. Когда вы обращаетесь к ссылке на тип платформы, Kotlin не создает compile ошибки времени, но эти ссылки могут привести к ошибкам времени выполнения. См. следующее пример из документации Kotlin:

 val list = ArrayList() // ненулевой (результат конструктора) list.add("Item")
val size = list.size // ненулевой (примитивный int) val item = list[0] // платформа
предполагаемый тип (обычный объект Java) item.substring(1) // разрешено, может вызвать
                                                       // исключение, если элемент == null
 

Kotlin полагается на вывод типа, когда значение платформы присваивается Kotlin переменная, или вы можете определить, какой тип ожидать. Лучший способ обеспечить правильное состояние обнуляемости ссылки, исходящей из Java, заключается в использовании обнуляемости аннотации (например, @Nullable ) в коде Java. Компилятор Котлина будут представлять эти ссылки как фактические типы, допускающие или не допускающие значение NULL, а не как типы платформы.

API-интерфейсы Java Jetpack снабжены аннотациями @Nullable или @NonNull по необходимости, и аналогичный подход применялся в SDK для Android 11. Типы из этого SDK, которые используются в Kotlin, будут представлены как правильные обнуляемые или необнуляемые типы.

Из-за системы типов Kotlin мы видели, что приложения значительно сократили NullPointerException аварийно завершает работу. Например, приложение Google Home показало 30% сокращение числа сбоев, вызванных исключениями нулевого указателя, в течение года, когда он перенесла разработку новых функций на Kotlin.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *