Упс как расшифровать: Недопустимое название — Викисловарь

Содержание

УПС — это… Что такое УПС?

УПС

устройство подвесное для скипов

горное оборудование

УПС

устройство переговорное симплексное

Источник: http://www.domofoncyfral.ru/prod/tap/UPS.htm

УПС

Управление правительственной связи

в составе ФАПСИ

связь

УПС

универсальная путеобследовательская станция

ж.-д.

Источник: http://www.infotrans-logistic.ru/product1.jsp?prodid=136

  1. ГОУ УП РСУ «Учпрофстрой»
  2. УПС

Учпрофстрой

с 1994

образовательное учреждение
г. Великий Новгород

http://novric.niac.ru/​ups/​

образование и наука

УПС

удельное периферическое сопротивление

кардиология

мед.

Источник: http://lib.sportedu.ru/Press/TPFK/2002n2/p9-12.htm

УПС

универсальный полочный стеллаж

Источник: http://www. youris.com.ua/mups.htm

УПС

улучшенная производственная система

Источник: http://www.mtszerno.ru/scripts/gr/prnv.tr?docid=982

УПС

управление пограничным слоем

Словарь: С. Фадеев. Словарь сокращений современного русского языка. — С.-Пб.: Политехника, 1997. — 527 с.

УПС

Украинская партия справедливости

полит., Украина

Источник: http://www.niss.gov.ua/book/Kremin/06.htm

УПС

установка поверки счётчиков

Источник: разработки лаборатории № 9 ОАО «Гипрониигаз»

УПС

учебное парусное судно

морск.

Источник: http://kerch.com.ua/articleview.aspx?id=621

Пример использования

УПС «Надежда»

УПС

универсальная пневматическая сеялка

в маркировке

Источник:

http://www.traktor-orel.ru/seialka7.shtml

Пример использования

УПС-12

УПС

установка первичной сепарации;
установка предварительной сепарации

Источник: http://www. intekufa.ru/UPN-Samsik.htm

УПС

устройство пароструйное

стом.

УПС

устройство первичного стыка

связь

УПС

укрупнённые показатели стоимости

Словарь: С. Фадеев. Словарь сокращений современного русского языка. — С.-Пб.: Политехника, 1997. — 527 с.

  1. УПА
  2. УПС

управляемый подводный снаряд

  1. УПС

Источник: http://www.deepstorm.ru/DeepStorm.files/45-92/sass/ups/list.htm

  1. УПС
  2. УПС-

устройство сигнализации пневматическое

в маркировке

  1. УПС

Источник: http://www.centravtomat.ru/products/ups.php

  1. УПС-

Пример использования

УПС-03-1

УПС

учебно-производственное судно

морск.

УПС

устройство против скольжения

Источник: http://www.spbprop.ru/?section=products&page=reabilitation

УПС

уровень перинатальной смертности

Источник: http://www. sadovoy-center.ru/rodi.html

УПС

управляемый противотанковый снаряд


после: ПТУР

УПС

уплотнение для подвижных соединений

передающих возвратно-поступательные движения

УПС

установка пожарной сигнализации

ж.-д.

  1. УПС
  2. УПС-

узел пишущий специальный

в маркировке

  1. УПС

Источник: http://usetender2.m-10.ru/fullcatalog/n_1097809_p1.shtml?sid=

  1. УПС-

Примеры использования

УПС-01

УПС-03М

УПС

Управление почтовой связи

связь

УПС

универсальная установка для ручной плазменной сварки

УПС

устройство преобразования сигналов

УПС

указатель положения стабилизатора

УПС

установка послойного синтеза

Источник: ОАО НИПТИ «Микрон»

УПС

Управление продовольственного снабжения

Министерства обороны

воен. , гос.

УПС

удельная плотность сетки

нефт.

энерг.

УПС

ударопрочный полистирол

УПС

учебно-практический семинар

образование

УПС

Уралпромсталь

с 2001

г. Белорецк

http://usteel.ru/​

Башкирия, организация

УПС

«Универсальные платёжные средства»

ООО

Москва, организация

Источник: http://www.cnews.ru/news/line/index.shtml?2006/12/11/227732

УПС

узел почтовой связи

связь

Источник: http://www.spbit.ru/interview/i9223/

УПС

управление профилактической службы

Источник:

http://www.rosbalt.ru/2006/02/27/245136.html

Пример использования

УПС ГУВД Ташкента

УПС

устройство подъёма створки

Источник: http://www. franplast.ru/aubi.html

УПС

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

нефт.

энерг.

УПС

управление пожарной службы

МЧС РФ

РФ

Словарь: Словарь сокращений и аббревиатур армии и спецслужб. Сост. А. А. Щелоков. — М.: ООО «Издательство АСТ», ЗАО «Издательский дом Гелеос», 2003. — 318 с.

Словарь сокращений и аббревиатур. Академик. 2015.

ИБП (UPS) — источник бесперебойного питания для дома и офиса

Что такое ИБП / UPS? ИБП (UPS) – русская аббревиатура ИБП расшифровывается так ИСТОЧНИК БЕСПЕРЕБОЙНОГО ПИТАНИЯ, (англ. UPS — Uninterruptible Power Supply) – переводится как ИСТОЧНИК ВТОРИЧНОГО ЭЛЕКТРОПИТАНИЯ.

Принцип работы ИБП / UPS

Если произойдут перепады в напряжении, то ИБП продолжит работоспособность компьютеров, вычислительных/телекоммуникационных устройств, газовых котлов, насосов,  обеспечит питание для охранно-пожарной сигнализации или видеонаблюдения. Если произойдет сбой в электросети (пропадет питание), в лучшем случае вся техника просто отключится, и вы потеряете не сохраненную информацию на компьютере, в худшем — это приведёт к поломке каких-либо устройств.

ибп для котласхема подключения ибп

Основные отличительные свойства ИБП / UPS

ИБП — Резервный или Оff-line (back)ИБП — Линейно-интерактивные (line-interactive)Online – ИБП

Резервный или Оff-line (back) – простой в использовании и дешевый, но популярный и часто используемый в домашних условиях тип ИБП. На источнике бесперебойного питания есть внутренний аккумулятор, который сам заряжается, когда к нему поступает ток. Схема его работы довольно проста: если ток не поступает, то питание компьютера происходит из внутреннего аккумулятора. С таким ИБП у вас будет от 5 до 15 минут, чтобы безопасно завершить работу компьютера.

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

Линейно-интерактивные (line-interactive) — имеет те же качества что и Оff-line, но еще при этом он может поддерживать равномерное напряжение в системе. В таких случаях он отрегулирует перепады тока при выходе из ИБП до нужного уровня. Это лучший выбор из возможных вариантов, так как подобные ИБП самые стабильные в работе. Такие ИБП более пригодны для длительной работы в домашних условиях, в отличие от моделей Оff-line, но стоимость их будет значительно выше. После перехода на самостоятельное питание вы сможете закончить работу ПК в течение 6-20 минут.

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

Мощность ИБП / UPS

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

Размеры ИБП / UPS

размеры ИБП

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

Время самостоятельной работы ИБП / UPS (автономность)

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


Разъёмы и розетки ИБП / UPS

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

разъемы ибп

Производители ИБП / UPS

Чаще всего производитель не имеет значения. И потому у изготовителей с одинаковым уровнем качества и цена приблизительно одинаковая. Хорошими изготовителями ИБП являются Ippon, Powerware, CyberPower, FSP Group. Большинство их, как правило, предоставляют гарантию на 6-12 месяцев.

Оцените качество статьи:

Apc smart ups 1000 индикация

Подробное описание всевозможных сочетаний световых индикаторов всегда можно найти в Руководстве пользователя данного устройства. Здесь приведены расшифровки, наиболее часто встречающиеся обозначений — рисунков светодиодных индикаторов и звуковых сигналов спикера на наиболее часто встречающихся мне источников бесперебойного питания (ИБП).

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

Индикаторы состояния и функций, обозначения на корпусе, расшифровка пиктограмм и значков на корпусе UPS (ИБП) — источниках бесперебойного питания.

ИБП осуществляет подачу питания от батареи (напряжение подается от аккумулятора) к подключенному оборудованию. При этом значок — светодиод горит зеленым или (в некоторых моделях красным, желтым, оранжевым, ) а так же может просто мигать зеленым.

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

Перегрузка (красный индикатор) – загорается во всех случаях, когда подключенная нагрузка превышает допустимую для ИБП — потребление электроэнергии превышает мощность устройства.

Заменить аккумулятор (красный светодиод) – загорается во всех случаях, когда аккумуляторная батарея отключена или нуждается в замене (или аккумулятор не подключен). Стандартное рабочее напряжение аккумуляторной батареи бесперебойника 13,5-13,8 вольт.

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

Красный /оранжевый/желтый/зеленый/ индикатор мигает.

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

Индикатор как правило красного цвета.

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

Постоянно горит светодиодный индикатор «Авария». Это указывает на возникновение неисправности ИБП, а мигание этого индикатора (обычно красного или оранжевого ) указывает на перегрев изделия.

Загорается зеленый индикатор . Для вкл./откл. бесперебойника нажмите данную кнопку. У некоторых производителей для включения отключения устройства необходимо удерживать данную кнопку в течение от 2 — 3 секунд.

Однократный звуковой сигнал при включении.

Панель управления: Пентаграммы возле света диодного индикатора, сигнализация- cветодиодного дисплея, условные обозначения значковОписание — расшифровка обозначений значков возле индикации на корпусе ИБП (шкал нагрузки, состояния и заряда батареи), условия срабатывания, режимы работы
Питание от сети — «On Line»

Питание от сети (зеленый индикатор) – загорается во всех случаях, когда ИБП осуществляет подачу питания (напряжение подается) от сети к подключенному оборудованию. Штатный режим работы.

Звуковых сигналов — гудков нет.

Питание, работа от батареи — «On Battery» (режим резервного питания)
Предупреждение о разряде батареиЗеленый индикатор — мигает. Частые гудки
Перегрузка — «Overload «
Заменить батарею или батарея отключена — «Replace Battery»
Изменение напряжения — «AVR»ИБП компенсирует слишком высокое или слишком низкое сетевое напряжение.
Обходной режим, режим байпас — (Bypass — «обход»)
Авария — Неисправен
» border=»0″ align=»left» border=»0″ vspace=»3″ hspace=»4″ w > Отключение звукаДля отключение соответствующего звукового оповещения нажмите на данную кнопку.
Включение/выключение ИБП — «Power On»
«Главный выход» включен (розетка с надписью — «Master»)Индикатор «Master Enable» горит зеленым . Что бы выключить зависимость питания розеток от главной управляющей необходимо потушить диод зеленый света нажатием на кнопку с листочком (до 2 секунд).

Расшифровка — описание звуковых сигналов бесперебойника (ИБП — UPS) – аудио сигналов.

Разбор проблем и алгоритмов работы источников бесперебойного питания ИБП или UPS (УПС) и защиты бесперебойника следующий:

1.При отключении электричества — «On Battery» (режим резервного питания)

В случае прекращения подачи питания от сети ИБП автоматически переключается в режим питания от аккумуляторной батареи.

Панель индикации ИБП Ippon

Например

APC Smart-UPS:

При работе от батареи ИБП подает четыре коротких звуковых сигнала (зуммера или спикера) через каждые 30 секунд (редкие гудки).

Smart Power Pro от Ippon: Аудио сигналы при работе от батарей 1 раз в 10 сек, осталось около 20-30% заряда батареи (редкие гудки).

ИБП Delta серии Amplon: Каждые 2 сек подаётся сигнал зуммера длительностью 0,5 сек, при этом ИБП продолжает подавать питание в нагрузку от батареи

Рекомендации:
  • Это расчетный режим работы ИБП. Исправный ИБП подает звуковые сигналы (пищит) в режиме работы от батареи. В данный момент он питает и осуществляет защиту от всплесков напряжения подключенного к нему оборудования.
  • Но Вам необходимо подготовиться к возможному скорому завершению работы (в случае не возобновления подачи электроэнергии в сети).

2.Критически низкий уровень заряда (недостаточный заряд аккумулятора) ИБП

Например:

APC Smart-UPS: При достижении батареей критически низкого уровня заряда ИБП начинает подавать короткие звуковые сигналы до полного отключения (по умолчанию за 1-2 минуты). Зеленый индикатор — мигает. Частые звуковые сигналы (каждые 1/2 секунды).

Smart Power Pro от Ippon: Аудиосигналы: Малый остаточный заряд батареи (2 раза за 1 сек)

ИБП Delta серии Amplon: При разряде батарей более определённого уровня ИБП пищит — подаёт звуковой сигнал длительностью 0,5 секунд через каждые 1,5 секунд, пока они не разрядятся полностью.

Рекомендации:

Панель индикации ИБП APC

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

После полной разрядки при включении оборудования и ИБП:

  1. Следует обратить внимание, что в случае полной разрядки, после автоматического отключения батареи в результате разрядки ИБП начинает заряжать батарею. При достижении установленного уровня заряда включается подача питания на подключенное оборудование (поэтому нужно подождать от нескольких считанных секунд до пары минут).
  2. Если батарея полностью разрядилась, то что бы она полностью восстановилась обычно просто достаточно ее заряжать в течение следующих 24 часов (оставить включенной в сеть).
  3. Допускается использование ИБП немедленно после подключения к питающей сети, не дожидаясь полного заряда батарей. У большинства производителей устройства заряжаются при подключении к электросети вне зависимости от того, включены они или нет.

Например: Smart Power Pro от Ippon: Обычное время заряда 4 часа (до 90% полной емкости).

3.ИБП перегружен — «Overload»

Например:

Smart Power Pro от Ippon: Перегрузка (так же непрерывный звук спикера)

ИБП Delta серии Amplon: Перегрузка. Если нагрузка на выходе ИБП превосходит номинальную, то по истечении определённого времени загорается индикатор перегрузки и подаётся непрерывный звуковой сигнал.

APC (American Power Conversion) Smart-UPS: Подача постоянного беспрерывного звукового сигнала будет продолжаться до устранения перегрузки.

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

Т.е подключенное оборудование потребляет больше ВА или Ватт, чем может обеспечить ИБП. Нагрузка от подключенного оборудования превышает «максимально допустимое значение».

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

Важно:

Панель индикации ИБП Delta

Как правило большинство ИБП (UPS) автоматически выключится, если нагрузка составит 110% от допустимой в течении 60 сек. или 130% в течение 3 секунд (в процентах от номинальной).

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

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

Рекомендации:
  1. Для устранения перегрузки отсоедините от ИБП оборудование, в котором нет необходимости.
  2. Некоторое оборудование, например, лазерные принтеры, плоттеры периодически потребляют достаточно большую мощность в виде непродолжительных всплесков. До 1000 Вт, в течение нескольких секунд, после чего потребление прекращается, чтобы возобновиться уже через считанные секунды.
  3. Поэтому если ИБП берется, в том числе и с целью использования его в качестве источника питания лазерного принтера, необходимо убедитесь, что том, что он в состоянии обеспечить максимальную мощность, необходимую принтеру.
  4. В то же время многие производители бесперебойных устройств рекомендуют для обычного пользователя просто не подключать такие устройства как лазерный принтер к бесперебойнику, так как правило, данное устройство в большинстве случаев для работы компьютерного сегмента является второстепенным элементом. Или подключать к выходам с надписью Surge protection (Only) — безбатарейной защитой (см. здесь).

4.Авария — (неисправен) источник бесперебойного питания

Сигнал высокого тона в течение 1 минуты через каждые 5 часов – этот аварийный сигнал подается во всех случаях, когда аккумулятор не проходит тесты автоматической диагностики.

ИБП Delta серии Amplon: В случае не исправности батареи подается три звуковых сигнала длительностью по 0,5 секунд с перерывом между сигналами также 0,5 секунд. После подачи первых трёх сигналов аналогичные сигналы подаются каждый час

Как видно и заголовка поста, я хочу поделится информацией о своем опыте замены АКБ в серверном ИБП APC Smart-UPS 1000.

Итак, имею в офисе такой ИБП. Датированный 4-м августа 2007 года. Установлен он был без моего участия и, по всей видимости, работал «как есть» все это время.

В конце апреля ИБП осчастливил меня индикацией «Срочно замени батареи». Сервер был переключен на временный подменный источник питания, а этот перемещен на снятие батарей.
Как бы и неудивительно… Без малого 7 лет достаточно приличный срок для кислотного аккумулятора.

Насколько я понял, Смарты 1000ВА существуют нескольких модификаций. У меня модификация SUA1000I, внутри ИБП стоит 2 батареи емкостью 12Ач. Между собой склеены серьезным 2-сторонним скотчем (еле оторвал). Включены последовательно через предохранитель 60А, соответственно, на низковольтной части напряжение 24В.
Естественно, на батареях красуется наклейка APC:

Под которой я, честно говоря, по опыту, ожидал увидеть маркировку производителя батарей CSB. Но оказалось, что в этом ИБП стоят, неведомые мне, Kung Long WP12-12, Made in Taiwan:

Как подсказал опыт коллег, я не зря ожидал увидеть CSB — в многих аналогичных ИБП стоят именно CSB.
Для замены доступны оригинальные пакеты батарей от APC — RBC6. На Украине их цена на сегодняшний день составляет около 2500 грн. (

$210). CSB GP12120 F2, которые используются в оригинальных сборках, стоят по 600 грн (

$50) за шт. Т.е. за в 2 раза меньшую сумму мы получаем батареи не хуже оригинала, только без предохранителя и скотча. 🙂
Батареи были куплены и установлены…

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

И тут началось самое интересное. 🙂
Гугл указал на страницу с описанием сей хитрой процедуры, правда для ИБП с 4-мя батареями по 7Ач — ekorshunov.blogspot.com/2…pc-smart-ups-1000-rm.html
Утилиты upsdiag и APCFIX были скачаны, ИБП они восприняли нормально.

Но вот ведь не задача — консоль APC PowerChute Bussines Edition устанавливали до меня и какие были созданы учетные записи я не в курсе… Всевозможные комбинации логина и пароля, включая вероятные пароли предыдущего админа, я перепробовал — безрезультатно.
Опыт коллег подсказывает, что в таком случае необходима полная переустановка консоли. И тут появляются следующие грабли — консоль напрочь отказывается удаляться! Плюс это все усугубляется возможностью работать с сервером только в нерабочее время — поздний вечер и ночь, даже в выходные не всегда сервер свободен…

Но вариантов нет — надо удалять руками:

1. Останавливаем службы APC PBE Agent и APC PBE Server

2. Удаляем папки:
— C:Program FilesAPCPowerChute Business Editionagent
— C:Program FilesInstallShield Installation Information
— C:Program FilesAPCPowerChute Business Editionserver
— C:Program FilesCommon FilesAPC
— C:Program FilesInstallShield Installation Information
— C:Program FilesAPCPowerChute Business Editionconsole
— C:Program FilesInstallShield Installation Information

3. Запускаем regedit и удаляем ветки реестра:
— HK_L_MSOFTWAREAPCPowerChute Business Edition
— HK_L_MSOFTWAREMicrosoftWindowsCurrentVersionAppPaths
— HK_L_MSOFTWAREMicrosoftWindowsCurrentVersionUninstall
— HK_L_MSYSTEMControlSet001EnumRootLEGACY_APCPBEAGENT
— HK_L_MSYSTEMControlSet001ServicesAPCPBEAgent
— HK_L_MSYSTEMControlSet001ServicesEventlogApplicationAPCPBEAgent
— HK_L_MSYSTEMCurrentControlSetEnumRootLEGACY_APCPBEAGENT
— HK_L_MSYSTEMCurrentControlSetServicesAPCPBEAgent
— HK_L_MSYSTEMCurrentControlSetServicesEventlogApplicationAPCPBEAgentServer
— HK_L_MSOFTWAREMicrosoftWindowsCurrentVersionUninstall
— HK_L_MSYSTEMControlSet001EnumRootLEGACY_APCPBESERVER
— HK_L_MSYSTEMControlSet001ServicesAPCPBEServer
— HK_L_MSYSTEMCurrentControlSetEnumRootLEGACY_APCPBESERVER
— HK_L_MSYSTEMCurrentControlSetServicesAPCPBEServerConsole
— HK_L_MSOFTWAREAPCPowerChuteBusinessEditionconsole
— HK_L_MSOFTWAREMicrosoftWindowsCurrentVersionApp Pathsconsole. exe
— HK_L_MSOFTWAREMicrosoftWindowsCurrentVersionUninstall

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

4. Перезапускаем компьютер и радуемся нерабочим ярлыкам консоли. 🙂

Включаем ИБП и ждем пока он полностью зарядит батареи.

После этого качаем с саета АРС свеженькую версию консоли, благо, она доступна бесплатно. И устанавливаем ее, создавая при этом уже свои учетки.

После установки консоли возвращаемся к инструкции г-на Коршунова (ссылка в начале поста):
1. при помощи upsdiag, предварительно остановив службы АРС, редактируем регистр «0» — вместо «73» ставим максимально возможное значение — «FF».
2. запускаем службы АРС и через консоль редактируем дату замены батарей.
3. нагружаем ИБП на 40-50% мощности и запускаем калибровку. Первый раз я калибровал без нагрузки — регистр «0» остался равен «FF», поэтому калибровка в холостую бессмысленна. По окончании должны получить такую картину:

Все. Калибровка завершена. Опять останавливаем службы АРС и usbdiag`ом проверяем значение регистра «0», установленное в результате калибровке.
У меня, правда, в отличии от г-на Коршунова, ИБП накалибровал значение «А6» — меньше, чем «С1». Т.к. у него новые батареи емкостью 4*9Ач, а у меня всего лишь 2*12Ач. 🙂 Но конечный параметр весьма хороший.
Незабываем обратно запустить службы АРС.

На этом можно считать замену батарей законченной.

Инструкция APC Smart-UPS 1000VA/670W (SUA1000I) для устройства источник бесперебойного питания (ИБП) содержит страницы на русском языке.

Размер файла: 602.50 kB. Состоит из 22 стр.

Вы можете скачать pdf файл этой инструкции: Скачать PDF

Режим
повышения на-
пряжения

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

Питание
от батареи

Если горит этот индикатор, значит, источник бесперебойного питания подает
электроэнергию к подсоединенному оборудованию от аккумуляторной батареи.
В режиме питания от батареи ИБП подает четыре коротких звуковых сигнала
каждые 30 секунд.

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

Необходима
замена батареи

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

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

Устройство выполняет автоматическую самопроверку при включении и через
каждые две недели после включения (частота выполнения самопроверки задана
по умолчанию).

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

, и устройство сразу переключается в режим питания от сети.

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

Включение са-
мопроверки
вручную

Для того, чтобы начать самопроверку вручную, нажмите кнопку

удерживайте ее нажатой в течение нескольких секунд.

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

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

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

Рекомендуем к прочтению

Схема формирования названий источников бесперебойного питания Eaton

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

Система формирования названий ИБП Eaton Powerware

Существуя на специализированном рынке уже более 100 лет, успешная американская компания приобрела размеры многоотраслевой корпорации, объемы продаж которой за последний год исчисляются в миллиардах долларов. В процессе роста Eaton были приобретены некоторые бренды производителей систем бесперебойного питания, одним из которых стал небезызвестный Powerware. Так производство источников бесперебойного питания под брендом Powerware стало одним из основных бизнес-направлений Eaton. 

Отталкиваясь от девяти главных проблем, возникающих с электропитанием, специалисты компании выработали свою уникальную концепцию формирования наименований ИБП Powerware, получившую название «3-5-9». Номер серии ИБП Eaton Powerware (3-5-9), присутствующий в названии каждой модели, свидетельствует о количестве проблем с электропитанием, которые под силу решить каждому конкретному бесперебойнику. Так, к 3 серии относятся устройства резервного типа (топология Off-line), решающие три главных проблемы: исчезновение питания, провал напряжения и всплеск напряжения. Серия 5 представлена линейно-интерактивными бесперебойниками, способными противостоять еще двум проблемам, а именно понижению и повышению напряжения. К 9 серии относятся самые дорогостоящие устройства топологии On-line – эти высокотехнологичные ИБП с двойным преобразованием способны решать все девять возможных проблем с электропитанием, к которым, помимо вышеперечисленных, также относятся: высокочастотные помехи, нарушение стабильности частоты, переходные процессы при коммутации и нелинейные искажения напряжения. 


В силу популярности высокотехнологичной продукции Eaton Powerware, сделавшей себе имя на специализированном рынке, концепция «3-5-9» в настоящее время становится общепринятой среди производителей систем бесперебойного питания. 

Схема формирования названий ИБП Eaton

Практически все бесперебойники, реализуемые компанией Eaton, носят информативные названия, которые складываются из серии (3-5-9) и класса устройства. При этом, если серия, как уже говорилось выше, указывает на топологию устройства (Off-line, Line Interactive, On-Line), класс свидетельствует о его функциях. Так ИБП Eaton серии 5P (Премиум), в отличие от устройства менее высокого класса Eaton 5S (Стандарт), обладают рядом дополнительных функций, таких как ЖК-дисплей с меню управления, возможность измерения электроэнергии и другими.


Cхема формирования названий ИБП Eaton

Данная схема формирования названий (серия + класс) ИБП Eaton является наиболее упрощенной. Названия некоторых линеек бесперебойников, выпускаемых компанией, также могут включать количество фаз тока и указание на модульность или конфигурацию устройства. Так в названии ИБП 93PM, число 9 будет указывать на On-line топологию устройства, 3 – на количество фаз, буква «P» будет свидетельствовать о классе устройства, а «M» – о его модульности. Буква «X» в наименовании ИБП, в свою очередь, будет указывать на универсальный трансформируемый корпус бесперебойника (возможен как вертикальный, так и горизонтальный монтаж), то есть наименование ИБП 9PX можно расшифровать как: ИБП с двойным преобразованием, класса Премиум в универсальном корпусе.

Среди линейно-интерактивных бесперебойников Eaton также присутствует серия 5SC, в названии которой последняя буква указывает на компактность устройства.

«Несистемные» наименования

В широком модельном ряду ИБП Eaton также присутствуют линейки ИБП с «несистемными» наименованиями, появившиеся, как и концепция «3-5-9», вследствие приобретения Eaton других брендов производителей ИБП. Так, в 2007 году корпорацией были выкуплена компания MGE Office Protection Systems. Данное приобретение позволило Eaton занять позицию одного из самых крупных производителей однофазных ИБП в мире, реализуя решения MGE Office Protection Systems, в рамках серии Pulsar, нацеленной на небольшие компании и обитателей жилых домов, желающих обезопасить технику от проблем с электропитанием.

За продукцией ранее выпускаемой MGE Office Protection Systems частично сохранились прежние названия, равно как и за некоторыми моделями бренда Powerware, названия которых не были преобразованы по схеме «серия + класс».



Среди несистемных наименований ИБП Eaton можно выделить следующие:

  • Protection Station (Off-line) – ранее был известен как Protection Center от MGE Office protection Systems. 

  • Ellipse Eco (Off-line) и Ellipse Pro (Line Interactive) – заменили снятые с производства Ellipse ASR и Pulsar ES от MGE Office protection Systems.

  • Eaton EX – замена Pulsar SX и Pulsar EXtreme от MGE Office protection Systems.

  • Eaton 5130 (Line Interactive) – замена Powerware 5125 и 5125RM;
  • Eaton 9130 (On-line) – замена Powerware 9120 и 9125;
  • Eaton 9155 (On-line) – замена Powerware 9150;
  • Eaton 9355 (On-line) – замена Powerware 9350;
  • Eaton BladeUPS (On-line) – ранее Powerware BladeUPS;
  • Power Xpert 9395 (On-line) – ранее Powerware 9315 и 9370.

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


Как расшифровать U.P.S. Информация из штрих-кода UPS MaxiCode?



Недавно я купил считыватель штрих-кодов 2D. При сканировании штрих-кода U.P.S. я получаю примерно половину нужной мне информации, и примерно половина ее выглядит каким-то образом зашифрованной. Я слышал, что есть UPS DLL.

Пример-все, что выделено жирным шрифтом, кажется зашифрованным, в то время как не выделенный жирным шрифтом текст содержит ценные, законные данные.

[)>01961163522424800031Z50978063UPSN12312307G:%»6*AH537&M9&QXP2E:)16(E&539R’64O

Другими словами, этот текст кажется OK-и я могу разобрать информацию [)>01961163522424800031Z50978063UPSN123123 …

В то время как эти данные, по-видимому, зашифрованы … 07G:%»6*AH537&M9&QXP2E:)16(E&539R’64O

Есть Идеи???


Все, что я читаю в интернете, говорит о том, что я должен быть в состоянии прочитать эту вещь. Я просто не нахожу никакой информации о деталях. Информация «encrypted» содержит адрес улицы, номер посылки (например, 1/2), вес) и несколько других предметов, которые я умираю от желания заполучить в свои руки. Полагаю, я свяжусь с UPS напрямую. Спасибо.

2d barcode shipping ups
Поделиться Источник user46482     15 декабря 2008 в 22:04

8 ответов


  • Декодирование поднимает Maxicode

    Я пытаюсь декодировать UPS Maxicode в java и получаю следующий результат : [)>02967780900008400031Z49675335UPSN330W9107$FL:X-/,UY JKY -M,R(‘3(PH6W ) 0.SXI#Z%H(J Он дает номер дома и название улицы в конце статьи по ссылке ниже: http://www.idautomation.com/maxicodefaq.html#чтение-MaxiCode Я не…

  • Предварительная обработка штрих-кода для zbar

    Я использую камеру raspberry pi для считывания штрих-кодов с изображения, и объект должен быть относительно далеко от камеры в моем приложении. Штрих-код перед обработкой: Збар не смог ничего расшифровать из этого изображения, и я решил попробовать отредактировать изображение вручную, чтобы…



3

Данные после SCAC сжимаются и требуют DLL или какого-либо другого компонента из UPS для декодирования. Обратите внимание, что a MaxiCode содержит только около 100 символов данных, поэтому для кодирования большего количества данных доставки требуется сжатие.

Поделиться andyknas     10 января 2011 в 03:51



1

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

Поделиться Nethos     29 ноября 2010 в 03:10



1

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

Поделиться dkretz     15 декабря 2008 в 22:10




0

Проверьте этот сайт, он предоставляет бесплатное приложение для декодирования.

MaxiCode штрих-код FAQ & учебник по IDAutomation® Maxicode — это международный 2D (двумерный) штрих-код, который в настоящее время используется UPS на транспортных этикетках для Всемирной адресации и сортировки упаковки. …

http://www.idautomation.com/maxicodefaq.html

Поделиться Bruce     11 мая 2010 в 23:26



0

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

Поделиться dkretz     25 января 2009 в 04:36



0

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

Как я уже сказал, когда информация RETRIEVED, половина информации выходит искаженной (инкриптированной?) и нет никакой документации, чтобы расшифровать этот код…

Судя по ссылке, которую вы мне прислали, я должен увидеть что-то вроде этого:

[)>01963360910628400021Z14647438UPSN410E1W1951/1Y135ReoTAMPAFL

Тем не менее, я получаю что-то вроде этого:

[)>01961163522424800031Z50978063UPSN12312307G:%»6*AH537&M9&QXP2E:)16(E&539R’64O

Это наводит меня на мысль, что страница, которую вы мне прислали, либо out-of-date, либо это просто ссылка на то, как использовать их элементы управления для кодирования, а не для декодирования.

Поделиться user46482     16 декабря 2008 в 13:27



0

Почему вы думаете, что UPS хочет, чтобы вы расшифровали эту часть? Более того, я считаю, что кусок кода не закодирован — это может быть ID чего-то в их DB.

Поделиться Skuta     16 декабря 2008 в 13:31



0

http:/ / www.google.com / patents / US7039496 содержит довольно много информации о закодированных данных в изображениях 3-12. Похоже, что первый дает несжатый формат, а второй-словарь сжатия. В описании содержится ссылка на множество стандартов ANSI, которые находятся за пределами моего понимания, но, похоже, то, что вы видите, — это строка формата '07' , так что, возможно, здесь достаточно информации для полного декодирования?

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

Поделиться djmitche     04 мая 2014 в 19:50


Похожие вопросы:


Формат номера штрихкода DHL , TNT , UPS земли

мне нужно знать формат номера штрих-кода (tracking number ) для моей заявки на следующие транспортные компании DHL , TNT , UPS ground например, если номер штрих-кода любой компании 1234567890…


как получить изображение штрих-кода из заданного штрих-кода

я хочу получить изображение штрих-кода из заданного номера штрих-кода в моем приложении android, может ли кто-нибудь предложить мне это в моем приложении? Пожалуйста, помогите мне заранее спасибо


как расшифровать изображение штрих-кода EAN-13 в iPhone?

В моем приложении мне нужно декодировать изображение штрих-кода EAN-13. Изображение, полученное из iphone camera. after захвата изображения штрих-кода, которое я должен декодировать .i, является…


Декодирование поднимает Maxicode

Я пытаюсь декодировать UPS Maxicode в java и получаю следующий результат : [)>02967780900008400031Z49675335UPSN330W9107$FL:X-/,UY JKY -M,R(‘3(PH6W ) 0.SXI#Z%H(J Он дает номер дома и название…


Предварительная обработка штрих-кода для zbar

Я использую камеру raspberry pi для считывания штрих-кодов с изображения, и объект должен быть относительно далеко от камеры в моем приложении. Штрих-код перед обработкой: Збар не смог ничего…


Лучшая символика штрих-кода для моего приложения

//Please не закрывайте этот пост по субъективным причинам. Я разрабатываю приложение winform для заполнения форм, которое генерирует файл PDF при отправке информации. Файл PDF должен содержать…


ZXing не читает бразильские купюры со штрих-кодом (чередование 2 из 5) Правильно. Как я могу это исправить?

Я использую XZing 2.3.0 для чтения ITF штрих-кодов, но ZXing неправильно читает бразильские купюры с 47 цифрами. Следующий образец изображения штрих-кода ( доступен здесь ) считывается как…


Декодирование штрих-кода USPS PDF417 2D?

Я много гуглил и не смог найти алгоритм декодирования штрих-кода PDF417, используемого почтовой службой Соединенных Штатов. Я хочу извлечь из него информацию о получателе и отправителе с…


Более подробная информация из штрих-кода

Я использовал этот учебник http://www.sitepoint.com/creating-barcode-metadata-reader-ios / все прошло хорошо, но информация, которую показывает этикетка, — это только тип штрих-кода, но это слишком…


Требуется ли контрольная сумма в спецификации штрих-кода Code128?

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

Ибп что это такое расшифровка

Наиболее распространённой расшифровкой аббревиатуры ИБП является «источник бесперебойного питания». Причем в понятие «источник бесперебойного питания» входит широкая линейка оборудования с существенно отличающимися характеристиками и областью применения.

Наиболее распространены ИБП для персонального применения: для компьютеров, отдельных рабочих станций, небольших котлов и т.д. Принято относить данные устройства к сегменту «Массовый ИБП». Такие источники бесперебойного питания обычно выполнены по типу «Off-line» или «Line interactive». Источники бесперебойного питания «Off-line» являются пассивными и поэтому являются резервными. Время подключения питания от него достигает 15 мс. Также в нем отсутствует защита от провалов и повышения напряжения. На выходе при питании от аккумуляторных батарей у данного источника несуисоидальное выходное напряжение. Источники бесперебойного питания типа «Line interactive» обладают улучшенными по сравнению с источниками «Off-line» характеристиками, однако все равно имеют время переключения до 6 мс.

Далее идет оборудование, позволяющее резервировать небольшие ИБП для защиты индивидуальной нагрузки, например стойки сетевого оборудования, системы видеонаблюдения, дежурного освещения, кассового или малого промышленного оборудования. Мощность данных устройств не превышает 10 кВА. Принято относить данные устройства к сегменту «Корпоративный ИБП». Они могут быть выполнены по технологии «Line interactive» или «On-Line». Технология «On-Line» является наиболее продвинутой в техническом плане. Время переключения нагрузки на источник бесперебойного питания равно нулю, что дает возможность использования данных источников с самым чувствительным оборудованием.

Наиболее востребованной нашими потребителями линейкой является оборудование мощностью от 10 до 520 кВА. Данное оборудование выполняется в форм-факторе отдельно стоящих напольных блоков. Блоки аккумуляторных батарей вынесены в батарейные шкафы. В основном данное оборудование используется для резервирования группы ИТ оборудования, центров обработки данных, промышленных линий, медицинского оборудования. Принято относить данные устройства к сегменту “Промышленный ИБП». Данные источники бесперебойного питания выполняются исключительно по технологии «On-Line». Данные источники могут использоваться в центрах обработки данных, на промышленных объектах, в медицине и телекоммуникациях.

Наиболее распространённой расшифровкой аббревиатуры ИБП является «источник бесперебойного питания». Причем в понятие «источник бесперебойного питания» входит широкая линейка оборудования с существенно отличающимися характеристиками и областью применения.

Наиболее распространены ИБП для персонального применения: для компьютеров, отдельных рабочих станций, небольших котлов и т.д. Принято относить данные устройства к сегменту «Массовый ИБП». Такие источники бесперебойного питания обычно выполнены по типу «Off-line» или «Line interactive». Источники бесперебойного питания «Off-line» являются пассивными и поэтому являются резервными. Время подключения питания от него достигает 15 мс. Также в нем отсутствует защита от провалов и повышения напряжения. На выходе при питании от аккумуляторных батарей у данного источника несуисоидальное выходное напряжение. Источники бесперебойного питания типа «Line interactive» обладают улучшенными по сравнению с источниками «Off-line» характеристиками, однако все равно имеют время переключения до 6 мс.

Далее идет оборудование, позволяющее резервировать небольшие ИБП для защиты индивидуальной нагрузки, например стойки сетевого оборудования, системы видеонаблюдения, дежурного освещения, кассового или малого промышленного оборудования. Мощность данных устройств не превышает 10 кВА. Принято относить данные устройства к сегменту «Корпоративный ИБП». Они могут быть выполнены по технологии «Line interactive» или «On-Line». Технология «On-Line» является наиболее продвинутой в техническом плане. Время переключения нагрузки на источник бесперебойного питания равно нулю, что дает возможность использования данных источников с самым чувствительным оборудованием.

Наиболее востребованной нашими потребителями линейкой является оборудование мощностью от 10 до 520 кВА. Данное оборудование выполняется в форм-факторе отдельно стоящих напольных блоков. Блоки аккумуляторных батарей вынесены в батарейные шкафы. В основном данное оборудование используется для резервирования группы ИТ оборудования, центров обработки данных, промышленных линий, медицинского оборудования. Принято относить данные устройства к сегменту “Промышленный ИБП». Данные источники бесперебойного питания выполняются исключительно по технологии «On-Line». Данные источники могут использоваться в центрах обработки данных, на промышленных объектах, в медицине и телекоммуникациях.

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

Что такое ИБП?

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

Многообразие источников бесперебойного питания

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

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

Какие бывают ИБП?

Источники бесперебойного питания делятся на три вида:

  1. Оффлайн ИБП;
  2. Линейно-интерактивные ИБП;
  3. Онлайн ИБП (ИБП с двойным преобразованием).

Рассмотрим в отдельности каждый из видов бесперебойников. Эта информация поможет вам при выборе ИБП для собственных нужд.

Оффлайн ИБП

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

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

Данный вид получил широкое распространение у рядовых пользователей и в офисах.

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

Линейно-интерактивные ИБП

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

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

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

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

ИБП с двойным преобразованием

Данный тип ИБП выполняет преобразование напряжения дважды: входное переменное напряжение преобразуется в постоянное, а затем постоянное преобразуется в эталонное переменное напряжение и подается на устройства.

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

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

Минусы тоже имеются: дороговизна, сложная конструкция, потребление электроэнергии «на себя» в режиме двойного преобразования.

Основные характеристики ИБП

У ИБП есть несколько основных характеристик, на которые стоит обращать внимание при покупке. Рассмотрим их ниже.

  1. Мощность. Данная характеристика напрямую определяет какое оборудование может быть подключено к данному ИБП. Всегда выбирайте источник с запасом по мощности. Это позволит избежать возможных проблем с нехваткой мощности.

Обычно данная характеристика обозначается величиной VA или Вт. Если величина указана в VA (ВА), то умножьте ее на 0,6, чтобы получить значение в более понятных нам Ваттах.

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

Эти три характеристики являются наиболее важными. Помимо них у ИБП есть еще множество характеристик. Например, при выборе бесперебойника в магазине обращайте внимание на то, какие разъемы питания установлены в источнике, есть ли дисплей и дополнительные интерфейсы (RJ-11, USB), сколько батарей устанавливается и прочие.

Часто возникающие проблемы

  1. Самая главная проблема, которая возникает у ИБП чаще всего – это выход из строя аккумуляторной батареи. Севший аккумулятор можно определить по тому, что бесперебойник перестает держать нагрузку – при отключении электричества компьютер сразу же выключается. Также испорченная батарея может проявлять себя по другому: бесперебойник совсем не включается, или включается и непрерывно пищит. О том, как поменять аккумулятор в бесперебойнике я писал в этой статье. Там написано про конкретный ИБП, но принцип замены во всех источниках практически не отличается.
  2. ИБП может совсем не включаться из-за перегоревшего предохранителя.
  3. Если источник бесперебойного питания нормально запускается, но компьютер не включается, то проверьте провода, они могут выйти из гнезд.

Надеюсь моя статья была для вас полезна и вы почерпнули для себя что-то новое. Если же у вас остались вопросы, то можете задавать их в комментариях.

ИБП Eaton 93PS — Компания Энергопуть

АртикулНаименованиеЦена
93PS8MBS93PS-8(10)-0-MBS По запросу 
93PS8MBSI93PS-8(10)-1x9Ah-MBS По запросу 
93PS10MBS93PS-10(10)-0-MBS По запросу 
93PS10MBSI93PS-10(10)-1x9Ah-MBS По запросу 
BA80A0206A0110000093PS-8(20)-15-0-6 По запросу 
BA80A0306A0110000093PS-8(20)-15-0-MBS-6 По запросу 
BA80AA206A0110000093PS-8(20)-15-1x9Ah-6 По запросу 
BA80A5206A0110000093PS-8(20)-15-1x9Ah-LL-6 По запросу 
BA80A5306A0110000093PS-8(20)-15-1x9Ah-LL-MBS-6 По запросу 
BA80AA306A0110000093PS-8(20)-15-1x9Ah-MBS-6 По запросу 
BA80AB206A0110000093PS-8(20)-15-2x9Ah-6 По запросу 
BA80A6206A0110000093PS-8(20)-15-2x9Ah-LL-6 По запросу 
BA80A6306A0110000093PS-8(20)-15-2x9Ah-LL-MBS-6 По запросу 
BA80AB306A0110000093PS-8(20)-15-2x9Ah-MBS-6 По запросу 
BA80A9206A0110000093PS-8(20)-15-CM-6 По запросу 
BA80A9306A0110000093PS-8(20)-15-CM-MBS-6 По запросу 
BA80A0206A0100000093PS-8(20)-20-0-6 По запросу 
BA80A0306A0100000093PS-8(20)-20-0-MBS-6 По запросу 
BA80AA206A0100000093PS-8(20)-20-1x9Ah-6 По запросу 
BA80A5206A0100000093PS-8(20)-20-1x9Ah-LL-6 По запросу 
BA80A5306A0100000093PS-8(20)-20-1x9Ah-LL-MBS-6 По запросу 
BA80AA306A0100000093PS-8(20)-20-1x9Ah-MBS-6 По запросу 
BA80AB206A0100000093PS-8(20)-20-2x9Ah-6 По запросу 
BA80A6206A0100000093PS-8(20)-20-2x9Ah-LL-6 По запросу 
BA80A6306A0100000093PS-8(20)-20-2x9Ah-LL-MBS-6 По запросу 
BA80AB306A0100000093PS-8(20)-20-2x9Ah-MBS-6 По запросу 
BA80A9206A0100000093PS-8(20)-20-CM-6 По запросу 
BA80A9306A0100000093PS-8(20)-20-CM-MBS-6 По запросу 
BA01A0206A0110000093PS-10(20)-15-0-6 По запросу 
BA01A0306A0110000093PS-10(20)-15-0-MBS-6 По запросу 
BA01AA206A0110000093PS-10(20)-15-1x9Ah-6 По запросу 
BA01A5206A0110000093PS-10(20)-15-1x9Ah-LL-6 По запросу 
BA01A5306A0110000093PS-10(20)-15-1x9Ah-LL-MBS-6 По запросу 
BA01AA306A0110000093PS-10(20)-15-1x9Ah-MBS-6 По запросу 
BA01AB206A0110000093PS-10(20)-15-2x9Ah-6 По запросу 
BA01A6206A0110000093PS-10(20)-15-2x9Ah-LL-6 По запросу 
BA01A6306A0110000093PS-10(20)-15-2x9Ah-LL-MBS-6 По запросу 
BA01AB306A0110000093PS-10(20)-15-2x9Ah-MBS-6 По запросу 
BA01A9206A0110000093PS-10(20)-15-CM-6 По запросу 
BA01A9306A0110000093PS-10(20)-15-CM-MBS-6 По запросу 
BA01A0206A0100000093PS-10(20)-20-0-6 По запросу 
BA01A0306A0100000093PS-10(20)-20-0-MBS-6 По запросу 
BA01AA206A0100000093PS-10(20)-20-1x9Ah-6 По запросу 
BA01A5206A0100000093PS-10(20)-20-1x9Ah-LL-6 По запросу 
BA01A5306A0100000093PS-10(20)-20-1x9Ah-LL-MBS-6 По запросу 
BA01AA306A0100000093PS-10(20)-20-1x9Ah-MBS-6 По запросу 
BA01AB206A0100000093PS-10(20)-20-2x9Ah-6 По запросу 
BA01A6206A0100000093PS-10(20)-20-2x9Ah-LL-6 По запросу 
BA01A6306A0100000093PS-10(20)-20-2x9Ah-LL-MBS-6 По запросу 
BA01AB306A0100000093PS-10(20)-20-2x9Ah-MBS-6 По запросу 
BA01A9206A0100000093PS-10(20)-20-CM-6 По запросу 
BA01A9306A0100000093PS-10(20)-20-CM-MBS-6 По запросу 
BA51A0206A0110000093PS-15(20)-15-0-6 По запросу 
BA51A0306A0110000093PS-15(20)-15-0-MBS-6 По запросу 
BA51AA206A0110000093PS-15(20)-15-1x9Ah-6 По запросу 
BA51A5206A0110000093PS-15(20)-15-1x9Ah-LL-6 По запросу 
BA51A5306A0110000093PS-15(20)-15-1x9Ah-LL-MBS-6 По запросу 
BA51AA306A0110000093PS-15(20)-15-1x9Ah-MBS-6 По запросу 
BA51AB206A0110000093PS-15(20)-15-2x9Ah-6 По запросу 
BA51A6206A0110000093PS-15(20)-15-2x9Ah-LL-6 По запросу 
BA51A6306A0110000093PS-15(20)-15-2x9Ah-LL-MBS-6 По запросу 
BA51AB306A0110000093PS-15(20)-15-2x9Ah-MBS-6 По запросу 
BA51A9206A0110000093PS-15(20)-15-CM-6 По запросу 
BA51A9306A0110000093PS-15(20)-15-CM-MBS-6 По запросу 
BA51A0206A0100000093PS-15(20)-20-0-6 По запросу 
BA51A0306A0100000093PS-15(20)-20-0-MBS-6 По запросу 
BA51AA206A0100000093PS-15(20)-20-1x9Ah-6 По запросу 
BA51A5206A0100000093PS-15(20)-20-1x9Ah-LL-6 По запросу 
BA51A5306A0100000093PS-15(20)-20-1x9Ah-LL-MBS-6 По запросу 
BA51AA306A0100000093PS-15(20)-20-1x9Ah-MBS-6 По запросу 
BA51AB206A0100000093PS-15(20)-20-2x9Ah-6 По запросу 
BA51A6206A0100000093PS-15(20)-20-2x9Ah-LL-6 По запросу 
BA51A6306A0100000093PS-15(20)-20-2x9Ah-LL-MBS-6 По запросу 
BA51AB306A0100000093PS-15(20)-20-2x9Ah-MBS-6 По запросу 
BA51A9206A0100000093PS-15(20)-20-CM-6 По запросу 
BA51A9306A0100000093PS-15(20)-20-CM-MBS-6 По запросу 
BA02A0206A0100000093PS-20(20)-20-0-6 По запросу 
BA02A0306A0100000093PS-20(20)-20-0-MBS-6 По запросу 
BA02AB206A0100000093PS-20(20)-20-2x9Ah-6 По запросу 
BA02A6206A0100000093PS-20(20)-20-2x9Ah-LL-6 По запросу 
BA02A6306A0100000093PS-20(20)-20-2x9Ah-LL-MBS-6 По запросу 
BA02AB306A0100000093PS-20(20)-20-2x9Ah-MBS-6 По запросу 
BA02A9206A0100000093PS-20(20)-20-CM-6 По запросу 
BA02A9306A0100000093PS-20(20)-20-CM-MBS-6 По запросу 
BC80A0206A0110000093PS-8(40)-15-0-6 По запросу 
BC80A0306A0110000093PS-8(40)-15-0-MBS-6 По запросу 
BC80AC206A0110000093PS-8(40)-15-3x9Ah-6 По запросу 
BC80A7206A0110000093PS-8(40)-15-3x9Ah-LL-6 По запросу 
BC80A7306A0110000093PS-8(40)-15-3x9Ah-LL-MBS-6 По запросу 
BC80AC306A0110000093PS-8(40)-15-3x9Ah-MBS-6 По запросу 
BC80AD206A0110000093PS-8(40)-15-4x9Ah-6 По запросу 
BC80A8206A0110000093PS-8(40)-15-4x9Ah-LL-6 По запросу 
BC80A8306A0110000093PS-8(40)-15-4x9Ah-LL-MBS-6 По запросу 
BC80AD306A0110000093PS-8(40)-15-4x9Ah-MBS-6 По запросу 
BC80A0206A0100000093PS-8(40)-20-0-6 По запросу 
BC80A0306A0100000093PS-8(40)-20-0-MBS-6 По запросу 
BC80AC206A0100000093PS-8(40)-20-3x9Ah-6 По запросу 
BC80A7206A0100000093PS-8(40)-20-3x9Ah-LL-6 По запросу 
BC80A7306A0100000093PS-8(40)-20-3x9Ah-LL-MBS-6 По запросу 
BC80AC306A0100000093PS-8(40)-20-3x9Ah-MBS-6 По запросу 
BC80AD206A0100000093PS-8(40)-20-4x9Ah-6 По запросу 
BC80A8206A0100000093PS-8(40)-20-4x9Ah-LL-6 По запросу 
BC80A8306A0100000093PS-8(40)-20-4x9Ah-LL-MBS-6 По запросу 
BC80AD306A0100000093PS-8(40)-20-4x9Ah-MBS-6 По запросу 
BF80A0206A0110000093PS-8+8(40)-30-0-SB-6 По запросу 
BF80A0306A0110000093PS-8+8(40)-30-0-SB-MBS-6 По запросу 
BF80A6206A0110000093PS-8+8(40)-30-2x9Ah-LL-SB-6 По запросу 
BF80A6306A0110000093PS-8+8(40)-30-2x9Ah-LL-SB-MBS-6 По запросу 
BF80AB206A0110000093PS-8+8(40)-30-2x9Ah-SB-6 По запросу 
BF80AB306A0110000093PS-8+8(40)-30-2x9Ah-SB-MBS-6 По запросу 
BF80A8206A0110000093PS-8+8(40)-30-4x9Ah-LL-SB-6 По запросу 
BF80A8306A0110000093PS-8+8(40)-30-4x9Ah-LL-SB-MBS-6 По запросу 
BF80AD206A0110000093PS-8+8(40)-30-4x9Ah-SB-6 По запросу 
BF80AD306A0110000093PS-8+8(40)-30-4x9Ah-SB-MBS-6 По запросу 
BF80A0206A0100000093PS-8+8(40)-40-0-SB-6 По запросу 
BF80A0306A0100000093PS-8+8(40)-40-0-SB-MBS-6 По запросу 
BF80A6206A0100000093PS-8+8(40)-40-2x9Ah-LL-SB-6 По запросу 
BF80A6306A0100000093PS-8+8(40)-40-2x9Ah-LL-SB-MBS-6 По запросу 
BF80AB206A0100000093PS-8+8(40)-40-2x9Ah-SB-6 По запросу 
BF80AB306A0100000093PS-8+8(40)-40-2x9Ah-SB-MBS-6 По запросу 
BF80A8206A0100000093PS-8+8(40)-40-4x9Ah-LL-SB-6 По запросу 
BF80A8306A0100000093PS-8+8(40)-40-4x9Ah-LL-SB-MBS-6 По запросу 
BF80AD206A0100000093PS-8+8(40)-40-4x9Ah-SB-6 По запросу 
BF80AD306A0100000093PS-8+8(40)-40-4x9Ah-SB-MBS-6 По запросу 
BC01A0206A0110000093PS-10(40)-15-0-6 По запросу 
BC01A0306A0110000093PS-10(40)-15-0-MBS-6 По запросу 
BC01AC206A0110000093PS-10(40)-15-3x9Ah-6 По запросу 
BC01A7206A0110000093PS-10(40)-15-3x9Ah-LL-6 По запросу 
BC01A7306A0110000093PS-10(40)-15-3x9Ah-LL-MBS-6 По запросу 
BC01AC306A0110000093PS-10(40)-15-3x9Ah-MBS-6 По запросу 
BC01AD206A0110000093PS-10(40)-15-4x9Ah-6 По запросу 
BC01A8206A0110000093PS-10(40)-15-4x9Ah-LL-6 По запросу 
BC01A8306A0110000093PS-10(40)-15-4x9Ah-LL-MBS-6 По запросу 
BC01AD306A0110000093PS-10(40)-15-4x9Ah-MBS-6 По запросу 
BC01A0206A0100000093PS-10(40)-20-0-6 По запросу 
BC01A0306A0100000093PS-10(40)-20-0-MBS-6 По запросу 
BC01AC206A0100000093PS-10(40)-20-3x9Ah-6 По запросу 
BC01A7206A0100000093PS-10(40)-20-3x9Ah-LL-6 По запросу 
BC01A7306A0100000093PS-10(40)-20-3x9Ah-LL-MBS-6 По запросу 
BC01AC306A0100000093PS-10(40)-20-3x9Ah-MBS-6 По запросу 
BC01AD206A0100000093PS-10(40)-20-4x9Ah-6 По запросу 
BC01A8206A0100000093PS-10(40)-20-4x9Ah-LL-6 По запросу 
BC01A8306A0100000093PS-10(40)-20-4x9Ah-LL-MBS-6 По запросу 
BC01AD306A0100000093PS-10(40)-20-4x9Ah-MBS-6 По запросу 
BF01A0206A0110000093PS-10+10(40)-30-0-SB-6 По запросу 
BF01A0306A0110000093PS-10+10(40)-30-0-SB-MBS-6 По запросу 
BF01A6206A0110000093PS-10+10(40)-30-2x9Ah-LL-SB-6 По запросу 
BF01A6306A0110000093PS-10+10(40)-30-2x9Ah-LL-SB-MBS-6 По запросу 
BF01AB206A0110000093PS-10+10(40)-30-2x9Ah-SB-6 По запросу 
BF01AB306A0110000093PS-10+10(40)-30-2x9Ah-SB-MBS-6 По запросу 
BF01A8206A0110000093PS-10+10(40)-30-4x9Ah-LL-SB-6 По запросу 
BF01A8306A0110000093PS-10+10(40)-30-4x9Ah-LL-SB-MBS-6 По запросу 
BF01AD206A0110000093PS-10+10(40)-30-4x9Ah-SB-6 По запросу 
BF01AD306A0110000093PS-10+10(40)-30-4x9Ah-SB-MBS-6 По запросу 
BF01A0206A0100000093PS-10+10(40)-40-0-SB-6 По запросу 
BF01A0306A0100000093PS-10+10(40)-40-0-SB-MBS-6 По запросу 
BF01A6206A0100000093PS-10+10(40)-40-2x9Ah-LL-SB-6 По запросу 
BF01A6306A0100000093PS-10+10(40)-40-2x9Ah-LL-SB-MBS-6 По запросу 
BF01AB206A0100000093PS-10+10(40)-40-2x9Ah-SB-6 По запросу 
BF01AB306A0100000093PS-10+10(40)-40-2x9Ah-SB-MBS-6 По запросу 
BF01A8206A0100000093PS-10+10(40)-40-4x9Ah-LL-SB-6 По запросу 
BF01A8306A0100000093PS-10+10(40)-40-4x9Ah-LL-SB-MBS-6 По запросу 
BF01AD206A0100000093PS-10+10(40)-40-4x9Ah-SB-6 По запросу 
BF01AD306A0100000093PS-10+10(40)-40-4x9Ah-SB-MBS-6 По запросу 
BC51A0206A0110000093PS-15(40)-15-0-6 По запросу 
BC51A0306A0110000093PS-15(40)-15-0-MBS-6 По запросу 
BC51AC206A0110000093PS-15(40)-15-3x9Ah-6 По запросу 
BC51A7206A0110000093PS-15(40)-15-3x9Ah-LL-6 По запросу 
BC51A7306A0110000093PS-15(40)-15-3x9Ah-LL-MBS-6 По запросу 
BC51AC306A0110000093PS-15(40)-15-3x9Ah-MBS-6 По запросу 
BC51AD206A0110000093PS-15(40)-15-4x9Ah-6 По запросу 
BC51A8206A0110000093PS-15(40)-15-4x9Ah-LL-6 По запросу 
BC51A8306A0110000093PS-15(40)-15-4x9Ah-LL-MBS-6 По запросу 
BC51AD306A0110000093PS-15(40)-15-4x9Ah-MBS-6 По запросу 
BC51A0206A0100000093PS-15(40)-20-0-6 По запросу 
BC51A0306A0100000093PS-15(40)-20-0-MBS-6 По запросу 
BC51AC206A0100000093PS-15(40)-20-3x9Ah-6 По запросу 
BC51A7206A0100000093PS-15(40)-20-3x9Ah-LL-6 По запросу 
BC51A7306A0100000093PS-15(40)-20-3x9Ah-LL-MBS-6 По запросу 
BC51AC306A0100000093PS-15(40)-20-3x9Ah-MBS-6 По запросу 
BC51AD206A0100000093PS-15(40)-20-4x9Ah-6 По запросу 
BC51A8206A0100000093PS-15(40)-20-4x9Ah-LL-6 По запросу 
BC51A8306A0100000093PS-15(40)-20-4x9Ah-LL-MBS-6 По запросу 
BC51AD306A0100000093PS-15(40)-20-4x9Ah-MBS-6 По запросу 
BF51A0206A0110000093PS-15+15(40)-30-0-SB-6 По запросу 
BF51A0306A0110000093PS-15+15(40)-30-0-SB-MBS-6 По запросу 
BF51A8206A0110000093PS-15+15(40)-30-4x9Ah-LL-SB-6 По запросу 
BF51A8306A0110000093PS-15+15(40)-30-4x9Ah-LL-SB-MBS-6 По запросу 
BF51AD206A0110000093PS-15+15(40)-30-4x9Ah-SB-6 По запросу 
BF51AD306A0110000093PS-15+15(40)-30-4x9Ah-SB-MBS-6 По запросу 
BF51A0206A0100000093PS-15+15(40)-40-0-SB-6 По запросу 
BF51A0306A0100000093PS-15+15(40)-40-0-SB-MBS-6 По запросу 
BF51A8206A0100000093PS-15+15(40)-40-4x9Ah-LL-SB-6 По запросу 
BF51A8306A0100000093PS-15+15(40)-40-4x9Ah-LL-SB-MBS-6 По запросу 
BF51AD206A0100000093PS-15+15(40)-40-4x9Ah-SB-6 По запросу 
BF51AD306A0100000093PS-15+15(40)-40-4x9Ah-SB-MBS-6 По запросу 
BC02A0206A0100000093PS-20(40)-20-0-6 По запросу 
BC02A0306A0100000093PS-20(40)-20-0-MBS-6 По запросу 
BC02AC206A0100000093PS-20(40)-20-3x9Ah-6 По запросу 
BC02A7206A0100000093PS-20(40)-20-3x9Ah-LL-6 По запросу 
BC02A7306A0100000093PS-20(40)-20-3x9Ah-LL-MBS-6 По запросу 
BC02AC306A0100000093PS-20(40)-20-3x9Ah-MBS-6 По запросу 
BC02AD206A0100000093PS-20(40)-20-4x9Ah-6 По запросу 
BC02A8206A0100000093PS-20(40)-20-4x9Ah-LL-6 По запросу 
BC02A8306A0100000093PS-20(40)-20-4x9Ah-LL-MBS-6 По запросу 
BC02AD306A0100000093PS-20(40)-20-4x9Ah-MBS-6 По запросу 
BF02A0206A0100000093PS-20+20(40)-40-0-SB-6 По запросу 
BF02A0306A0100000093PS-20+20(40)-40-0-SB-MBS-6 По запросу 
BF02A8206A0100000093PS-20+20(40)-40-4x9Ah-LL-SB-6 По запросу 
BF02A8306A0100000093PS-20+20(40)-40-4x9Ah-LL-SB-MBS-6 По запросу 
BF02AD206A0100000093PS-20+20(40)-40-4x9Ah-SB-6 По запросу 
BF02AD306A0100000093PS-20+20(40)-40-4x9Ah-SB-MBS-6 По запросу 
BD03A0206A0110000093PS-30(40)-30-0-6 По запросу 
BD03A0306A0110000093PS-30(40)-30-0-MBS-6 По запросу 
BD03AC206A0110000093PS-30(40)-30-3x9Ah-6 По запросу 
BD03A7206A0110000093PS-30(40)-30-3x9Ah-LL-6 По запросу 
BD03A7306A0110000093PS-30(40)-30-3x9Ah-LL-MBS-6 По запросу 
BD03AC306A0110000093PS-30(40)-30-3x9Ah-MBS-6 По запросу 
BD03AD206A0110000093PS-30(40)-30-4x9Ah-6 По запросу 
BD03A8206A0110000093PS-30(40)-30-4x9Ah-LL-6 По запросу 
BD03A8306A0110000093PS-30(40)-30-4x9Ah-LL-MBS-6 По запросу 
BD03AD306A0110000093PS-30(40)-30-4x9Ah-MBS-6 По запросу 
BD03A0206A0100000093PS-30(40)-40-0-6 По запросу 
BD03A0306A0100000093PS-30(40)-40-0-MBS-6 По запросу 
BD03AC206A0100000093PS-30(40)-40-3x9Ah-6 По запросу 
BD03A7206A0100000093PS-30(40)-40-3x9Ah-LL-6 По запросу 
BD03A7306A0100000093PS-30(40)-40-3x9Ah-LL-MBS-6 По запросу 
BD03AC306A0100000093PS-30(40)-40-3x9Ah-MBS-6 По запросу 
BD03AD206A0100000093PS-30(40)-40-4x9Ah-6 По запросу 
BD03A8206A0100000093PS-30(40)-40-4x9Ah-LL-6 По запросу 
BD03A8306A0100000093PS-30(40)-40-4x9Ah-LL-MBS-6 По запросу 
BD03AD306A0100000093PS-30(40)-40-4x9Ah-MBS-6 По запросу 
BD04A0206A0100000093PS-40(40)-40-0-6 По запросу 
BD04A0306A0100000093PS-40(40)-40-0-MBS-6 По запросу 
BD04AC206A0100000093PS-40(40)-40-3x9Ah-6 По запросу 
BD04A7206A0100000093PS-40(40)-40-3x9Ah-LL-6 По запросу 
BD04A7306A0100000093PS-40(40)-40-3x9Ah-LL-MBS-6 По запросу 
BD04AC306A0100000093PS-40(40)-40-3x9Ah-MBS-6 По запросу 
BD04AD206A0100000093PS-40(40)-40-4x9Ah-6 По запросу 
BD04A8206A0100000093PS-40(40)-40-4x9Ah-LL-6 По запросу 
BD04A8306A0100000093PS-40(40)-40-4x9Ah-LL-MBS-6 По запросу 
BD04AD306A0100000093PS-40(40)-40-4x9Ah-MBS-6 По запросу 

Linux Kernel Panic Oops Debug · GitHub

»»»»»»»»»»»»»..»
## Код ошибки
«
Упс: 0002 [# 1] PREEMPT SMP
«
Это значение кода ошибки в шестнадцатеричном формате. Каждый бит имеет собственное значение:
— бит 0 == 0 означает, что страница не найдена, 1 означает сбой защиты
— бит 1 == 0 означает чтение, 1 означает запись
— бит 2 == 0 означает ядро, 1 означает пользовательский режим
— [# 1] — это значение — количество раз, когда произошли ошибки.Множественные ошибки могут быть вызваны каскадным эффектом первого.
> http://www.linuxforu.com/2011/01/understanding-a-kernel-oops
«
CPU: 1 PID: 162 Comm: surfaceflinger Tainted: G W O 3.10.20-262458-ge1b992c # 1
«
Указывает, на каком процессоре произошла ошибка.
Флаг «Зараженный» указывает на P здесь. Каждый флаг имеет свое значение. Несколько других флагов и их значения взяты из kernel / panic.c:
— P — Загружен фирменный модуль.
— F — Модуль был загружен принудительно.
— S — SMP с процессором, не предназначенным для SMP.
— R — Пользователь принудительно выгрузил модуль.
— M — В системе возникла исключительная ситуация при проверке машины.
— B — Система попала в bad_page.
— U — озорство, определяемое пользовательским пространством.
— A — Таблица ACPI переопределена.
— W — Заражение при предупреждении.
> http://www.linuxforu.com/2011/01/understanding-a-kernel-oops
«
5 # options: установить env. переменная AFLAGS = параметры для передачи параметров в «как»;
6 # например, чтобы декодировать ошибку i386 в системе x86_64, используйте:
7 # AFLAGS = — 32 декодировать код <386.ой
«
## Код декодирования
«
# скрипты / decodecode
$ cd kernel_src_folder
$ скриптов / код декодирования <ой.txt
или
$ echo «Код: 16 01 00 00 39 45 08 72 60 8b 3d 40 09 fb c1 89 5d d4 eb \
27 90 8d 74 26 00 8b 4e 18 81 f9 fc c3 de c1 0f 84 e9 00 00 00 8d 71 \
e8 <8b> 49 e8 39 c1 0f 83 дБ 00 00 00 3b 45 08 77 20 8d 04 17 89 cb «\
| скрипты / декодирование
«
Выход, как показано ниже:
«
Весь код
========
0: 16 (плохо)
1: 01 00 добавить% eax, (% rax)
3:00 39 добавить% bh, (% rcx)
5:45 08 72 60 или% r14b, 0x60 (% r10)
9: 8b 3d 40 09 fb c1 mov -0x3e04f6c0 (% rip),% edi # 0xffffffffc1fb094f
f: 89 5d d4 mov% ebx, -0x2c (% rbp)
12: EB 27 JMP 0x3b
14: 90 ноп
15: 8d 74 26 00 lea 0x0 (% rsi,% riz, 1),% esi
19: 8b 4e 18 mov 0x18 (% rsi),% ecx
1c: 81 f9 fc c3 de c1 cmp $ 0xc1dec3fc,% ecx
22: 0f 84 e9 00 00 00 je 0x111
28: 8d 71 e8 lea -0x18 (% rcx),% esi
2b: * 8b 49 e8 mov -0x18 (% rcx),% ecx <- инструкция треппинга
2e: 39 c1 cmp% eax,% ecx
30: 0f 83 дБ 00 00 00 jae 0x111
36: 3b 45 08 cmp 0x8 (% rbp),% eax
39: 77 20 и 0x5b
3b: 8d 04 17 lea (% rdi,% rdx, 1),% eax
3e: 89 cb mov% ecx,% ebx
Код, начинающийся с ошибочной инструкции
===========================================
0: 8b 49 e8 mov -0x18 (% rcx),% ecx
3: 39 c1 cmp% eax,% ecx
5: 0f 83 дБ 00 00 00 jae 0xe6
b: 3b 45 08 cmp 0x8 (% rbp),% eax
e: 77 20 ja 0x30
10: 8d 04 17 lea (% rdi,% rdx, 1),% eax
13:89 cb mov% ecx,% ebx
«
## Где получить код
«Код:…» взят из журнала ядра. Ой.
«
[166357.529863] ОШИБКА: невозможно обработать запрос ядра на подкачку на ffffffe8
[166357.529901] IP: [] alloc_vmap_area.isra.20 + 0x12a / 0x2c0
[166357.529924] * pdpt = 0000000001f1c001 * pde = 0000000001f20067 * pte = 0000000000000000
[166357.529950] Ой: 0000 [# 1] PREEMPT SMP
[166357.529973] Модули, подключенные к: atomisp_css2300 lm3554 mt9m114 ov8830 compat (O) rmi4 st_drv videobuf_vmalloc videobuf_core matrix (O) hdmi_audio pvrsgx wl12xx (O) mac80211 (Osdio) psgx (O) mac80211 (O) cfg6dio (O)
[166357.530079] CPU: 1 PID: 6779 Comm: iptables Tainted: G W O 3.10.20-262458-ge1b992c # 1
[166357.530090] Название оборудования: Intel Corporation CloverTrail / FFRD, BIOS 406 2013.10.16: 10.18.10
[166357.530102] задача: cd195110 ti: cd5b8000 task.ti: cd5b8000
[166357.530117] EIP: 0060: [] EFLAGS: 00010213 CPU: 1
[166357.530134] EIP находится в alloc_vmap_area.isra.20 + 0x12a / 0x2c0
[166357.530145] EAX: e8db4000 EBX: 00000000 ECX: 00000000 EDX: e8db2000
[166357.530154] ESI: ffffffe8 EDI: 00001000 EBP: cd5b9dcc ESP: cd5b9d98
[166357.530165] DS: 007b ES: 007b FS: 00d8 GS: 0033 SS: 0068
[166357.530175] CR0: 80050033 CR2: ffffffe8 CR3: 0d5b6000 CR4: 000007f0
[166357.530185] DR0: 00000000 DR1: 00000000 DR2: 00000000 DR3: 00000000
[166357.530195] DR6: ffff0ff0 DR7: 00000400
[166357.530204] Стек:
[166357.530212] cd5b9dcc c132b08a 00002000 c75ca600 00000000 00000000 dec00000 ffffffff
[166357.530261] dec00000 00000001 c75ca180 00000022 00000001 cd5b9dec c131f177 ffbfe000
[166357.530304] 000080d2 00001000 ffbfe000 80000000 ffffffff cd5b9e20 c131fe47 dec00000
[166357.530354] Отслеживание звонков:
[166357.530371] []? kmem_cache_alloc_trace + 0xaa / 0x170
[166357.530388] [] __get_vm_area_node.isra.21 + 0x87 / 0x160
[166357.530402] [] __vmalloc_node_range + 0x57 / 0x200
[166357.530417] []? do_ipt_get_ctl + 0x1a6 / 0x320
[166357.530431] [] __vmalloc_node + 0x62 / 0x70
[166357.530445] []? do_ipt_get_ctl + 0x1a6 / 0x320
[166357.530459] [] vzalloc + 0x38 / 0x40
[166357.530473] []? do_ipt_get_ctl + 0x1a6 / 0x320
[166357.530488] [] do_ipt_get_ctl + 0x1a6 / 0x320
[166357.530503] []? avc_has_perm_flags + 0xc7 / 0x170
[166357.530521] [] nf_getsockopt + 0x40 / 0x60
[166357.530536] [] ip_getsockopt + 0x84 / 0xc0
[166357.530551] [] raw_getsockopt + 0x32 / 0xb0
[166357.530567] [] sock_common_getsockopt + 0x27 / 0x40
[166357.530582] [] SyS_getsockopt + 0x6e / 0xe0
[166357.530598] [] SyS_socketcall + 0x2b9 / 0x300
[166357.530615] []? trace_hardirqs_on_thunk + 0xc / 0x10
[166357.530631] [] syscall_call + 0x7 / 0xb
[166357.530642] Код: 16 01 00 00 39 45 08 72 60 8b 3d 40 09 fb c1 89 5d d4 eb 27 90 8d 74 26 00 8b 4e 18 81 f9 fc c3 de c1 0f 84 e9 00 00 00 8d 71 e8 < 8b> 49 e8 39 c1 0f 83 дБ 00 00 00 3b 45 08 77 20 8d 04 17 89 cb
[166357.530945] EIP: [] alloc_vmap_area.isra.20 + 0x12a / 0x2c0 SS: ESP 0068: cd5b9d98
[166357.530971] CR2: 00000000ffffffe8
«
## К сожалению, отслеживание
`Испорченные ядра` из ядра / Документация / oops-tracing.txt
«
222 Испорченные ядра:
223
224 Некоторые отчеты oops содержат строку «Tainted:» после программы
225 счетчик. Это указывает на то, что ядро ​​было испорчено каким-то
226 механизм.За строкой следует серия позиционно-чувствительных
227 символов, каждый из которых представляет определенное испорченное значение.
228
229 1: «G», если все загруженные модули имеют лицензию GPL или совместимую, «P», если
230 загружен какой-либо собственный модуль. Модули без
231 MODULE_LICENSE или с MODULE_LICENSE, который не распознается
232 insmod, как GPL-совместимый, считаются проприетарными.
233
234 2: ‘F’, если какой-либо модуль был принудительно загружен с помощью insmod -f, », если все
235 модулей загрузились нормально.
236
237 3: ‘S’, если ошибка произошла на ядре SMP, работающем на оборудовании, которое
238 не был сертифицирован как безопасный для работы с несколькими процессорами.
239 В настоящее время это происходит только на различных Атлонах, отличных от
240 SMP.
241
242 4: ‘R’, если модуль был принудительно выгружен командой «rmmod -f», », если все
243 модуля выгружались нормально.
244
245 5: ‘M’, если какой-либо процессор сообщил об исключении проверки компьютера,
246 », если не возникло никаких исключений проверки машины.
247
248 6: ‘B’, если функция освобождения страницы обнаружила неверную ссылку на страницу или
249 некоторые неожиданные флаги страницы.
250
251 7: «U», если пользователь или пользовательское приложение специально запросили, чтобы
252 Флаг испорченного должен быть установлен, в противном случае.
253
254 8: ‘D’, если ядро ​​недавно умерло, т.е. произошла ошибка OOPS или BUG.
255
256 9: «A», если таблица ACPI была переопределена.
257
258 10: ‘W’, если ядро ​​ранее выдало предупреждение.
259 (Хотя некоторые предупреждения могут устанавливать более конкретные флаги заражения.)
260
261 11: «C», если загружен промежуточный драйвер.
262
263 12: ‘I’, если ядро ​​работает с серьезной ошибкой в ​​платформе
264 прошивка (BIOS или аналогичная).
265
266 13: ‘O’, если был загружен модуль, созданный извне («вне дерева»).
267
268 Основная причина появления строки «Tainted:» — сообщить ядру
269 отладчиков, если это чистое ядро ​​или если что-то необычное, имеет
270 произошло.Заражение необратимо: даже если вызывающий модуль модуль
271 выгружено, испорченное значение остается, чтобы указать, что ядро ​​не
272 заслуживает доверия.
«
## Шаги
1.Скачать vmlinux.bz2
2. bunzip vmlinux.bz2
3. objdump -C -S vmlinux> vmlinux.s
4. grep -n ffffffff8206b829 vmlinux.s (адрес RIP)
5. sed -n ‘мммм, nnnnnp’ vmlinux.s | vim —

URL-декодирование «упс» — URL-декодирование и кодирование

Примерно Встречайте URL Decode and Encode, простой онлайн-инструмент, который делает именно то, что говорит: декодирует из URL-кодирования, а также быстро и легко кодирует его.URL-кодируйте ваши данные без проблем или декодируйте их в удобочитаемый формат. Кодирование URL-адреса

, также известное как «процентное кодирование», представляет собой механизм кодирования информации в унифицированном идентификаторе ресурса (URI). Хотя это называется кодированием URL-адресов, на самом деле оно используется более широко в основном наборе универсальных идентификаторов ресурсов (URI), который включает как универсальный указатель ресурсов (URL), так и универсальное имя ресурса (URN). Как таковой, он также используется при подготовке данных типа носителя «application / x-www-form-urlencoded», как это часто бывает при отправке данных HTML-формы в HTTP-запросах.

Дополнительные параметры

  • Набор символов: В случае текстовых данных схема кодирования не содержит набор символов, поэтому вы должны указать, какой набор символов использовался в процессе кодирования. Обычно это UTF-8, но может быть и множество других; если вы не уверены, поиграйте с доступными опциями или попробуйте опцию автоопределения. Эта информация используется для преобразования декодированных данных в набор символов нашего веб-сайта, чтобы все буквы и символы могли отображаться правильно.Обратите внимание, что это не имеет отношения к файлам, поскольку к ним не нужно применять безопасные веб-преобразования.
  • Декодировать каждую строку отдельно: Закодированные данные обычно состоят из непрерывного текста, поэтому даже символы новой строки преобразуются в их формы с процентной кодировкой. Перед декодированием все незакодированные пробелы удаляются из ввода для защиты целостности ввода. Эта опция полезна, если вы собираетесь декодировать несколько независимых записей данных, разделенных переносом строки.
  • Живой режим: Когда вы включаете эту опцию, введенные данные немедленно декодируются с помощью встроенных функций JavaScript вашего браузера, без отправки какой-либо информации на наши серверы. В настоящее время этот режим поддерживает только набор символов UTF-8.
Надежно и надежно

Все коммуникации с нашими серверами осуществляются через безопасные зашифрованные соединения SSL (https). Мы удаляем загруженные файлы с наших серверов сразу после обработки, а полученный загружаемый файл удаляется сразу после первой попытки загрузки или 15 минут бездействия (в зависимости от того, что короче).Мы никоим образом не храним и не проверяем содержимое отправленных данных или загруженных файлов. Ознакомьтесь с нашей политикой конфиденциальности ниже для получения более подробной информации.

Совершенно бесплатно

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

Подробная информация о кодировке URL-адресов

Типы символов URI

Допустимые символы в URI либо зарезервированы, либо не зарезервированы (или символ процента как часть процентного кодирования).Зарезервированные символы — это символы, которые иногда имеют особое значение. Например, символы прямой косой черты используются для разделения разных частей URL-адреса (или, в более общем смысле, URI). Незарезервированные символы не имеют такого особого значения. При использовании процентного кодирования зарезервированные символы представляются с помощью специальных последовательностей символов. Наборы зарезервированных и незарезервированных символов, а также обстоятельства, при которых определенные зарезервированные символы имеют особое значение, немного меняются с каждой новой редакцией спецификаций, управляющих URI и схемами URI.



Другие символы в URI должны быть закодированы в процентах.

Зарезервированные символы с процентным кодированием

Когда символ из зарезервированного набора («зарезервированный символ») имеет особое значение («зарезервированное назначение») в конкретном контексте, а схема URI говорит, что необходимо использовать это символ для какой-либо другой цели, тогда этот символ должен быть закодирован в процентах. Процентное кодирование зарезервированного символа означает преобразование символа в соответствующее ему байтовое значение в ASCII и последующее представление этого значения в виде пары шестнадцатеричных цифр.Цифры, которым предшествует знак процента («%»), затем используются в URI вместо зарезервированного символа. (Для символа, отличного от ASCII, он обычно преобразуется в свою последовательность байтов в UTF-8, а затем каждое значение байта представляется, как указано выше.)

Зарезервированный символ «/», например, если он используется в пути « «компонент URI, имеет особое значение как разделитель между сегментами пути. Если в соответствии с заданной схемой URI «/» должен находиться в сегменте пути, тогда в этом сегменте должны использоваться три символа «% 2F» (или «% 2f») вместо «/».


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

В компоненте «запрос» URI (часть после символа «?»), Например, «/» по-прежнему считается зарезервированным символом, но обычно не имеет зарезервированного назначения (если в конкретной схеме URI не указано иное). Символ не нужно кодировать в процентах, если он не имеет зарезервированной цели.

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

Процентное кодирование незарезервированных символов

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

URI, которые различаются только тем, является ли незарезервированный символ закодированным в процентах или нет, эквивалентны по определению, но процессоры URI на практике не всегда могут обрабатывать их одинаково. Например, потребители URI не должны обрабатывать «% 41» иначе, чем «A» («% 41» — это процентное кодирование «A») или «% 7E» иначе, чем «~», но некоторые это делают.Поэтому для максимальной совместимости производителям URI не рекомендуется использовать процентное кодирование незарезервированных символов.

Процентное кодирование символа процента

Поскольку символ процента («%») служит индикатором для октетов, закодированных в процентах, он должен быть закодирован в процентах как «% 25», чтобы этот октет использовался в качестве данных в URI.

Процентное кодирование произвольных данных

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

Двоичные данные

С момента публикации RFC 1738 в 1994 году было указано, что схемы, которые обеспечивают представление двоичных данных в URI, должны разделять данные на 8-битные байты и кодировать каждый байт в процентах в таким же образом, как указано выше. Например, байтовое значение 0F (шестнадцатеричное) должно быть представлено как «% 0F», а байтовое значение 41 (шестнадцатеричное) может быть представлено как «A» или «% 41».Использование незакодированных символов для буквенно-цифровых и других незарезервированных символов обычно предпочтительнее, поскольку это приводит к более коротким URL-адресам.

Символьные данные

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

Например, многие схемы и протоколы URI, основанные на RFC 1738 и 2396, предполагают, что символы данных будут преобразованы в байты в соответствии с некоторой неопределенной кодировкой символов, прежде чем будут представлены в URI незарезервированными символами или байтами, закодированными в процентах.Если схема не позволяет URI предоставлять подсказку о том, какая кодировка использовалась, или если кодировка конфликтует с использованием ASCII для процентного кодирования зарезервированных и незарезервированных символов, то URI не может быть надежно интерпретирован. Некоторые схемы вообще не учитывают кодирование и вместо этого просто предлагают, чтобы символы данных отображались непосредственно на символы URI, что оставляет на усмотрение отдельных пользователей решать, следует ли и как процентно кодировать символы данных, которые не входят ни в зарезервированные, ни в незарезервированные наборы.


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

утилита для декодирования ядра Linux Упс ………

НАИМЕНОВАНИЕ
ОБЗОР
ОПИСАНИЕ
ОПЦИИ
ВВОД
АДРЕС ДЛЯ ПРЕОБРАЗОВАНИЯ СИМВОЛА
ПОДДЕРЖКА KSYMOOPS В МОДУТИЛЯХ
ВЫХОД
ПЕРЕМЕННЫЕ ОКРУЖАЮЩЕЙ СРЕДЫ
СИСТЕМЫ КРОССОВКИ
НАЗНАЧЕНИЕ 910 DIAGNOS
СИСТЕМА КРОССА 910 910 DIAGNOS29

ksymoops — утилита для декодирования ядра Linux Oops

ОБЗОР

ksymoops
[ -v vmlinux ] [ —vmlinux = vmlinux ] [ -V ] [ —no-vmlinux ]
[ -k ksyms ] [ —ksyms = ksyms ] [ -K ] [ —no-ksyms ]
[ -l lsmod ] [ —lsmod = lsmod ] [ -L ] [ —no-lsmod ]
[ -o объект ] [ —object = object ] [ -O ] [ —объект ]
[ система.карта ] [ —system-map = system.map ] [ -M ] [ —no-system-map ]
[ -s save.map ] [ —save-map = save.map ]
[ -S ] [ —short-lines ]
[ -e ] [ —endian-swap ]
[ -x ] [ —hex ]
[-1 ] [ —однокадровый ]
[ -i ] [ —ignore-insmod-path ]
[ -I ] [ —ignore-insmod-all ]
[ -T truncate ] [ —truncate = усечь ]
[ -d ] [ —debug ]
[ -h ] [ —help ]
[ -t target ] [ —target = цель ]
[ -a архитектура ] [ —architecture = архитектура ]
[ -A «список адресов» ] [ —addresses = «адрес список «]
[ Ой.файл … ]

ОПИСАНИЕ

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

Ksymoops исполняемый файл предназначен для запуска всякий раз, когда у вас есть Oops to отчет.Исходный текст Oops может быть откуда угодно. Обычно он находится в файле, созданном вашим syslogd (8). Если syslogd недоступен, журнал может быть доступен через dmesg (8). Если вы используете последовательную консоль (см. linux / Documentation / serial-console.txt), вы можете записать текст «Ой» на другом компьютере. Если ничего не помогает, скопируйте Упс вручную с экрана перезагружаемся и вводим по рука.

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

ОПЦИИ

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

Первые 10 варианты ( -v , -V , -k , -K , -l , -L , -o , -O , , -M или соответствующие длинные формы) составляют 5 пар.В параметры нижнего регистра (вклом) принимают значение и включают параметр на, варианты верхнего регистра (ВКЛОМ) не имеют значения и включаются опция выключена. Если вы укажете и нижний, и верхний регистр версии одного и того же варианта, то используется последний, но вас предупреждают, что это может быть не то, что вы намеревались.

ksymoops будет бежать вполне счастливо, без вариантов. Однако есть риск что значения по умолчанию для источников символов не могут быть подходящее. Поэтому, если ни один из -v vmlinux , -V , -k ksyms , -K , -l lsmod , -L , объект , -O , система.указана карта или , ksymoops выводит предупреждающее сообщение.

Вы не сказали мне, где найти информацию о символах. я будет предполагать, что журнал соответствует ядру и модулям, которые работают прямо сейчас, и я буду использовать параметры по умолчанию выше для разрешения символов. Если текущее ядро ​​и / или модули не соответствуют журналу, можно точнее получить вывод, сообщив мне версию ядра и где найти map, modules, ksyms и т. д. ksymoops -h объясняет параметры.

Если любой из -v vmlinux , -k ksyms , -l lsmod , -o объект или -m system.map options содержат строку * r (* m, * n, * s), тогда строка заменяется во время выполнения на текущее значение ‘uname -r‘ (-m, -n, -s). Это в основном предназначено для того, чтобы ksymoops автоматически подбирать файлы, зависящие от версии, используя значение по умолчанию параметры, однако он может использоваться для сообщений об ошибках скрипты для автоматического выбора файлов, чьи имена или каталог зависит от текущего ядра.
-v
vmlinux —vmlinux = vmlinux

Имя файла vmlinux, который соответствует отказавшему ядру. Примечание: Это файл vmlinux, а не zImage, bzImage, vmlinuz и т. д. Обычно это / usr / src / linux / vmlinux. если ты укажите -v , вы должны указать его только один раз.

-V —no-vmlinux

Не читать никакие vmlinux файл.

По умолчанию .
-k
ksyms —ksyms = ksyms

Где найти список символы ядра на момент сбоя. К сожалению, список символов ядра в / proc / ksyms непостоянен, он обновляется по мере загрузки и удаления модулей. Попробуй скопировать / proc / ksyms в обычный файл как можно скорее после Oops и укажите ksymoops на этой копии, используя -k . Modutils имеет поддержка автоматического копирования данных ksyms и lsmod, см. insmod (8). Если вам пришлось перезагружаться после Oops, и вы делаете у вас нет копии / proc / ksyms на момент сообщения Упс, попробуйте чтобы перезагрузить те же модули в том же порядке перед запуском ksymoops.Если вы укажете -k , вы должны указать только это однажды.

-К —no-ksyms

Не читаю никакое ядро символы.

По умолчанию / proc / ksyms .
-l
lsmod —lsmod = lsmod

Где найти список загруженные модули на момент выхода из строя. К сожалению, список в / proc / modules непостоянен, он обновляется как модули загружаются и удаляются. Попробуйте скопировать / proc / modules в нормальный файл как можно скорее после Oops и point ksymoops в этой копии, используя -l .Modutils имеет поддержку для автоматического копирования данных ksyms и lsmod см. insmod (8). Если вам пришлось перезагружаться после Oops, и вы делаете у вас нет копии / proc / modules на момент сообщения Oops, попробуйте перезагрузить те же модули в том же порядке перед работает ksymoops. Если вы укажете -l , вы должны только укажите это один раз.

-L —no-lsmod

Не читать список загруженных модули.

По умолчанию -l / proc / modules .
-o
объект —object = объект

Где найти предметы для модули, используемые отказавшим ядром.Это может быть каталог имя или отдельный файл. Если это каталог, то ksymoops выполняет рекурсивный находит (1) в этом каталоге для всех файлы, соответствующие ’* .o’. -o можно указать более одного раза, список является накопительным и может содержать смесь каталогов и файлов.

Примечание: Когда вы указываете каталог, ksymoops использует только файлы, заканчиваться на ‘.o’. Любые модули с нестандартными названиями игнорируются, если вы не укажете эти файлы явно. Для Например, если модули vmnet и vmmon не заканчиваются на ‘.о, тебе нужно что-то вроде этого, чтобы забрать все нормальные модули плюс нестандартные имена.

-o / lib / modules / * r / \
-o
/ lib / modules / * r / misc / vmnet \
-o
/ lib / modules / * r / misc / vmmon

Если вы используя версию insmod (8), в которой хранится имя файла модуля в / proc / ksyms, ksymoops может перейти непосредственно к этому файлу, это не нужен . Опция -o используется только когда ksyms содержит хотя бы один модуль, имя файла которого не указаны явно в ksyms.

-O —объект

Не сканировать никакие объекты. Если Поставляется / proc / ksyms, а insmod добавил ksymoops символы помощи (начинающиеся с __insmod), затем те символы используются для доступа к объектам, без каталога сканирование выполняется, поэтому ни -o, ни -O не действуют. К полностью отключить использование объектов модуля при ksyms содержит символы __insmod, укажите -O и один из -i или -I.

По умолчанию -o / lib / modules / * r / .Например, если uname -r сообщает 2.2.7, ksymoops использует -o /lib/modules/2.2.7/ , но только если он еще не знает, где находятся объекты.
-m
system.map —system-map = system.map

Где найти System.map соответствующий отказавшему ядру.

-M —no-system-map

Не читайте System.map.

По умолчанию -m / usr / src / linux / System.карта .
-s
save.map —save-map = save.map

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

По умолчанию нет сохраненная карта.
-S — короткие линии

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

По умолчанию короткие строки.
-e —endian-swap

ksymoops извлекает байты кода из отчетов и преобразует их в инструкции. Все ядра печатают байты кода в шестнадцатеричном формате, но, к сожалению, некоторые системы печатают несколько байтов, используя собственный компьютер порядок байтов. Это вызывает проблему только в том случае, если код напечатан. чем угодно, кроме 1 байтовых блоков. Например, i386 печатает по одному байту за раз, что переносимо на машине, альфа печатает 4 байта в нативном порядке байтов и отчет не переносная машина.

Если вы выполняет кросс-системную диагностику (скажем, для новой системы или встроенная версия Linux), затем неисправная система и система отчетов может иметь разный порядок байтов. На системы, которые одновременно поддерживают малый и большой порядок байтов время, ksymoops может быть скомпилирован с одним порядком байтов, но Дамп ядра мог использовать другой. Если ваш дизассемблер кода неверно, укажите . -e переключает между нативный и обратный порядок байтов при чтении байтов в каждом кусок кода.В этом контексте фрагмент кода равен 4 или 8. шестнадцатеричные цифры (2 или 4 байта кода), -e не действует в коде, который печатается как 2 шестнадцатеричные цифры (один байт в время).

Примечание: Более ранние версии ksymoops использовали -c code_bytes опция. Это сейчас устарело, используйте вместо него -e , но только если код разборка некорректна.

По умолчанию читать байты кода, используя порядок байтов, который был в ksymoops скомпилирован с помощью.
-x —hex

Обычно ksymoops печатает смещения и длины в шестнадцатеричном формате.Если вам нужны смещения и длины для печати в десятичном формате используйте переключатель -x .

По умолчанию шестнадцатеричный.
-1 — однократный

Обычно ksymoops читает его весь входной файл и извлекает все отчеты Oops. Если -1 переключатель установлен, он будет работать в режиме одного выстрела и выйдет после первый Ой. Это полезно для автоматической рассылки сообщает, как они происходят, например: —

#! / Bin / sh
# ksymoops1
в то время как (правда)
do

ksymoops -1> $ HOME / oops1

если [$? -экв. 3]

, затем

exit 0 # конец ввода, ошибки не найдены

фи

mail -s Oops admin <$ HOME / oops1

done

хвост -f / var / log / messages | ksymoops1

Перезапуск Команда tail после ротации бревен оставлена ​​в качестве упражнения для читатель.

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

По умолчанию читать все из файла Oops.file, распаковывая и обрабатывает все, что найдет. Обратите внимание, что метод по умолчанию читает источники символов один раз и предполагает, что окружающая среда не меняется от одного упа к другому, не обязательно действителен, когда вы используете модули.
-i —ignore-insmod-path

Когда вы используете начальную ramdisk для модулей, путь к модулям обычно просто / lib. Этот путь записан в __insmod …_ символ O в ksyms, но ksymoops не может найти файлы в реальном / lib, поэтому он выдает предупреждающие сообщения. Если вы указываете -i, тогда ksymoops игнорирует имя пути в __insmod … O, вместо этого ищет пути -o (если любой) ищет объект с правильным базовым именем и отметка времени. -i рекомендуется при загрузке модулей из рамдиск.Это предполагает, что пути -o содержат модули используется для создания ramdisk с той же меткой времени.

По умолчанию используйте путь из символов __insmod … O.
-I —ignore-insmod-all

Используйте этот переключатель, если хотите полностью игнорировать всю вспомогательную информацию insmod (8) (символы, начинающиеся с __insmod в ksyms). Это включает в себя пути модулей, временные метки, начало и длина раздела и т. д. Затем ksymoops вернется к старому методу сопоставления символы для объектов модуля, используя пути -o (если есть).Это трудно придумать законную причину для использования -I, -i is лучше, если ваша единственная проблема — несоответствие имени пути.

По умолчанию используйте путь из __insmod … O символов и раздела информация из символов __insmod … S.
-T
усечь —truncate = усечь

Если ваш binutils настроен для нескольких целей они, как правило, печатают адреса, используя размер адреса самой большой цели. Если другие входы в ksymoops имеют более короткие размеры символов, разные представления вызывают символы, которые должны иметь одинаковые адрес появится по разным адресам.Это конкретная проблема при сборке для смешанных 32 и 64 бит цели. Чтобы устранить двусмысленность, используйте —truncate = усечь . Значение 0 означает, что нет усечение, значение больше 8 * sizeof (беззнаковое длинное) равно бесшумно преобразован в 0.

По умолчанию —truncate = 0 , без усечения.
-d —debug

Каждое появление -d увеличивает уровень отладки ksymoops на единицу.

Уровень 1

Компиляция регулярного выражения резюме.До и после текста для расширения * [mns]. Обработка опций, но только для опций, появляющихся после -d . Вход в основные процедуры обработки. KSYMOOPS_ переменные среды. Объектные файлы, извлеченные непосредственно из ksyms. Информация о совпадениях загруженных модулей и объекты модуля. Имя файла отчета «К сожалению». Номер версии для упс. Сохранение объединенной карты системы.

Уровень 2

Сводная информация о символе размеры стола. Каждый номер версии, найденный в файле oops.Сравнение символьных карт. Добавление карт символов. Полный путь программы. Поданы внешние команды. Отчеты о проделанной работе для объект . Имена ’* .o’ файлы, найденные в каталоге -o . Корректировка смещения для разделы модуля. Каждая строка, выводимая при запуске objdump на байты кода.

Уровень 3

Каждая входная строка из Упс. Файл. Отсутствуют повторяющиеся символы и символы с низким адресом из объединенной карты системы. Отображение адресов на символы.

Уровень 4

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

Уровень 5

Для сопоставления регулярных выражений, подробности на каждой подстроке.

По умолчанию нет отладка.
-h —help

Печатает текст справки и текущие значения по умолчанию.

-t цель —target = цель

Обычно вы делаете диагноз «Ой» используя то же оборудование, что и сам Oops.Но иногда вам нужно провести кросс-системную диагностику. от одного типа оборудования и обработки его на другом. Например, когда вы переходите на новую систему или сборка встроенного ядра. Сделать кросс-систему Ой обработки, вы должны сообщить ksymoops, какое целевое оборудование есть, используя -t цель , где цель — имя цели bfd. Вы можете узнать, на какие цели ваша машина поддерживает

ksymoops -t ’?’

По умолчанию та же цель, что и сам ksymoops, за одним исключением.На sparc64, ядро ​​использует elf64-sparc, но пользовательские программы elf32-sparc. Если -t цель не была указано, и ksymoops был скомпилирован для elf32-sparc и К сожалению, содержит строку TPC, затем ksymoops автоматически переключается на -t elf64-sparc.
-a
архитектура —architecture = архитектура

Сделать кросс-систему Упс обработки, вы должны сообщить ksymoops, что цель архитектура есть, используя -a архитектура , где архитектура — имя архитектуры bfd.Ты можете узнать, какие архитектуры поддерживает ваша машина по

ksymoops -a ’?’

По умолчанию та же архитектура, что и сам ksymoops, за одним исключением. На sparc64, ядро ​​использует sparc: v9a, но пользовательские программы спарк. Если -a архитектура не была указано, и ksymoops был скомпилирован для sparc и Oops содержит строку TPC, тогда ksymoops автоматически переключается на -a sparcv: 9a.
-A
«адрес list « —addresses = » адрес список « Если вы

есть несколько специальных адресов для преобразовать в символы, вы можете указать их явно, используя -A «список адресов» .Любые слова в список, который выглядит как адреса, преобразуются в символы. Знаки пунктуации и неадресные слова молча игнорируется, ведущие 0x в адресах также игнорируются, так что вы можете вставлять текст, включая слова и только адреса будет обработан.

Упс. Файл …

ksymoops принимает ноль или более входные файлы и читает их все. Если в командная строка и адреса не предоставляются через -A затем ksymoops читает со стандартного ввода.Вы даже можете ввести текст Oops прямо на терминале, хотя это не рекомендуемые.

ВХОД

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

Все вкладки преобразуется в пробелы, предполагая, что tabstop = 8. Где текст ниже написано «хотя бы один пробел», вкладки работают так же, как хорошо, но перед печатью они преобразуются в пробелы. Все нули и возврат каретки молча удаляется из строк ввода, оба вызывают проблемы при обработке и печати строк.

Входная линия может иметь префикс, который ksymoops будет печатать как часть линии, но игнорируйте во время анализа. Префикс может быть от syslogd (8) (состоит из даты, времени, имени хоста, ’Kernel:’), из syslog-ng (числа и три другие строки, разделенные ’|’), это может быть «начало строки» означает первый символ после пропуск всех префиксов, включая весь начальный пробел.

Каждое ядро команда архитектуры использует разные сообщения для ядра проблемы, см. Oops_read в oops.c для полного, кровавого списка.Если вы вводите сообщение Oops вручную, вам необходимо следовать как можно больше форматировать ядро, иначе ksymoops может не распознал ваш ввод. При вводе регистр не учитывается.

A в скобках адрес не обязателен ’[’, обязательно ’<’, Не менее 4 шестнадцатеричных цифр, обязательно ’>’, Необязательно ’]’, необязательно пробелы. Например, [<01234567>] или .

Без скобок адрес должен состоять не менее чем из 4 шестнадцатеричных цифр, за которыми следует необязательный пробелы. Например 01234567 или abCDeF.

Компьютер Sparc строка — ’PSR:’ в начале строки, пробел, шестнадцатеричный цифры, пробел, ´PC: ’, пробел, без квадратных скобок адрес.

TPC sparc64 строка: ’TSTATE:’ в начале строки, пробел, 16 шестнадцатеричные цифры, пробел ’TPC:’, пробел, без квадратных скобок адрес.

НПИ ppc строка имеет несколько форматов. ’Kernel pc’ ’Ловушка на ПК:’ ´bad area pc ’или’ NIP: ’. Любая из этих строк, за которой следует один пробел и адрес без скобок — это значение NIP.

ПК mips строка — ’epc’ в начале строки, необязательный пробел, один или несколько знаков «:», необязательный пробел, без квадратных скобок адрес.

Устройство ix86 EIP строка — ’EIP:’ в начале строки, по крайней мере, один пробел, любой текст, адрес в квадратных скобках.

EIP x86_64 строка — ’RIP:’ в начале строки, по крайней мере, один пробел, любой текст, адрес в квадратных скобках.

ПК m68k строка — ’PC’ в начале строки, необязательные пробелы, ’=’, Необязательные пробелы, адрес в квадратных скобках.

Линия arm PC это ’pc’ в начале строки, необязательные пробелы, ’:’, Необязательные пробелы, адрес в квадратных скобках.

IP-адрес IA64 строка — ’ip’, необязательный пробел ’:’, необязательный пробел, адрес в квадратных скобках.

Линия mips ra is ’ra’, необязательные пробелы, один или несколько ’=’, Необязательные пробелы, адрес без квадратных скобок.

Спарк строка дампа регистра (’i’, ’0’ или ’4’, ’:’, пробел) или (’Instruction DUMP:’, пробел) или (’Звонящий [’).

IA64 b0 строка ’b0’, необязательный пробел ’:’, необязательный пробел, адрес без квадратных скобок. Это можно повторить для других регистров b, например b6, b7.

Реестр дампов есть множество форматов. Большинство из них имеют форму ´name: value ’повторяется через строку, некоторые архитектуры используют ´ = ’вместо ´: ’. См. Текущий список распознанные имена регистров.Помимо списка Oops_regs, i370, mips, ppc и s390 имеют специальные форматы дампа регистров, обычно печатается одно имя регистра, за которым следует несколько значения. ksymoops извлекает все содержимое регистров, но только декодирует и печатает значения регистров, которые могут быть разрешены в символ ядра.

Набор звонков линии трассировки начинаются с ’Trace:’ или «Отслеживание звонков:» или ´Call Backtrace: ’(только ppc) или ’Функция введена в’ (только охрана) или ´Caller [’(только sparc64), за которым следует как минимум одно пространство.

Для ’Trace:’ и ’Call Trace:’, остальная часть строки — адреса в квадратных скобках, они могут быть продолжил на лишние строки.Адреса не могут быть разделены поперек линий.

Для ’Call Backtrace:’ (только ppc), остальная часть строка — адреса без квадратных скобок, их можно продолжить на дополнительные строки. Адреса не могут быть разделены линий.

Для ’Функция введена в’ (только рука), строка содержит ровно два адреса в квадратных скобках и не продолжение.

Для ’Caller [’ (только sparc64), строка содержит ровно один адрес без квадратных скобок и не продолжение.

Отжимная петля информация обозначается линией, начинающейся с ’Bh:’, за которым следуют строки, содержащие обратные скобки для обратных адресов.По какой-то причине эти адреса отличаются от всех остальных адресов и выгляди так ’<[Шестнадцатеричный]> <[шестнадцатеричный]>’ вместо нормальный ´ [] [] ’.

Кодовая строка обозначается ‘Instruction DUMP’ или (‘Код’ с дополнительными пробелами), ’:’, Один или несколько пробелов, за которыми следует как минимум одно шестнадцатеричное значение. Строка может содержать несколько шестнадцатеричных значений, каждый разделен хотя бы одним пробелом. Каждое шестнадцатеричное значение должно быть От 2 до 8 цифр и должно быть кратным 2 цифрам.

Любой код значения могут быть заключены в <..> или (..), последний такой Предполагается, что значение является ошибочной инструкцией. Если нет значения имеет <..> или (..), то предполагается, что первый байт невыполненная инструкция.

Особые случаи где Код: может сопровождаться текстом. Код: общий защита ’или’ Код: ’. Сбросьте data в любом случае код был недоступен.

Вы обнаруживаете небольшое замечание о несоответствии в вышеизложенном?

АДРЕС ДЛЯ ПРЕОБРАЗОВАНИЯ СИМВОЛА

Адреса преобразованы в символы на основе символов в vmlinux, / proc / ksyms, объектные файлы для модулей и System.карта, или как многие из этих источников как ksymoops было велено прочитать. ksymoops использует столько источников символов, сколько вы можете предоставить, пересекает ли проверки между различными источниками для выявления любых расхождений и строит объединенную карту, содержащую все символы, включая загруженные модули, где это возможно.

Символы, которые заканчиваются на _R_xxxxxxxx (8 шестнадцатеричных цифр) или _R_smp_xxxxxxxx версионный символ, см. genksyms (8). ksymoops убирает _R _… при построении внутренней карты системы.

Символы модуля не появляются ни в vmlinux, ни в System.карта и только экспортированный символы из модулей появляются в / proc / ksyms. Следовательно ksymoops пытается прочитать символы модуля из объектных файлов согласно . Без этих обозначений модулей диагностировать проблему в модуле практически невозможно.

Есть много проблемы с символами модулей, особенно с версиями insmod (8) до 2.1.121 включительно. Некоторые модули не экспортировать любые символов, их нет в / proc / ksyms, поэтому они фактически невидимы.Даже когда модуль экспортирует символы, обычно он экспортирует только один или два, не полный список, который действительно нужен для Упс диагноз. ksymoops может построить полную таблицу символов из объектный модуль, но он должен

(а) Знайте, что модуль загружен.

(б) Найдите правильный объект файл для этого модуля.

(c) Преобразовать раздел и символьные данные из модуля в адреса ядра.

Если модуль не экспортирует символы, тогда ksymoops не сможет получить любую информацию об этом модуле. lsmod говорит, что это загружен, но без символов, ksymoops не может найти соответствующий объектный файл и сопоставление смещений с адресами. Извините, но это так, если вы упс в модуле который не отображает символы в ksyms, забудьте об этом :(.

Когда модуль экспортирует символы, следующим шагом будет поиск объектного файла для этого модуля. В большинстве случаев загруженный модуль и объектный файл имеет такое же базовое имя, но это не гарантировано.Например,
insmod uart401 -o xyz
загрузит uart401.o из каталогов вашего модуля, но сохранит это как xyz. И ksyms, и lsmod говорят имя модуля ’Xyz’ без указания того, что оригинал объектный файл был uart401. Таким образом, ksymoops не может просто использовать имя модуля из ksyms или lsmod, он должен делать намного больше поработайте, чтобы найти правильный объект. Он делает это, ища уникальное совпадение экспортируемых символов и символов в объекты модуля.

Для каждого файла полученный из опций -o , ksymoops извлекает все символы (как статические, так и внешние) с использованием нм (1).Тогда это запускает символы экспортированного модуля в ksyms и для каждого символ экспортированного модуля, он выполняет строковое сравнение этого символ напротив каждого символа в каждом объекте. Когда ksymoops находит символ модуля, который экспортируется в ksyms и появляется ровно один раз среди всех -o объектов, тогда он должен предположить, что это тот объект, который использовался для загрузки модуль. Если ksymoops не может найти совпадений ни для одного экспортированного символ в модуле или находит более одного совпадения для каждого экспортированный символ в модуле, то он не может определить, какой объект действительно был загружен.

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

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

Когда оба ksyms и lsmod доступны список модулей, извлеченных из ksyms сравнивается со списком модулей из lsmod. Любая разница отмечается как предупреждение, обычно указывает на невидимые модули. Однако это также может быть вызвано из-за несоответствия между ksyms и lsmod.

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

* Обозначения экспортированного модуля в ksyms сравниваются с символами в соответствующий объектный файл. ksyms имеет приоритет.

* Ядро (без модуля) символы из ksyms сравниваются с vmlinux. vmlinux имеет приоритет.

* Символы из System.map сравнивается с vmlinux. vmlinux берет приоритет.

* символы из vmlinux сравниваются с System.map. vmlinux имеет приоритет. Эти два источника сравниваются в обоих направлениях, они должны быть идентичны.

* Ядро (без модуля) символы из ksyms сравниваются с System.map. System.map имеет приоритет.

После прочтения и перекрестная проверка всех источников символов, они объединяются в единую системную карту. Повторяющиеся символы, регистры (тип a) и статические символы ’gcc2_compiled.’ являются выпал с объединенной карты. Любые символы с адресом ниже 4096 отбрасываются, это такие символы, как Using_Versions с адресом 0.

Учитывая все выше обработки и дедукции, очевидно, что объединенная системная карта не может быть на 100% надежной, а это означает, что преобразование адресов в символы не может быть надежным. В адреса действительны, но преобразование символов только как хороши как источники символов, которые вы скачали в ksymoops.

/ proc / ksyms и / proc / lsmod изменчивы, поэтому, если ksymoops не получит текущий ksyms, вы всегда должны подвергать сомнению действительность информация о модуле. Единственный способ, который я знаю (почти) Гарантия действительного ksyms — использование ksymoops в однократном режиме (см. опцию -1 ).Затем ksymoops читает журнал и декодирует Oops в реальном времени.

ПОДДЕРЖКА KSYMOOPS В МОДУТИЛЯХ

Modutils 2.3.1 и далее имеет поддержку, чтобы упростить отладку, особенно для модулей. За подробностями обращайтесь к insmod (8). если ты хотите автоматические снимки данных ksyms и lsmod в виде модулей загружаются и выгружаются, создайте / var / log / ksymoops, он должен принадлежать root с режимом 644 или 600. Если не хотите автоматические снимки, не создавайте каталог. Скрипт (insmod_ksymoops_clean) предоставляется modutils для удаления старые версии, это должно запускаться cron один раз в день.

ВЫХОД

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

Когда ksymoops видит строки EIP / PC / NIP / TPC, строки трассировки вызовов или строки кода, он распечатывает их и сохраняет для дальнейшей обработки. Когда строка кода обнаружена, ksymoops преобразует Адрес EIP / PC / NIP / TPC и адреса трассировки вызовов для символы.В этих строках есть ’;’ после заголовка. вместо ’:’, на всякий случай, если кто-нибудь захочет передать вывод ksymoops обратно в ksymoops, эти сгенерированные строки игнорируются.

Форматированные данные для программного счетчика, трассировка и код выводятся только тогда, когда Видна строка Код :. Если какие-либо данные были сохранены для позднее форматирование и более 5 строк, кроме текста Oops или конец файла, тогда ksymoops предполагает, что строка Code: отсутствует или искажена и выводит отформатированный данные в любом случае. Это должно быть отказоустойчивым, потому что строка Code: (или его эквивалент) сигнализирует об окончании отчета Oops.За исключением sparc64 на SMP, у которого есть дамп реестра после кода. ksymoops пытается удовлетворить это исключение. Вздох.

Адреса преобразованы в символы везде, где это возможно. Например

>> EIP; c0113f8c
Trace; c011d3f5
Трассировка; c011af5f
Trace; c011afe9
Trace; c011d2bc
Trace; c010e80f
Trace; c0107c39
Trace; c0107b30
Trace; 00001000 Перед первым символом

Каждый преобразован после адреса следует ближайший к нему символ адрес.За этим символом следует смещение адрес от символа. Значение после ’/’ равно «размер» символа, разница между символ и следующий известный символ. Итак,
>> EIP; c0113f8c означает что счетчик программы был c0113f8c. Предыдущий символ sys_init_module, адрес 0x49c байт от начало символа, sys_init_module имеет длину 0x4d0 байт. Если вы предпочитаете десятичные смещения и длины, см. опцию -x . Если символ поступает из модуля, ему предшествует префикс ’[ имя_модуля ]’, некоторые модули имеют те же имена процедур.

Использование «EIP» для счетчика программ выше предназначен для ix86. ksymoops пытается использовать правильную аббревиатуру программы счетчик (ПК, NIP, TPC и т. д.), но если он не распознает целевое оборудование, по умолчанию используется EIP.

Когда код: строка читается, ksymoops извлекает байты кода. Он использует строка счетчика программы вместе с байтами кода для сгенерировать небольшой объектный файл в целевой архитектуре. ksymoops затем вызывает objdump (1) для дизассемблирования этого объекта. файл.Инструкции, удобочитаемые человеком, извлекаются из вывод objdump и напечатанный с адресом к символу конверсия. Если дизассемблированный код не выглядит разумным, см. варианты -e , -a и -t .

ВЗЯТЬ СИМВОЛЫ, СМЕЩЕНИЯ И ДЛИНЫ С ЩЕТОЧКОЙ СОЛИ! адреса действительны, но преобразование символов только как хорошо, как ввод, который вы дали ksymoops. Смотрите все проблемы в «АДРЕС ДЛЯ ПРЕОБРАЗОВАНИЯ СИМВОЛА» выше. Так же трассировка стека потенциально неоднозначна.Ядро печатает любые адреса в стеке, которые могут быть допустимыми адресами . Ядро не может сказать, какие (если есть) из них адреса настоящие и которые просто лежат в стеке из предыдущих процедур. ksymoops просто декодирует то, что ядро печатает.

ПЕРЕМЕННЫЕ ОКРУЖАЮЩЕЙ СРЕДЫ

KSYMOOPS_NM

Путь для нм, по умолчанию $ {INSTALL_PREFIX} / bin / $ {CROSS} нм.

KSYMOOPS_FIND

Путь для поиска, по умолчанию / usr / bin / find.

KSYMOOPS_OBJDUMP

Путь для objdump, по умолчанию $ {INSTALL_PREFIX} / bin / $ {CROSS} objdump.

ДИАГНОСТИКА ПЕРЕКРЕСТНОЙ СИСТЕМЫ

Для обработки К сожалению, из одной системы в другую вам нужен доступ ко всем источники символов, включая модули, System.map, ksyms и т. д. две системы — разные аппаратные средства, вам также понадобится версии команд nm и objdump, которые выполняются на вашем система, но обрабатывает целевую систему. Также нужны версии libbfd, libopcodes и libiberty, которые обрабатывают цель система.За инструкциями обратитесь к документации по binutils. о том, как создавать кросс-системные версии этих коммунальные услуги.

Для отмены версии nm и find по умолчанию, используйте среду переменные выше. Чтобы использовать разные версии libbfd и libiberty используйте параметр —rpath при компоновке ksymoops или переменная среды LD_LIBRARY_PATH при запуске ksymoops. См. Информационные страницы для ld и / usr / doc / glibc * / FAQ. Вы также можете создать версию ksymoops, предназначенную для в среду кросс-компиляции с помощью BFD_PREFIX, Параметры DEF_TARGET, DEF_ARCH и CROSS во время сборки.Видеть УСТАНОВИТЕ в исходном пакете ksymoops для получения дополнительных сведений.

ДИАГНОСТИКА

0 — нормально.

1 — ошибка (и) или предупреждения, результаты могут быть ненадежными.

2 — фатальная ошибка, нет полезные результаты.

3 — Режим одного выстрела, конец входных данных достигнут, но не отображается сообщение «К сожалению».

ОШИБКИ

Из-за множество возможных ошибок ядра и информационных строк, При сопоставлении с образцом ksymoops иногда печатаются строки это вовсе не ошибки.Например, начало строки с 3c589 соответствует шаблону для линии трассировки вызова, оба начинаются как минимум с 4 шестнадцатеричных цифр. Люди умнее, чем программы игнорируют ложные строки.

АВТОРЫ

Кейт Оуэнс — сопровождающий.

патчей от Якуб Елинек , Ричард Хендерсон .

ИСТОРИЯ

Оригинал ksymoops.cc был написан Грегом МакГэри и обновлено Андреасом Шваб . Что версия требует C ++ и поддерживает только ix86 и m68k.

Чтобы получить эквивалент старого ksymoops.cc (без vmlinux, без модулей, без ksyms, без System.map) используйте ksymoops -VKLOM. Или чтобы просто прочтите System.map, ksymoops -VKLO -m mapfile.

СМОТРИ ТАКЖЕ

находка (1), insmod (8), нм (1), objdump (1), rmmod (8), dmesg (8), genksyms (8), syslogd (8). bfd файлы информации.



Бесплатное программное обеспечение с открытым исходным кодом
О себе
  • это вид знаний, который отделяет сисадминов от операторов
  • должен быть чем-то для всех
  • , даже если это чувство масштаба
  • охватывает много вопросов
  • fastpath по теме
  • долгое время на oopsen
  • отладка, немного сложная
  • остальное время на зависаниях
  • быстро поговорим о создании отчетов об ошибках
  • не может показать все
  • только некоторые основы, чтобы вы запустил
  • более чем одним способом это сделать!
  • сделайте другие, если есть интерес
  • Отладочные книги UNIX
  • для упрощения
  • упс: сработал сигнал тревоги и мигает красный свет
  • блокировка: ядро ​​отключилось и не может восстановиться
  • может быть временным, как и проблемы с wavelan, которые у нас были в прошлый раз.
  • перезагрузка: катастрофический сбой, произошло что-то очень плохое…
  • Обновление блока питания вызывает перезагрузку под нагрузкой, недостаточно энергии
  • В: пользователь / системный администратор / разработчик
  • В: сбой?
  • Q: поймать ой?
  • Q: расшифровать?
  • Q: сообщить об этом?
  • Q: починить самому?
  • потратьте немного времени на это
  • довольно важно
  • вы должны сообщить, потому что:
  • обнаружена редкая ошибка
  • происходит только в конфигурации вашего оборудования
  • экран / вырезать и вставить
  • кольцевой буфер / dmesg
  • захват ближе к декодированию
  • декодирование ближе к исправлению
  • исправление ближе к разработке
  • будет ли это звучать как йода? (разработка приводит к страданиям !!)
  • последовательные консоли [IPL — ядро ​​- lilo — нуль-модем]
  • описательное да?
  • отключено форматирование, чтобы он отображался на слайде и читался
  • Q: сколько программистов?
  • Q: кто видел ассемблер?
  • система может продолжить работу после этого
  • неопределенное поведение
  • xksymoops late 98
  • декодировать вручную, чтобы вы поняли это в дальнейшем
  • используйте некоторые методы блокировки.
  • NULL указатель
  • на структуру
  • смещение доступа 14
  • История смещения Sun
    • Цикл разработки Solaris
    • разбился случайным образом повсюду
    • повреждение памяти
    • всегда происходило повреждение то же смещение
    • определил, какие структуры имеют элементы с этим смещением
    • определил места, которые изменили эти элементы
    • только что проверил эти части кода
  • может вызвать другие ошибки в обычном точном коде
  • 9000 5
  • указатель инструкции
  • там, где он был выше
  • вернуться к этому позже
  • документы Intel
  • могут быть полезны после декодирования функции
  • ..
  • стек общего назначения
  • разбивает стек ядра (8k?)
  • ограничен по размеру
  • ненадежная трассировка вызова
  • довольно бесполезна, требует декодирования
  • адресов, которые выглядят правильно
  • адрес возврата находится в середине функции
  • код — следующие инструкции, которые должны быть выполнены
  • адрес сам по себе почти бесполезен
  • диапазон 3-4 гигабайт
  • получить отсортированную таблицу символов ( Система.map или / proc / ksyms)
  • ошибка произошла где-то в функции
  • , поэтому EIP находится между двумя адресами
  • получить функцию и смещение в функцию
  • может сделать это для всех функций трассировки вызовов
  • вы можете увидеть:
  • tar
  • mkdir
  • reiserfs filesystem (нет, я не собираюсь идти)
  • обратите внимание на инструкцию mov, мы вернемся к ней
  • x
  • xbase 10!
  • эта декодированная информация полезна разработчикам
  • вы сможете легко добраться до этой точки
  • x Отладка
  • — это не рецепт, которому вы можете просто следовать
  • есть несколько способов сделать это
  • нужно адаптировать (используйте printk и т. д.)
  • поймите, что происходит
  • в этом случае у нас есть дамп упс, поэтому мы сконцентрируемся на нем
  • как вы можете использовать эту информацию
  • не волнуйтесь, если вы потеряетесь в этом следующем бите
  • довольно быстро
  • найти имя функции в исходном коде
  • grep или cscope
  • дизассемблировать файл .o (или ядро)
  • сопоставить смещение, чтобы добраться до места сбоя
  • 0326 binutils, в каждой системе это
  • смещение было 0x298
  • сложно!
  • что он делает
  • как он разветвляется
  • более чем одним способом!
  • назад к выходу objdump
  • не удалось на ходу
  • собирался выполнить вызов
  • вызываемая функция имела четыре аргумента (push)
  • от:
  • глядя на ветвление
  • вызов функции подсчета
  • кровавый очевидный комментарий
  • включить -g в код CFLAGS
  • перед предварительной обработкой
  • показывает, где именно он потерпел неудачу
  • он загружает адрес в регистр перед его вызовом
  • у вас есть этот адрес во время компиляции
  • странная оптимизация ??
  • тада!
  • Макросы
  • затрудняют отладку
  • может запустить исходный код через препроцессор C (-E)
  • Стиль кодирования
  • может усугубить ситуацию; одна строка на 16k

  • остановится там
  • сообщение от нашего спонсора…
  • Линус известен тем, что был против встроенных отладчиков
    • , чтобы правильно исправить проблемы, вам нужно
    • понять написанный код
    • и то, что он должен делать
  • теперь можно немного расслабиться
  • это намного проще
  • зависания, зависания
  • в целом блокировки вызваны ожиданием чего-то
  • не произойдет
  • не будет выпущено
  • может заблокировать один или несколько процессоров в системе
  • как захват oopsen, цель состоит в том, чтобы выяснить, где заблокирован код
  • , когда у вас есть местоположение, вы можете ответить, почему
  • плохо оборудование (например, память)
  • плохой драйвер
  • плохой микрокод….
  • невезение?
  • легче отлаживать, когда он быстро воспроизводится
  • патч IEP печати может использоваться для отладки ошибок типа спонтанной перезагрузки
  • программные проблемы
  • тест с подсветкой клавиатуры
  • аппаратные хакеры могут сделать плату NMI по старым картам ISA
  • узнайте, куда он пропал, с помощью magic sysreq
  • P show regs / EIP
  • очень полезный инструмент общего назначения
  • немного опасен, поэтому он обычно выключен в большинстве систем по умолчанию
  • / etc / sysctl.conf на красной шляпе
  • вы получите прерывание
  • тупиковые ситуации инверсии ab lock в системах MP

  • сторожевой таймер NMI, создающий дамп стека
  • print
    patch применимо
  • Блокировки X являются обычным явлением, и их трудно отладить
  • на консоли выглядят как блокировки с отключенным IRQ
  • проверка по сети, извлечение карт на ноутбуках, воспроизведение музыки
  • можно использовать клавишу sysreq для сброса клавиатуры в режим Raw и поменять VT
  • NONONO!
  • прочитать файл REPORTING-BUGS
    • oops data
    • версия ядра
    • применены исправления
    • файл конфигурации ядра
    • оборудование
    • САМОЕ ВАЖНО ЧТО ВЫ ДЕЛАЛИ В ВРЕМЯ!
  • тип
  • собирать
  • процесс
  • что с этим делать
  • основы отладки
  • надеюсь ближе к разработке кода
  • или поймете, что дальше идет не так
  • 25 ? понять ядро ​​
  • изучить базовые языки (C и ASM)
  • эксперимент

  • Linux Kernel Documentation :: oops-tracing.txt

    На основе ядра версии 4.9. Страница создана 21 декабря 2016 в 14:36 ​​EST.

    1 ПРИМЕЧАНИЕ: ksymoops бесполезен в версии 2.6. Пожалуйста, используйте Oops в исходном формате
    2 (из dmesg и т. Д.). Игнорируйте любые ссылки в этом или других документах на "декодирование
    3 Oops "или" прогоняя его через ksymoops ". Если вы опубликуете Oops из версии 2.6,
    4 был запущен через ksymoops, люди просто скажут вам сделать репост.
    5
    6 Краткое резюме
    7 -------------
    8
    9 Найдите сообщение "Упс" и отправьте его обслуживающему персоналу области ядра, которая, по всей видимости,
    10 вовлечены в проблему.Не беспокойтесь слишком сильно о том, чтобы попасть не на того человека.
    11 Если вы не уверены, отправьте его лицу, ответственному за код, относящийся к
    12 что ты делал. Если это происходит неоднократно, попробуйте и опишите, как воссоздать
    13 шт. Это стоит даже больше, чем упс.
    14
    15 Если вы не знаете, кому отправлять отчет, отправьте его
    16 [email protected]. Спасибо за вашу помощь в создании Linux как
    17 стабильных, насколько это возможно.
    18
    19 Где упс?
    20 ----------------------
    21 год
    22 Обычно текст Oops считывается из буферов ядра с помощью klogd и
    23 передается syslogd, который записывает его в файл syslog, обычно
    24 / var / log / messages (зависит от / etc / syslog.conf). Иногда умирает klogd,
    25 и в этом случае вы можете запустить dmesg> file для чтения данных из ядра.
    26 буферов и сохраните его. Или вы можете cat / proc / kmsg> file, но вы
    27 должны прерваться, чтобы остановить передачу, kmsg - это «нескончаемый файл».
    28 Если машина разбилась настолько сильно, что вы не можете вводить команды или
    29 диск недоступен, у вас есть три варианта: -
    30
    31 (1) От руки скопируйте текст с экрана и введите его после машины.
    32 перезапустился. Беспорядочно, но это единственный вариант, если у вас его нет.
    33 запланировано к катастрофе.Как вариант, вы можете сфотографировать
    34 экран с цифровой камерой - не красиво, но лучше
    35 ничего. Если сообщения прокручиваются в верхней части консоли, вы
    36 может обнаружить, что загрузка с более высоким разрешением (например, vga = 791)
    37 позволит вам прочитать больше текста. (Предостережение: для этого нужен vesafb,
    38, так что не поможет при `` ранних '' оплакиваниях)
    39
    40 (2) Загрузитесь с последовательной консоли (см. Documentation / serial-console.txt),
    41 запустить нуль-модем на вторую машину и записать там вывод
    42 используя вашу любимую коммуникационную программу.Миником работает хорошо.
    43 год
    44 (3) Используйте Kdump (см. Documentation / kdump / kdump.txt),
    45 извлеките кольцевой буфер ядра из старой памяти с помощью dmesg
    46 gdbmacro в Documentation / kdump / gdbmacros.txt.
    47
    48
    49 Полная информация
    50 ----------------
    51
    52 ПРИМЕЧАНИЕ: сообщение Линуса ниже относится к ядру 2.4. Я сохранил это
    53 по историческим причинам, а также потому, что часть информации в нем все еще
    54 применяется. В особенности игнорируйте любые ссылки на ksymoops.
    55
    56 Источник: Линус Торвальдс 
    57
    58 Как отследить Упс ... [первоначально письмо linux-kernel]
    59
    60 Главный трюк - иметь 5-летний опыт работы с этими надоедливыми упсами.
    61 сообщение ;-)
    62
    63 На самом деле, вы можете сделать это проще. у меня есть два
    64 отдельных подхода:
    65
    66 ГБД / USR / SRC / Linux / VMlinux
    67 gdb> дизассемблировать <преступная_функция>
    68
    69 Это простой способ найти проблему, по крайней мере, если отчет об ошибке
    70 хорошо сделанных (как этот - пробегите через ksymoops, чтобы получить
    71 информация о том, какая функция и смещение в функции, что она
    72 произошло в).73
    74 О, это помогает, если отчет происходит на ядре, которое скомпилировано с
    75 тот же компилятор и похожие настройки.
    76
    77 Еще нужно разобрать часть отчета об ошибке «Код:»:
    78 ksymoops сделает то же самое с правильными инструментами, но если у вас нет
    79 инструментов, с помощью которых можно сделать глупую программу:
    80
    81 char str [] = "\ xXX \ xXX \ xXX ...";
    82 main () {}
    83
    84 и скомпилируйте его с помощью gcc -g, а затем выполните "disassemble str" (где "XX"
    85 значений - это значения, сообщенные Oops - вы можете просто вырезать и вставить
    86 и заменяю пробелы на "\ x" - это то, что я делаю, так как мне лень
    87, чтобы написать программу для автоматизации всего этого).88
    89 В качестве альтернативы вы можете использовать сценарий оболочки в scripts / decodecode.
    90 Его использование: decodecode  или (), как в «<86>» или «(f00d)». Эти
    96 метки <> или () указывают на текущий указатель инструкции.Пример из
    97 i386, разбитый на несколько строк для удобства чтения:
    98
    99 Код: f9 0f 8d f9 00 00 00 8d 42 0c e8 dd 26 11 c7 a1 60 ea 2b f9 8b 50 08 a1
    100 64 ea 2b f9 8d 34 82 8b 1e 85 db 74 6d 8b 15 60 ea 2b f9 <8b> 43 04 39 42 54
    101 7e 04 40 89 42 54 8b 43 04 3b 05 00 f6 52 c0
    102
    103 Наконец, если вы хотите увидеть, откуда берется код, вы можете сделать
    104
    105 кд / usr / src / linux
    106 make fs / buffer.s # или любой другой файл, в котором произошла ошибка
    107
    108, и тогда вы получите лучшее представление о том, что происходит, чем с gdb
    109 разборка.110
    111 Теперь уловка состоит в том, чтобы объединить все данные, которые у вас есть: C
    112 источников (и общие сведения о том, что _должен_ делать), сборка
    113 листинг и дизассемблер кода (и дополнительно дамп реестра)
    114 также можно получить из сообщения «ой» - это может быть полезно, чтобы увидеть _какой_
    115 поврежденных указателей были, и когда у вас есть список ассемблера, вы можете
    116 также сопоставляют другие регистры с любыми выражениями C, которые они использовали
    117 для).
    118
    119 По сути, вы просто смотрите на то, что не совпадает (в данном случае это был
    120 "Код" дизассемблера, который не соответствовал тому, что сгенерировал компилятор).121 Затем вам нужно выяснить, почему они не совпадают. Часто это просто - ты
    122 видите, что в коде используется указатель NULL, а затем вы смотрите на код и
    123 интересно, как туда попал NULL-указатель и правильно ли это делать?
    124 вы просто проверите против него ..
    125
    126 Теперь, если кто-то поймет, что это отнимает много времени и требует
    127 какая-то небольшая концентрация, вы правы. Вот почему я буду
    128 в основном просто игнорируют любые отчеты о панике, в которых нет таблицы символов
    129 информация и т. Д. Искали: просто становится слишком сложно ее найти (у меня есть
    130 программ для поиска определенных шаблонов в сегменте кода ядра, и
    131 иногда мне удавалось найти и подобные паники, но
    132, что действительно требует хороших знаний ядра, чтобы иметь возможность
    133, чтобы выбрать правильные последовательности и т. Д..)
    134
    135 _Иногда_ бывает, что я просто вижу дизассемблированную последовательность кода.
    136 от паники, и я сразу знаю, откуда это. Вот когда
    137 Меня беспокоит, что я слишком долго этим занимаюсь ;-)
    138
    139 Линус
    140
    141
    142 ------------------------------------------------- --------------------------
    143 Замечания по трассировке Oops с помощью klogd:
    144
    145 Чтобы помочь Линусу и другим разработчикам ядра,
    146 существенная поддержка, встроенная в klogd для защиты обработки
    147 неисправностей.Чтобы иметь полную поддержку разрешения адресов хотя бы
    148 версии 1.3-pl3 пакета sysklogd следует использовать.
    149
    150 Когда происходит сбой защиты, демон klogd автоматически
    151 переводит важные адреса в сообщениях журнала ядра в их
    152 символических эквивалента. Это переведенное сообщение ядра затем
    153 пересылается через любой механизм отчетов, который использует klogd. В
    154 сообщение об ошибке защиты можно просто вырезать из файлов сообщений
    155 и передан разработчикам ядра.156
    157 klogd выполняет два типа разрешения адресов. Первый - это
    158 статический перевод, а второй - динамический перевод. Статический
    159 перевод использует файл System.map почти так же, как и
    160 ksymoops делает. Для статического перевода демон klogd
    161 должен быть в состоянии найти файл системной карты во время инициализации демона.
    162 См. Справочную страницу klogd для получения информации о том, как klogd ищет карту.
    163 файла.
    164
    165 Динамическая трансляция адресов важна при загрузке модулей ядра.
    166 используются.Поскольку память для модулей ядра выделяется из
    167 пулов динамической памяти ядра, для них нет фиксированных расположений.
    168 начало модуля или для функций и символов в модуле.
    169
    170 Ядро поддерживает системные вызовы, которые позволяют программе определять
    171, какие модули загружены и их расположение в памяти. Используя эти
    172 системных вызовов, демон klogd создает таблицу символов, которую можно использовать
    173 для отладки сбоя защиты, возникающего в загружаемом модуле ядра.
    174
    175 Как минимум, klogd предоставит имя модуля, который
    176 сгенерировал ошибку защиты.Могут быть дополнительные символические
    177 информация доступна, если разработчик загружаемого модуля решил
    178 экспортировать символьную информацию из модуля.
    179
    180 Поскольку среда модуля ядра может быть динамической, должна быть
    181 механизм уведомления демона klogd при изменении модуля
    182 происходит окружающая среда. Доступны параметры командной строки, которые
    183 разрешить klogd сигнализировать выполняющемуся в данный момент демону, что символ
    184 информацию следует обновить. См. Дополнительную информацию на странице руководства klogd.
    185 информация.186
    187 В дистрибутив sysklogd включен патч, изменяющий
    188 modules-2.0.0 пакет для автоматической сигнализации klogd всякий раз, когда модуль
    189 загружается или разгружается. Применение этого патча существенно
    190 бесшовная поддержка для устранения сбоев защиты, возникающих с
    191 загружаемый модуль ядра.
    192
    193 Ниже приведен пример отказа защиты в загружаемом модуле.
    194 обработано klogd:
    195 ------------------------------------------------- --------------------------
    196 29 августа, 09:51:01 Ядро blizard: не удалось обработать запрос ядра на подкачку по виртуальному адресу f15e97cc
    197 29 августа, 09:51:01 ядро ​​blizard: current-> tss.cr3 = 0062d000,% cr3 = 0062d000
    198 29 августа 09:51:01 ядро ​​blizard: * pde = 00000000
    199 29 августа, 09:51:01 ядро ​​blizard: Ой: 0002
    200 29 августа 09:51:01 ядро ​​blizard: CPU: 0
    201 29 августа, 09:51:01 ядро ​​blizard: EIP: 0010: [ой: _oops + 16/3868]
    202 29 августа 09:51:01 ядро ​​blizard: EFLAGS: 00010212
    203 29 августа, 09:51:01 ядро ​​blizard: eax: 315e97cc ebx: 003a6f80 ecx: 001be77b edx: 00237c0c
    204 29 августа, 09:51:01 ядро ​​blizard: esi: 00000000 edi: bffffdb3 ebp: 00589f90 esp: 00589f8c
    205 29 августа 09:51:01 ядро ​​blizard: ds: 0018 es: 0018 fs: 002b gs: 002b ss: 0018
    206 29 августа, 09:51:01 Ядро blizard: процесс oops_test (pid: 3374, номер процесса: 21, stackpage = 00589000)
    207 29 августа 09:51:01 ядро ​​blizard: Стек: 315e97cc 00589f98 0100b0b4 bffffed4 0012e38e 00240c64 003a6f80 00000001
    208 29 августа 09:51:01 ядро ​​blizard: 00000000 00237810 bfffff00 0010a7fa 00000003 00000001 00000000 bfffff00
    209 29 августа 09:51:01 ядро ​​blizard: bffffdb3 bffffed4 ffffffda 0000002b 0007002b 0000002b 0000002b 00000036
    210 29 августа, 09:51:01 Ядро blizard: Отслеживание вызовов: [oops: _oops_ioctl + 48/80] [_sys_ioctl + 254/272] [_system_call + 82/128]
    211 29 августа 09:51:01 ядро ​​blizard: Код: c7 00 05 00 00 00 eb 08 90 90 90 90 90 90 90 90 89 ec 5d c3
    212 ------------------------------------------------- --------------------------
    213
    214 ДокторG.W. Wettstein Oncology Research Div. Вычислительный центр
    215 Онкологический центр Роджера Мариса ИНТЕРНЕТ: [email protected]
    216 820 4-я улица N.
    217 Fargo, ND 58122
    218 Телефон: 701-234-7556
    219
    220
    221 ------------------------------------------------- --------------------------
    222 Испорченные ядра:
    223
    224 Некоторые отчеты oops содержат строку "Tainted:" после программы.
    225 счетчик. Это указывает на то, что ядро ​​было испорчено некоторыми
    226 механизм. За строкой следует ряд чувствительных к положению
    227 символов, каждый из которых представляет определенное испорченное значение.228
    229 1: 'G', если все загруженные модули имеют лицензию GPL или совместимую, 'P', если
    230 загружен какой-либо фирменный модуль. Модули без
    231 MODULE_LICENSE или с MODULE_LICENSE, который не распознается
    232 insmod, как GPL-совместимый, считаются проприетарными.
    233
    234 2: 'F', если какой-либо модуль был принудительно загружен с помощью insmod -f, '' если все
    235 модулей загрузились нормально.
    236
    237 3: 'S', если ошибка произошла на ядре SMP, работающем на оборудовании, которое
    238 не был сертифицирован как безопасный для работы с несколькими процессорами.239 В настоящее время это происходит только на различных Атлонах, которые не
    Возможность 240 SMP.
    241
    242 4: 'R', если модуль был принудительно выгружен командой "rmmod -f", '' если все
    243 модуля выгружались нормально.
    244
    245 5: 'M', если какой-либо процессор сообщил об исключении проверки машины,
    246 '', если не возникло никаких исключений проверки машины.
    247
    248 6: 'B', если функция выпуска страницы обнаружила неверную ссылку на страницу или
    249 некоторые неожиданные флаги страницы.
    250
    251 7: 'U', если пользователь или пользовательское приложение специально запросили, чтобы
    252 Флаг испорченного должен быть установлен, в противном случае.253
    254 8: 'D', если ядро ​​недавно умерло, т.е. произошла ошибка OOPS или BUG.
    255
    256 9: 'A', если таблица ACPI была переопределена.
    257
    258 10: 'W', если ядро ​​ранее выдало предупреждение.
    259 (Хотя некоторые предупреждения могут устанавливать более конкретные флаги заражения.)
    260
    261 11: 'C', если загружен промежуточный драйвер.
    262
    263 12: 'I', если ядро ​​работает с серьезной ошибкой в ​​платформе
    264 (BIOS или аналогичная).
    265
    266 13: 'O', если был загружен созданный извне ("вне дерева") модуль.267
    268 14: 'E', если неподписанный модуль был загружен в ядро, поддерживающее
    269 ​​подпись модуля.
    270
    271 15: «L», если ранее в системе происходила мягкая блокировка.
    272
    273 16: 'K', если ядро ​​было исправлено в реальном времени.
    274
    275 Основная причина появления строки 'Tainted:' заключается в том, чтобы сообщить ядру
    276 отладчиков, если это чистое ядро ​​или что-то необычное
    277 произошло. Заражение необратимо: даже если вызывающий ошибку модуль
    278 выгружено, испорченное значение остается, чтобы указать, что ядро ​​не
    279 заслуживают доверия.



    • Права на информацию принадлежат ее автору.
    • Все материалы доступны из исходного кода ядра Linux, распространяемого по лицензии GPL.
    • Размещено на mjmwired.net.

    Взаимосвязи в OOPS… — Первое декодирование

    ОТНОШЕНИЯ — это то, что класс или объект знает о другом классе или объекте.



    ОТНОШЕНИЯ

    • Класс
    • Объекты
      • Ассоциация
      • Агрегация
      • Компост



    Обобщение (Class-to-Class) (суперкласс — подкласс; супертип — подтип)

    • Обобщение следует эвристике «является» или «является разновидностью» от класса специализации к классу обобщения.(например, студент — это человек, видео — это своего рода инвентарь).

    • Общие атрибуты, операции и отношения находятся в классе обобщения и наследуются классами специализации

    • Уникальные атрибуты, операции и отношения находятся в классах специализации.

    Ассоциации

    • Взаимоотношения между экземплярами (объектами) классов

    • В ассоциации Объекты существуют независимо.

    • Концептуальный: ассоциации могут иметь две роли (двунаправленные)

    • источник -> цель,

    • цель -> источник


    Агрегация

    • — это специализированная форма АССОЦИАЦИИ, в которой целое связано со своими частями.

    • известен как «часть» или отношения сдерживания и следует эвристике «имеет»

    • три способа думать об агрегатах:

    • целые части

    • контейнер-содержимое

    • члены группы

    Состав

    decode-json — npm

    Пакет, который вы собираетесь использовать, был создан под влиянием Elm lang и, в частности, пакета elm / json.

    Использование TypeScript — отличный способ предотвратить некоторые ошибки во время компиляции, но ничто не может спасти нас от исключений во время выполнения. Сегодня поле «высота», поступающее из конечной точки GET / high-building , представляет собой номер , и вы вызываете .toFixed (2) , чтобы отформатировать его, но на следующий день оно становится предварительно отформатированной строкой , и приложение вылетает с toFixed не является функцией . То же самое может произойти, когда приложение использует localStorage и кто-то изменяет формат для хранения токена учетных данных или последней открытой информации о продукте — значение существует, поэтому вы предполагаете, что оно действительное, но ошибка времени выполнения очень скоро вас огорчит.Звучит знакомо, не правда ли?

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

    Установка

     # с npm
    npm install decode-json --save
    
    # пряжей
    пряжа установить decode-json 
     // со скайпаком
    импортировать Decode, {Decoder} из https://cdn.skypack.dev/decode-json
    import errorToHumanReadable from 'https: // cdn.skypack.dev/decode-json/error-to-human-readable '
    
    // версия мини-поля
    импортировать Decode, {Decoder} из https://cdn.skypack.dev/decode-json?min
    import errorToHumanReadable from 'https://cdn.skypack.dev/decode-json/error-to-human-readable?min' 

    Пример

    Предположим, вы создаете приложение Wep для фанатов «Звездных войн» и хотите запросить данные Люка Скайуокера на сайте swapi.dev/api/people/1. У вас получится что-то вроде этого:

     {
      "name": "Люк Скайуокер",
      "Birth_year": "19BBY",
      "рост": "172",
      "масса": "77"
    } 

    Вот как его можно безопасно декодировать:

     import Decode, {Decoder} из decode-json
    
    const parseFloatDecoder: Decoder  = Decode.один из([
      Decode.float, // если значение уже плавающее
      Decode.string.chain (str => {
        const num = Number (str || '_') // предотвращает Number ('') === 0
    
        if (isNaN (число)) {
          return Decode.fail (`Не удалось разобрать" $ {str} "как число с плавающей точкой`)
        }
    
        return Decode.succeed (число)
      })
    ])
    
    const characterDecoder = Decode.shape ({
      имя: Decode.field ('имя'). строка,
      BirthYear: Decode.field ('Birth_year'). строка,
      высота: Decode.field ('высота'). of (parseFloatDecoder),
      масса: Decode.field ('масса').из (parseFloatDecoder)
    })
    
    const response = ожидание выборки ('https://swapi.dev/api/people/1')
    const data = ожидание ответа.json ()
    const characterResult = characterDecoder.decode (данные) 

    Вышеупомянутый декодер выполняет следующие шаги:

    1. пытается извлечь значение из поля name ответа и проверяет, является ли значение строкой
    2. пытается извлечь значение из поля Birth_year ответа и проверяет, является ли значение строкой
    3. пытается извлечь значение из поля height ответа и анализирует значение как число с плавающей запятой
    4. пытается извлечь значение из поля mass ответа и анализирует значение как число с плавающей запятой
    5. создает выходной объект с полем , именем , год рождения , высотой и массой со значениями, присвоенными соответственно.

    Если ответ отражает наши ожидания, то результаты для swapi.dev/api/people/1 будут выглядеть так:

     characterDecoder.decode (данные)
    // == {
    //   значение: {
    // имя: 'Люк Скайуокер',
    // год рождения: '19BBY',
    // высота: 172,
    // масса: 77
    //}
    //} 

    Но как только один из шагов 1-4 не сработает, вы получите подробный отчет, почему это произошло. Допустим, сервер по какой-то причине отправляет высоту рождения в виде форматированной строки с единицей измерения. Вот что вы получите, когда "172" строка станет "172 см" :

     characterDecoder.декодировать (данные)
    // == {
    //   ошибка: {
    // тип: 'IN_FIELD',
    // поле: 'высота',
    //     ошибка: {
    // тип: 'FAILURE',
    // сообщение: 'Не удалось разобрать «172 см» как число с плавающей запятой »,
    // источник: '172 см'
    //}
    //}
    //} 

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

    API

    DecodeResult

    Это то, что вы всегда получаете в результате выполнения обоих методов Decoder.decode и Decoder.decodeJson . Это может быть {значение: T} , если декодирование было успешно выполнено, или {ошибка: E} , если происходит какая-либо ошибка декодирования, разбора json или ошибки выполнения.

     импорт Decode, {Decoder, DecodeResult, DecodeError} из decode-json
    
    const ageDecoder: Decoder  = Decode.поле ('возраст'). int
    const badResult = ageDecoder.decode ('ой')
    // == {ошибка: {type: 'EXPECT_OBJECT', источник: 'oops'}}
    const goodResult = ageDecoder.decode ({age: 27}) // == {значение: 27} 

    Рекомендуется избегать назначения деструктуризации для DecodeResult , потому что TypeScript не поможет вам с обработкой ошибок:

     const {ошибка, значение} = ageDecoder.decode ({age: 27})
    
    if (error) {
      showError (ошибка)
    } еще {
      showAge (value) // TS жалуется: «Возможно, объект 'undefined'»
    } 

    Чтобы обойти проблему, просто не используйте назначение деструктуризации:

     const ageResult = ageDecoder.декодировать ({age: 27})
    
    if (ageResult.error) {
      showError (ageResult.error)
    } еще {
      showAge (ageResult.value) // здесь жалоб нет
    } 

    Декодер

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

     import Decode, {Decoder} из decode-json
    
    interface User {
      id: строка
      ник: строка
      активный: логический
      возраст: число
    }
    
    const userDecoder: Decoder <Пользователь> = Decode.shape ({
      id: декодировать.поле ('uuid'). строка,
      ник: Decode.field ('имя пользователя'). строка,
      активный: Decode.field ('is_active'). boolean,
      возраст: Decode.field ('возраст'). int
    }) 
    Decoder.map

    Преобразует декодированное значение. Он может как сохранить тот же тип, так и перейти на другой:

     import Decode, {Decoder} из decode-json
    
    const messageDecoder: Decoder  = Decode.string.map (message =>
      message.trim ()
    )
    const charCountDecoder: Decoder  = Decode.string.карта(
      сообщение => message.trim (). length
    ) 
    Decoder.chain

    Преобразует декодированное значение:

     import Decode, {Decoder} из decode-json
    
    const displayDateDecoder: Decoder  = Decode.field (
      'активный'
    ) .boolean.chain (active => {
      вернуться активным
        ? Decode.field ('last_activity'). Строка
        : Decode.field ('начальная_дата'). Строка
    })
    
    displayDateDecoder.decode ({
      активный: ложь,
      last_activity: '30 секунд назад',
      start_date: «1 сен 2020»
    }).value // == '1 сен 2020'
    
    displayDateDecoder.decode ({
      active: true,
      last_activity: '30 секунд назад',
      start_date: «1 сен 2020»
    }). value // == '30 секунд назад '
    Decoder.decode

    Запускает декодер на неизвестных входных данных:

     импорт декодирования из decode-json
    
    Decode.boolean.decode ('Я неизвестен ввод'). Error
    // == {type: 'EXPECT_BOOLEAN', source: 'I am unknown input'}
    
    Decode.boolean.decode (false) .value // == false 
    Decoder.decodeJson

    Запускает декодер строки JSON.Выполняет то же самое, что Decoder.decode , но сначала анализирует JSON:

     импорт декодирования из decode-json
    
    Decode.string.decodeJson ('Я просто строка'). Error
    // == {
    // тип: 'INVALID_JSON',
    // ошибка: новый SyntaxError ('Неожиданный токен I в JSON в позиции 0'),
    // источник: 'Я всего лишь строка'
    //}
    
    const goodJson = Decode.string.decodeJson ('"Я - строка JSON"'). value
    // == 'Я строка JSON' 

    Decode.string

    Расшифровывает строковое значение:

     импорт декодирования из decode-json
    
    Расшифровать.string.decode (null) .error // == {тип: 'EXPECT_STRING', источник: null}
    Decode.string.decode (true) .error // == {тип: 'EXPECT_STRING', источник: true}
    Decode.string.decode (1234) .error // == {тип: 'EXPECT_STRING', источник: 1234}
    Decode.string.decode (12.3) .error // == {тип: 'EXPECT_STRING', источник: 12.3}
    Decode.string.decode ('привет'). Значение // == 'привет' 

    Decode.boolean

    Расшифровывает логическое значение:

     импорт декодирования из decode-json
    
    Decode.boolean.decode (ноль).ошибка // == {тип: 'EXPECT_BOOLEAN', источник: null}
    Decode.boolean.decode (1234) .error // == {тип: 'EXPECT_BOOLEAN', источник: 1234}
    Decode.boolean.decode (12.3) .error // == {тип: 'EXPECT_BOOLEAN', источник: 12.3}
    Decode.boolean.decode ('hi'). Error // == {type: 'EXPECT_BOOLEAN', source: 'hi'}
    Decode.boolean.decode (true) .value // true 

    Decode.int

    Расшифровывает целочисленное значение:

     импорт декодирования из decode-json
    
    Decode.int.decode (null) .error // == {тип: 'EXPECT_INT', источник: null}
    Расшифровать.int.decode (true) .error // == {тип: 'EXPECT_INT', источник: true}
    Decode.int.decode ('привет'). Ошибка // == {тип: 'EXPECT_INT', источник: 'привет'}
    Decode.int.decode (12.3) .error // == {тип: 'EXPECT_INT', источник: 12.3}
    Decode.int.decode (1234) .value // 1234 

    Decode.float

    Расшифровывает значение с плавающей запятой:

     импорт декодирования из decode-json
    
    Decode.float.decode (null) .error // == {тип: 'EXPECT_FLOAT', источник: null}
    Decode.float.decode (true) .error // == {type: 'EXPECT_FLOAT', source: true}
    Расшифровать.float.decode ('привет'). ошибка // == {тип: 'EXPECT_FLOAT', источник: 'привет'}
    Decode.float.decode (12.3) .value // 12.3
    Decode.float.decode (1234) .value // 1234 

    Decode.unknown

    Ничего не делает с входящим значением, просто заносит его в TS как неизвестное. Это может быть полезно, если у вас есть особенно сложные данные, с которыми вы хотели бы иметь дело позже. Или если вы собираетесь отправить ему HTTP-запрос и не заботитесь о его структуре. Расшифровка неизвестного никогда не подводит.

     импорт декодирования из decode-json
    
    Decode.unknown.decode (window.location) .value // == window.location 

    Decode.exact

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

     импорт декодирования из decode-json
    
    const pointDecoder = Decode.shape ({
      тип: Decode.field ('тип'). точный ('ТОЧКА'),
      x: Decode.field ('axis_x'). float,
      y: Decode.field ('axis_y'). float
    })
    
    pointDecoder.декодировать ({
      тип: 'ЛИНИЯ',
      х0: 1,2,
      y0: 3,4,
      х1: 5,6,
      x1: 7,8
    }).ошибка
    // == {
    // тип: 'IN_FIELD',
    // имя: 'тип',
    //   ошибка: {
    // тип: 'EXPECT_EXACT',
    // значение: 'ТОЧКА',
    // источник: 'СТРОКА'
    //}
    //} 

    Может использоваться с Decode.oneOf для построения декодеров перечисления:

     import Decode, {Decoder} из decode-json
    
    enum Role {
      Пользователь,
      Менеджер,
      Админ
    }
    
    const roleDecoder: Decoder  = Decode.oneOf ([
      Decode.exact ('ПОЛЬЗОВАТЕЛЬ', Роль.Пользователь),
      Расшифровать.точное ('МЕНЕДЖЕР', Роль.Менеджер),
      Decode.exact ('АДМИНИСТРАТОР', Role.Admin)
    ]) 

    Декод. Запись

    Декодирует пары «ключ-значение» как объект:

     import Decode, {Decoder} из decode-json
    
    const activeUsers: Decoder > = Decode.record (
      Decode.boolean
    )
    
    activeUsers.decode ({
      Джон: ложь,
      Мартин: ложь,
      Скотт: правда
    }). value // == {Джон: false, Мартин: false, Скотт: true}
    
    activeUsers.decode ({
      Джон: ложь,
      Мартин: ложь,
      Скотт: да
    }).ошибка
    // == {
    // тип: 'IN_FIELD',
    // имя: 'Скотт',
    //   ошибка: {
    // тип: 'EXPECT_BOOLEAN',
    // источник: 'да'
    //}
    //} 

    Decode.list

    Расшифровывает список значений:

     import Decode, {Decoder} из decode-json
    
    interface User {
      идентификационный номер
      имя пользователя: строка
    }
    
    const userDecoder: Decoder <Пользователь> = Decode.shape ({
      id: Decode.field ('id'). int,
      имя пользователя: Decode.field ('имя_пользователя'). строка
    })
    
    Decode.list (userDecoder) .decode ([
      {
        id: 0,
        имя_пользователя: 'суперзвезда'
      },
      {
        id: 1,
        имя_пользователя: 'босс'
      }
    ]).значение // == [{id: 0, имя пользователя: 'superstar'}, {id: 1, имя пользователя: 'босс'}]
    
    Decode.list (userDecoder) .decode ([
      {
        id: 0,
        имя_пользователя: 'lollypop'
      },
      {
        id: 1,
        имя: 'босс'
      }
    ]).ошибка
    // == {
    // тип: 'AT_INDEX',
    // позиция: 1,
    //   ошибка: {
    // тип: 'REQUIRED_FIELD',
    // имя: 'user_name',
    //     источник: {
    // id: 1,
    // имя: 'босс'
    //}
    //}
    //} 

    Decode.keyValue

    Декодирует пары ключ-значение как список кортежей:

     import Decode, {Decoder} из decode-json
    
    const activeUsers: Decoder > = Декодировать.keyValue (
      Decode.boolean
    )
    
    activeUsers.decode ({
      Джон: ложь,
      Мартин: ложь,
      Скотт: правда
    }). value // == [['John', false], ['Martin', false], ['Scott', true]]
    
    activeUsers.decode ({
      Джон: ложь,
      Мартин: ложь,
      Скотт: да
    }).ошибка
    // == {
    // тип: 'IN_FIELD',
    // имя: 'Скотт',
    //   ошибка: {
    // тип: 'EXPECT_BOOLEAN',
    // источник: 'да'
    //}
    //} 

    Вы также безопасно конвертируете значение ключа из строки в другое:

     import Decode, {Decoder} из decode-json
    
    enum Currency {
      Тереть,
      Евро,
      Доллар США
    }
    
    const currencyFromCode = (код: строка): Currency => {
      switch (code) {
        case 'rub':
          return {value: Currency.Тереть }
        case 'eur':
          return {value: Currency.Eur}
        case 'usd':
          return {значение: Currency.Usd}
        По умолчанию: {
          ошибка: `Неизвестный код валюты" $ {code} "`
        }
      }
    }
    
    const balance: Decoder > = Decode.keyValue (
      currencyFromCode,
      Decode.float
    )
    
    activeUsers.decode ({
      руб: 42000,1,
      eur: 2400,87,
      доллар США: 13000.51
    }).значение
    // == [
    // [Currency.Rub ', 42000.1],
    // [Currency.Eur, 2400,87],
    // [Currency.Usd, 13000.51]
    //]
    
    activeUsers.декодировать ({
      руб: 42000,1,
      eur: 2400,87,
      доллар США: 13000,51,
      cny: 7912.08
    }).ошибка
    // == {
    // тип: 'FAILURE',
    // сообщение: 'Неизвестный код валюты "cny"'
    // источник: 'cny'
    //} 

    Декод. Запись

    Объединяет декодированные значения с соответствующими полями объекта:

     import Decode, {Decoder} из decode-json
    
    interface User {
      id: строка
      ник: строка
      активный: логический
      возраст: число
    }
    
    const userDecoder: Decoder <Пользователь> = Decode.shape ({
      id: декодировать.поле ('uuid'). строка,
      ник: Decode.field ('имя пользователя'). строка,
      активный: Decode.field ('is_active'). boolean,
      возраст: Decode.field ('возраст'). int
    })
    
    userDecoder.decode ({
      uuid: 'user_12319238',
      имя пользователя: 'wolverine',
      is_active: ложь,
      возраст: 61
    }).значение
    // == {
    // id: 'user_12319238',
    // ник: 'wolverine',
    // активно: ложь,
    // возраст: 61
    //}
    
    userDecoder.decode ({
      uuid: 'user_12319238',
      имя пользователя: 'wolverine',
      is_active: 'да',
      возраст: 61
    }).ошибка
    // == {
    // тип: 'IN_FIELD',
    // поле: 'is_active',
    //   ошибка: {
    // тип: 'EXPECT_BOOLEAN',
    // источник: 'да'
    //}
    //} 

    Примечание : Декод.запись не декодирует никакого значения! Он только объединяет значения других декодеров.

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

    Decode.tuple

    Объединяет декодированные значения с соответствующими сегментами кортежа:

     import Decode, {Decoder} из decode-json
    
    const pointDecoder: Декодер <[число, число]> = Декодировать.кортеж (
      Decode.field ('x'). Float,
      Decode.field ('y'). Float
    )
    
    pointDecoder.decode ({
      х: 12,34,
      y: 56.78
    }). значение // == [12.34, 56.78]
    
    pointDecoder.decode ({
      х: 12,34,
      y: '56 .78 '
    }).ошибка
    // == {
    // тип: 'IN_FIELD',
    // поле: 'y',
    //   ошибка: {
    // тип: 'EXPECT_FLOAT',
    // источник: '56 .78 '
    //}
    //} 

    Примечание : Decode.tuple не декодирует какое-либо значение! Он только объединяет значения других декодеров.

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

    Decode.oneOf

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

     import Decode, {Decoder} из decode-json
    
    const dateDecoder: Decoder  = Decode.oneOf ([
      Decode.int.map (timestamp => новая дата (временная метка)),
      Decode.string.chain (datetime => {
        const date = новая дата (datetime)
    
        if (isNaN (date.getMilliseconds ())) {
          return Decode.fail (`Не удалось создать дату из" $ {datetime} "`)
        }
    
        вернуть Decode.успешно (дата)
      })
    ])
    
    dateDecoder.decode (1609542413856) .value // == новая дата ('Пт, 01 января 2021 г., 23:06:53 GMT')
    dateDecoder.decode ('Пт, 01 января 2021 г., 23:06:53 GMT'). value // == новая дата (1609542413856)
    dateDecoder.decode ('01 | 01 | 2021 '). ошибка
    // == {
    // тип: 'ONE_OF',
    // ошибки: [
    // {
    // тип: 'EXPECT_INT',
    // источник: '01 | 01 | 2021 '
    //},
    // {
    // тип: 'FAILURE',
    // message: 'Не удалось создать дату с "01 | 01 | 2021"',
    // источник: '01 | 01 | 2021 '
    //}
    //]
    //} 

    Это мощный инструмент для работы с противоречивыми данными:

     import Decode, {Decoder} из decode-json
    
    interface User {
      id: строка
      ник: строка
      активный: логический
      возраст: число
    }
    
    const userDecoder: Декодер <Пользователь> = Декодер.один из([
      // устаревшая версия
      Decode.shape ({
        id: Decode.field ('index'). int.map (String),
        псевдоним: Decode.field ('name'). string,
        активный: Decode.field ('is_active'). boolean,
        возраст: Decode.field ('years'). int
      }),
    
      // Последняя версия
      Decode.shape ({
        id: Decode.field ('uuid'). строка,
        ник: Decode.field ('имя пользователя'). строка,
        активный: Decode.field ('isActive'). логический,
        возраст: Decode.field ('возраст'). int
      })
    ])
    
    userDecoder.decode ({
      индекс: 0,
      имя: 'Рэйчел',
      is_active: true,
      лет: 30
    }).значение
    // == {
    // id: '0',
    // ник: 'Рэйчел',
    // active: true,
    // возраст: 30
    //}
    
    userDecoder.decode ({
      uuid: 'uuid-id-is-здесь',
      имя пользователя: 'Росс',
      isActive: правда,
      возраст: 32
    }).значение
    // == {
    // id: 'uuid-id-is-here',
    // ник: 'Росс',
    // active: true,
    // возраст: 32 года
    //} 

    Его также можно использовать для установки значения по умолчанию, если все декодеры не работают по какой-либо причине:

     импорт декодирования из decode-json
    
    const configDecoder = Decode.oneOf ([
      Decode.shape ({
        hostUrl: декодировать.поле ('HOST_URL'). строка,
        apiVersion: Decode.field ('API_VERSION'). int
      }),
    
      Decode.succeed ({
        hostUrl: 'локальный: 8000',
        apiVersion: 1
      })
    ])
    
    configDecoder.decode (нуль) .value
    // == {
    // hostUrl: 'localhost: 8000',
    // apiVersion: 1
    //} 

    Декодировать. Ленивый

    Иногда у вас есть рекурсивные структуры данных, такие как комментарии с ответами, которые также являются комментариями с ответами, что тоже … вы поняли. Чтобы декодер разворачивался лениво, он должен использовать Decode.ленивая оболочка :

     import Decode, {Decoder} из decode-json
    
    interface Comment {
      сообщение: строка
      ответы: Массив <Комментарий>
    }
    
    const commentDecoder: Decoder  = Decode.shape ({
      сообщение: Decode.field ('mes'). string,
      ответы: Decode.field ('res'). list (Decode.lazy (() => commentDecoder))
    })
    
    commentDecoder.decode ({
      mes: 'ой',
      res: [
        {
          mes: 'да',
          res: [
            {
              mes: 'вот и мы снова',
              res: []
            }
          ]
        },
        {
          mes: 'нет',
          res: [
            {
              mes: 'это правильно',
              res: [
                {
                  mes: 'согласен',
                  res: []
                }
              ]
            }
          ]
        }
      ]
    }).значение
    // == {
    // сообщение: 'ой',
    // ответы: [
    // {
    // сообщение: 'да',
    // ответы: [
    // {
    // сообщение: 'вот и мы снова',
    // ответы: []
    //}
    //]
    //},
    // {
    // сообщение: 'нет',
    // ответы: [
    // {
    // сообщение: 'это правильно',
    // ответы: [
    // {
    // сообщение: 'согласен',
    // ответы: []
    //}
    //]
    //}
    //]
    //}
    //]
    //} 

    Декодировать.сбой

    Игнорирует значение декодирования и вызывает сбой декодера. Это удобно при использовании с Decode.oneOf или Decoder.chain , где в некоторых случаях вы хотите выдать настраиваемое сообщение об ошибке.

     import Decode, {Decoder} из decode-json
    
    const positiveIntDecoder: Decoder  = Decode.int.chain (int => {
      if (int> 0) {
        вернуть Decode.succeed (int)
      }
    
      return Decode.fail (`Ожидает положительное int, но вместо этого получает $ {int} ')
    })
    
    PositiveIntDecoder.decode (42) .value // == 42
    
    PositiveIntDecoder.decode (-1) .error
    // == {
    // тип: 'FAILURE',
    // message: 'Ожидает положительного int, но вместо этого получает -1',
    // источник: -1
    //} 

    Примечание : дополнительные примеры см. В Decode.oneOf и Decoder.chain .

    Decode.succeed

    Игнорирует значение декодирования и выдает определенное значение. Удобно при использовании с Decode.oneOf или Decoder.chain .

     import Decode, {Decoder} из decode-json
    
    const messageDecoder: Декодер <строка> = Декодер.string.chain (message => {
      if (message.length> = 10) {
        return Decode.succeed (сообщение)
      }
    
      вернуть Decode.fail (
        `Входное сообщение состоит всего из $ {message.length} символов, но требуется как минимум 10`
      )
    })
    
    messageDecoder.decode ('Довольно длинное сообщение'). value // == 'Довольно длинное сообщение'
    messageDecoder.decode ('Short'). error
    // == Входное сообщение состоит всего из 5 символов, но требуется как минимум 10
    messageDecoder.decode (123) .error // == {type: 'EXPECT_STRING', источник: 123} 

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

     import Decode, {Decoder} из decode-json
    
    const pointDecoder = Decoder.shape ({
      x: Decode.index (0) .float,
      y: Decode.index (1) .float,
      z: Decode.succeed (0)
    })
    
    pointDecoder.decode ([0.31, 8.17]). value // == {x: 0.31, y: 8.17, z: 0} 

    Примечание : дополнительные примеры см. В Decode.oneOf и Decoder.chain .

    Поле декодирования

    Создает экземпляр RequiredDecodePath .

     import Decode, {RequiredDecodePath} из decode-json
    
    const currentUserPath: RequiredDecodePath = Декодировать.поле ('current_user') 

    Decode.index

    Создает экземпляр RequiredDecodePath .

     import Decode, {RequiredDecodePath} из decode-json
    
    const secondPointPath: RequiredDecodePath = Decode.index (1) 

    Decode. Опционально

    Создает DecodeOptional экземпляр.

    DecodeOptional.string

    Действует точно так же, как Decode.string , но декодирует null и undefined как null :

     импорт декодирования из decode-json
    
    Расшифровать.optional.string.decode (1234) .error
    // == {
    // тип: 'ДОПОЛНИТЕЛЬНО',
    // ошибка: {тип: 'EXPECT_STRING', источник: 1234}
    //}
    Decode.optional.string.decode (null) .value // == null
    Decode.optional.string.decode (undefined) .value // == null
    Decode.optional.string.decode ('привет'). Значение // == 'привет' 

    DecodeOptional.boolean

    Действует точно так же, как Decode.boolean , но декодирует null и undefined как null :

     импорт декодирования из decode-json
    
    Расшифровать.optional.boolean.decode (1234) .error
    // == {
    // тип: 'ДОПОЛНИТЕЛЬНО',
    // ошибка: {тип: 'EXPECT_BOOLEAN', источник: 1234}
    //}
    Decode.optional.boolean.decode (null) .value // == null
    Decode.optional.boolean.decode (undefined) .value // == null
    Decode.optional.boolean.decode (true) .value // == true 

    DecodeOptional.int

    Действует точно так же, как Decode.int , но декодирует null и undefined как null :

     импорт декодирования из decode-json
    
    Расшифровать.optional.int.decode (12.3) .error
    // == {
    // тип: 'ДОПОЛНИТЕЛЬНО',
    // ошибка: {тип: 'EXPECT_INT', источник: 12.3}
    //}
    Decode.optional.int.decode (null) .value // == null
    Decode.optional.int.decode (undefined) .value // == null
    Decode.optional.int.decode (1234) .value // == 1234 

    DecodeOptional.float

    Действует точно так же, как Decode.float , но декодирует null и undefined как null :

     импорт декодирования из decode-json
    
    Расшифровать.optional.float.decode (ложь) .error
    // == {
    // тип: 'ДОПОЛНИТЕЛЬНО',
    // ошибка: {тип: 'EXPECT_FLOAT', источник: false}
    //}
    Decode.optional.float.decode (null) .value // == null
    Decode.optional.float.decode (undefined) .value // == null
    Decode.optional.float.decode (12.3) .value // == 12.3 

    DecodeOptional.list

    Действует точно так же, как Decode.list , но декодирует null и undefined как null :

     import Decode, {Decoder} из decode-json
    
    const idsDecoder: Decoder > = Декодировать.optional.list (
      Decode.int
    )
    
    idsDecoder.decode (null) .value // == null
    idsDecoder.decode (undefined) .value // == null
    idsDecoder.decode ([0, 2, 3]). значение // == [0, 2, 3] 

    Обратите внимание, что необязательный оператор здесь назначен декодеру списка , но не его элементам, поэтому этот оператор завершится ошибкой:

     idsDecoder.decode ([0, null, 2, 3]). Ошибка
    {
      тип: 'ДОПОЛНИТЕЛЬНО',
      ошибка: {
        тип: 'AT_INDEX',
        позиция: 1,
        ошибка: {тип: 'EXPECT_INT', источник: null}
      }
    } 

    Если вы ожидаете, что и массив, и элементы будут необязательными, вы можете сделать это так:

     import Decode, {Decoder} из decode-json
    
    const idsDecoder: Decoder > = Декодировать.optional.list (
      Decode.optional.int
    )
    
    idsDecoder.decode (null) .value // === null
    idsDecoder.decode ([0, null, 2, 3]). значение // === [0, null, 2, 3] 

    DecodeOptional.запись

    Действует точно так же, как Decode.record , но декодирует null и undefined как null :

     import Decode, {Decoder} из decode-json
    
    const blackListDecoder: Decoder > = Декодировать. Необязательно.запись (Decode.boolean)
    
    blackListDecoder.decode (null) .value // == null
    blackListDecoder.decode (undefined) .value // == null
    blackListDecoder.decode ({
      Джон: ложь,
      Эмма: правда,
      Том: правда
    }).значение
    // == {
    // Джон: ложь,
    // Эмма: правда,
    // Том: правда
    //} 

    Обратите внимание, что необязательный оператор здесь назначен декодеру записи , но не его элементам, поэтому этот оператор завершится ошибкой:

     blackListDecoder.decode ({
      Джон: ложь,
      Эмма: правда,
      Том: правда,
      Адам: ноль
    }).ошибка
    // == {
    // тип: 'ДОПОЛНИТЕЛЬНО',
    //   ошибка: {
    // тип: 'IN_FIELD',
    // имя: 'Адам',
    // ошибка: {тип: 'EXPECT_BOOLEAN', источник: null}
    //}
    //} 

    Если вы ожидаете, что и объект, и элементы будут необязательными, вы можете сделать это так:

     import Decode, {Decoder} из decode-json
    
    const blackListDecoder: Decoder > = Decode.optional.record (Decode.boolean)
    
    blackListDecoder.decode (null) .value // === null
    blackListDecoder.декодировать ({
      Джон: ложь,
      Эмма: правда,
      Том: правда,
      Адам: ноль
    }).значение
    // == {
    // Джон: ложь,
    // Эмма: правда,
    // Том: правда,
    // Адам: ноль
    //} 

    DecodeOptional.keyValue

    Действует точно так же, как Decode.keyValue , но декодирует null и undefined как null :

     import Decode, {Decoder} из decode-json
    
    const blackListDecoder: Decoder > = Декодировать.optional.keyValue (Decode.boolean)
    
    blackListDecoder.decode (null) .value // == null
    blackListDecoder.decode (undefined) .value // == null
    blackListDecoder.decode ({
      Джон: ложь,
      Эмма: правда,
      Том: правда
    }).значение
    // == [
    // ['John', ложь],
    // ['Эмма', правда],
    // ['Том', правда]
    //] 

    Обратите внимание, что необязательный оператор здесь назначен декодеру keyValue , но не его элементам, поэтому этот оператор завершится ошибкой:

     blackListDecoder.decode ({
      Джон: ложь,
      Эмма: правда,
      Том: правда,
      Адам: ноль
    }).ошибка
    // == {
    // тип: 'ДОПОЛНИТЕЛЬНО',
    //   ошибка: {
    // тип: 'IN_FIELD',
    // имя: 'Адам',
    // ошибка: {тип: 'EXPECT_BOOLEAN', источник: null}
    //}
    //} 

    Если вы ожидаете, что и объект, и элементы будут необязательными, вы можете сделать это так:

     import Decode, {Decoder} из decode-json
    
    const blackListDecoder: Decoder > = Decode.optional.keyValue (Decode.optional.boolean)
    
    blackListDecoder.decode (null) .value // === null
    blackListDecoder.декодировать ({
      Джон: ложь,
      Эмма: правда,
      Том: правда,
      Адам: ноль
    }).значение
    // == [
    // ['John', ложь],
    // ['Эмма', правда],
    // ['Том', правда],
    // ['Адам', ноль]
    //] 

    DecodeOptional.field

    Создает экземпляр OptionalDecodePath .

     импорт Decode, {OptionalDecodePath} из decode-json
    
    const nameFieldDecoder: OptionalDecodePath = Decode.optional.field ('имя') 

    DecodeOptional.index

    Создает экземпляр OptionalDecodePath .

     импорт Decode, {OptionalDecodePath} из decode-json
    
    const headDecoder: OptionalDecodePath = Decode.optional.index (0) 

    Обязательно

    Он предоставляет API для создания декодеров для определенного пути, описанного в Decoder.field и Decoder.index :

     импорт декодирования из decode-json
    
    const pointDecoder = Decode.tuple (
      Decode.field ('x'). Float,
      Decode.field ('y'). Float
    )
    
    Decode.field ('центр'). Of (pointDecoder).декодировать ([1, 2, 3]). ошибка
    // == {
    // тип: 'EXPECT_OBJECT',
    // источник: [1, 2, 3]
    //}
    
    Decode.field ('center'). Of (pointDecoder) .decode ({name: 'John'}). Error
    // == {
    // тип: 'REQUIRED_FIELD',
    // имя: 'центр',
    // источник: {имя: 'Джон'}
    //}
    
    Decode.field ('центр')
      .of (pointDecoder)
      .decode ({
        центр: {x: 1.2}
      }).ошибка
    // == {
    // тип: 'IN_FIELD',
    // имя: 'центр',
    //   ошибка: {
    // тип: 'REQUIRED_FIELD',
    // имя: 'y',
    // источник: {x: 1.2}
    //}
    //}
    
    Расшифровать.поле ('центр')
      .of (pointDecoder)
      .decode ({
        центр: {x: 1.2, y: 3.4}
      }). значение // == [1.2, 3.4] 

    Та же идея работает для RequiredDecodePath.index :

     импорт декодирования из decode-json
    
    Decode.index (0) .int.decode ({}). Error
    // == {
    // тип: 'EXPECT_ARRAY',
    //   источник: {}
    //}
    
    Decode.index (0) .int.decode ([]). Error
    // == {
    // тип: 'REQUIRED_INDEX',
    // позиция: 0,
    //   источник: []
    //}
    
    Decode.index (0) .int.decode ([null]). Ошибка
    // == {
    // тип: 'AT_INDEX',
    // позиция: 0,
    // ошибка: {тип: 'EXPECT_INT', источник: null}
    //}
    
    Расшифровать.index (0) .int.decode ([42]). value // == 42 

    OptionalDecodePath

    Он предоставляет API для создания декодеров для определенного пути, описанного в DecodeOptional.field и DecodeOptional.index :

     импорт декодирования из decode-json
    
    const pointDecoder = Decode.tuple (
      Decode.field ('x'). Float,
      Decode.field ('y'). Float
    )
    
    Decode.optional
      .field ('центр')
      .of (pointDecoder)
      .decode ({
        центр: {x: 1.2}
      }).ошибка
    // == {
    // тип: 'ДОПОЛНИТЕЛЬНО',
    //   ошибка: {
    // тип: 'IN_FIELD',
    // имя: 'центр',
    //     ошибка: {
    // тип: 'REQUIRED_FIELD',
    // имя: 'y',
    // источник: {x: 1.2}
    //}
    //}
    //}
    
    Decode.optional
      .field ('центр')
      .of (pointDecoder)
      .decode ({
        центр: {x: 1.2, y: 3.4}
      }). значение // == [1.2, 3.4] 

    Обратите внимание, что необязательный оператор здесь назначен .field или .index , поэтому этот оператор завершится ошибкой:

     импорт декодирования из decode-json
    
    Decode.optional.field ('name'). String.decode ({name: null}). Ошибка
    {
      тип: 'ДОПОЛНИТЕЛЬНО',
      ошибка: {
        тип: 'IN_FIELD',
        name: 'имя',
        ошибка: {тип: 'EXPECT_STRING', источник: null}
      }
    } 

    Но не для этих входов:

     импорт декодирования из decode-json
    
    Расшифровать.optional.field ('имя'). string.decode (null) .value // == null
    Decode.optional.field ('name'). String.decode ({}). Value // == null
    Decode.optional.field ('name'). String.decode ({name: 'Peter'}). Value // == 'Peter' 

    Другими словами, OptionalDecodePath.field ожидает, что объект с полем является необязательным, но не является значением поля. Если вы ожидаете, что значение также является необязательным, вы делаете:

     импорт декодирования из decode-json
    
    Decode.optional.field ('имя'). Optional.string.decode ({name: null}).значение // == null 

    Та же идея работает для OptionalDecodePath.index :

     импорт декодирования из decode-json
    
    Decode.optional.index (0) .int.decode (null) .value // == null
    Decode.optional.index (0) .int.decode ([]). Value // == null
    Decode.optional.index (0) .int.decode ([42]). Value // == 42
    Decode.optional.index (0) .int.decode ([null]). Ошибка
    // == {
    // тип: 'ДОПОЛНИТЕЛЬНО',
    //   ошибка: {
    // тип: 'AT_INDEX',
    // позиция: 0,
    // ошибка: {тип: 'EXPECT_INT', источник: null}
    //}
    //}
    
    Расшифровать.optional.index (0) .optional.int.decode ([null]). value // == null 

    DecodeError

    Набор ошибок описывает, что пошло не так во время декодирования неизвестного значения с помощью Decoder.decode . Ошибка состоит из простых типов данных JavaScript, таких как строки, числа, объекты и массивы, поэтому ее можно преобразовать в JSON без каких-либо потерь информации. Это может быть полезно для отправки в инструменты отслеживания как часть отчета или для отображения удобного сообщения в пользовательском интерфейсе с ошибкой , удобочитаемой для человека.TS . Вы всегда можете создать свои собственные функции для форматирования ошибок.

    EXPECT_STRING

    Подпись:

     // не экспортируется
    type ExpectStringError = {
      тип: 'EXPECT_STRING'
      источник: неизвестно
    } 

    Происходит, когда источник не проходит проверку на то, чтобы быть строкой:

     импорт декодирования из decode-json
    
    Decode.string.decode (123) .error
    // == {
    // тип: 'EXPECT_STRING',
    // источник: 123
    //} 
    EXPECT_BOOLEAN

    Подпись:

     // не экспортируется
    type ExpectBooleanError = {
      тип: 'EXPECT_BOOLEAN'
      источник: неизвестно
    } 

    Происходит, когда источник не проходит проверку на логическое значение:

     импорт декодирования из decode-json
    
    Расшифровать.string.decode ('Я строка'). error
    // == {
    // тип: 'EXPECT_BOOLEAN',
    // источник: 'Я строка'
    //} 
    EXPECT_FLOAT

    Подпись:

     // не экспортируется
    type ExpectFloatError = {
      тип: 'EXPECT_FLOAT'
      источник: неизвестно
    } 

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

     импорт декодирования из decode-json
    
    Decode.int.decode (ложь) .error
    // == {
    // тип: 'EXPECT_FLOAT',
    // источник: ложь
    //} 
    EXPECT_INT

    Подпись:

     // не экспортируется
    type ExpectIntError = {
      тип: 'EXPECT_INT'
      источник: неизвестно
    } 

    Происходит, когда источник не проходит проверку на целое число:

     импорт декодирования из decode-json
    
    Расшифровать.int.decode (12.3) .error
    // == {
    // тип: 'EXPECT_INT',
    // источник: 12.3
    //} 
    EXPECT_EXACT

    Подпись:

     // не экспортируется
    type ExpectExactError = {
      тип: 'EXPECT_EXACT'
      значение: строка | номер | логическое | ноль
      источник: неизвестно
    } 

    Возникает, когда источник не равен значению :

     импорт декодирования из decode-json
    
    Decode.exact ('ADMIN'). Decode ('admin'). Error
    // == {
    // тип: 'EXPECT_EXACT',
    // значение: 'ADMIN',
    // источник: 'админ'
    //}
    
    const theWorstYear = новая дата (2020, 0, 1)
    
    Расшифровать.точный (2020, худший год) .decode (2021) .error
    // == {
    // тип: 'EXPECT_EXACT',
    // значение: 2020,
    // источник: 2021 г.
    //} 
    EXPECT_ARRAY

    Подпись:

     // не экспортируется
    type ExpectArrayError = {
      тип: 'EXPECT_ARRAY'
      источник: неизвестно
    } 

    Происходит, когда источник не проходит проверку на массив:

     импорт декодирования из decode-json
    
    Decode.list (Decode.int) .decode ({title: 'NY Times'}). Ошибка
    // == {
    // тип: 'EXPECT_ARRAY',
    // источник: {title: 'NY Times'}
    //}
    
    Расшифровать.index (2) .boolean.decode ({name: 'Boris'}). error
    // == {
    // тип: 'EXPECT_ARRAY',
    // источник: {имя: 'Борис'}
    //} 
    EXPECT_OBJECT

    Подпись:

     // не экспортируется
    type ExpectObjectError = {
      тип: 'EXPECT_OBJECT'
      источник: неизвестно
    } 

    Происходит, когда источник не проходит проверку на то, чтобы быть объектом:

     импорт декодирования из decode-json
    
    Decode.record (Decode.int) .decode ([1, 2, 3]). Ошибка
    // == {
    // тип: 'EXPECT_OBJECT',
    // источник: [1, 2, 3]
    //}
    
    Расшифровать.keyValue (Decode.string) .decode (`Давайте рок!`) .error
    // == {
    // тип: 'EXPECT_OBJECT',
    // источник: 'Давайте рок!'
    //}
    
    Decode.field ('length'). Boolean.decode ([true, false]). Ошибка
    // == {
    // тип: 'EXPECT_OBJECT',
    // источник: [истина, ложь]
    //} 
    ОТКАЗ

    Подпись:

     // не экспортируется
    type FailureError = {
      тип: 'ОТКАЗ'
      сообщение: строка
      источник: неизвестно
    } 

    Происходит либо при выполнении декодирования Decode.fail , либо при преобразовании ключа в Decode.keyValue (или DecodeOptional.keyValue ) не работает.

     импорт декодирования из decode-json
    
    Decode.int
      .chain (num => {
        if (num> 0) {
          return Decode.succeed (число)
        }
    
        return Decode.fail ('Ожидайте положительное целое число')
      })
      .decode (-1) .error
    // == {
    // тип: 'FAILURE',
    // сообщение: 'Ожидайте положительное целое число',
    // источник: -1
    //}
    
    Decode.keyValue (key => {
      константа число = parseInt (ключ, 10)
    
      if (! isNaN (число)) {
        return Decode.succeed (число)
      }
    
      вернуть Decode.fail ('Не удалось преобразовать строку в целое число')
    }, Decode.string) .decode ({
      1: "первый",
      2: "второй",
      _3: 'третий'
    })
    // == {
    // тип: 'FAILURE',
    // сообщение: 'Не удалось преобразовать строку в целое число',
    // источник: '_3'
    //} 
    REQUIRED_INDEX

    Подпись:

     // не экспортируется
    type RequiredIndexError = {
      тип: 'REQUIRED_INDEX'
      позиция: номер
      источник: Массив <неизвестно>
    } 

    Происходит, когда Decode.index не может достичь элемента в требуемой позиции массива источника .

     импорт декодирования из decode-json
    
    Decode.index (2) .boolean.decode ([true, false]). Ошибка
    // == {
    // тип: 'REQUIRED_INDEX',
    // позиция: 2,
    // источник: [истина, ложь]
    //} 
    REQUIRED_FIELD

    Подпись:

     // не экспортируется
    type RequiredFieldError = {
      тип: 'REQUIRED_FIELD'
      имя: строка
      источник: Запись <строка, неизвестно>
    } 

    Происходит, когда Decode.field не может достичь поля с именем в исходном объекте .

     импорт декодирования из decode-json
    
    Decode.field ('возраст'). Int.decode ({
      id: 123,
      имя: 'Том'
    }).ошибка
    // == {
    // тип: 'REQUIRED_FIELD',
    //   Назовите возраст',
    // источник: {id: 123, имя: 'Том'}
    //} 
    AT_INDEX

    Подпись:

     // не экспортируется
    type AtIndexError = {
      тип: 'AT_INDEX'
      позиция: номер
      ошибка: DecodeError
    } 

    Происходит при сбое декодирования с ошибкой в каком-то конкретном элементе массива в позиции :

     импорт декодирования из decode-json
    
    Расшифровать.list (Decode.int) .decode ([1, 2, 2.5]). error
    // == {
    // тип: 'AT_INDEX',
    // позиция: 2,
    //   ошибка: {
    // тип: 'EXPECT_INT',
    // источник: 2.5
    //}
    //}
    
    Decode.index (2) .boolean.decode ([false, true, 'ok']). Ошибка
    // == {
    // тип: 'AT_INDEX',
    // позиция: 2,
    //   ошибка: {
    // тип: 'EXPECT_BOOLEAN',
    // источник: 'ок'
    //}
    //} 
    IN_FIELD

    Подпись:

     // не экспортируется
    type InFieldError = {
      тип: 'IN_FIELD'
      имя: строка
      ошибка: DecodeError
    } 

    Происходит при сбое декодирования с ошибкой в некотором конкретном поле объекта с именем :

     импорт декодирования из decode-json
    
    Расшифровать.запись (Decode.int) .decode ({
      один: 1,
      два: 2,
      три: "3-й"
    }).ошибка
    // == {
    // тип: 'IN_FIELD',
    // имя: 'три',
    //   ошибка: {
    // тип: 'EXPECT_INT',
    // источник: '3rd'
    //}
    //}
    
    Decode.keyValue (Decode.string) .decode ({
      Россия: 'Москва',
      Нидерланды: 'Амстердам',
      США: ноль
    }).ошибка
    // == {
    // тип: 'IN_FIELD',
    // название: 'США',
    //   ошибка: {
    // тип: 'EXPECT_STRING',
    // источник: null
    //}
    //}
    
    Decode.field ('is_active'). Boolean.decode ({
      id: 123,
      имя: 'Карл',
      is_active: 'нет'
    }).ошибка
    // == {
    // тип: 'IN_FIELD',
    // имя: 'is_active',
    //   ошибка: {
    // тип: 'EXPECT_BOOLEAN',
    // источник: 'нет'
    //}
    //} 
    ДОПОЛНИТЕЛЬНО

    Подпись:

     // не экспортируется
    type OptionalDecodeError = {
      тип: 'ДОПОЛНИТЕЛЬНО'
      ошибка: DecodeError
    } 

    Указывает, что ошибка возникает для необязательного пути или значения:

     импорт декодирования из decode-json
    
    Decode.optional.int.decode (1.23) .error
    // == {
    // тип: 'ДОПОЛНИТЕЛЬНО',
    //   ошибка: {
    // тип: 'EXPECT_INT',
    // источник: 1.23
    //}
    //}
    
    Decode.optional.field ('lat'). Float.decode ({
      lng: 123,45,
      lat: null
    }).ошибка
    // == {
    // тип: 'ДОПОЛНИТЕЛЬНО',
    //   ошибка: {
    // тип: 'IN_FIELD',
    // имя: 'широта',
    //     ошибка: {
    // тип: 'EXPECT_FLOAT',
    // источник: null
    //}
    //}
    //} 
    ONE_OF

    Подпись:

     // не экспортируется
    type OneOfError = {
      тип: 'ONE_OF'
      ошибки: Массив 
    } 

    Возникает, когда ни один из декодеров Decode.one из не проходит с ошибками от каждого из декодеров:

     импорт декодирования из decode-json
    
    Расшифровать.один из([
      Decode.tuple (
        // для координат как объекта
        Decode.field ('lat'). Float,
        Decode.field ('lng'). Float
      ),
    
      Decode.tuple (
        // для координат в виде массива
        Decode.index (0) .float,
        Decode.index (1) .float
      )
    ]). decode ({широта: 1.23, долгота: 4.56}). ошибка
    // == {
    // тип: 'ONE_OF',
    // ошибки: [
    // {
    // тип: 'REQUIRED_FIELD',
    // имя: 'lng',
    // источник: {широта: 1.23, долгота: 4.56}
    //},
    // {
    // тип: 'EXPECT_ARRAY',
    // источник: {шир: 1.23, долг: 4.56}
    //}
    //]
    //} 
    RUNTIME_EXCEPTION

    Подпись:

     type RuntimeException = {
      тип: 'RUNTIME_EXCEPTION'
      error: Ошибка
    } 

    Происходит, когда во время декодирования происходит что-то непредвиденное, поэтому вам никогда не следует беспокоиться о переносе декодера в try..catch , потому что он делает это автоматически во время выполнения, а TypeScript заботится о правильном использовании во время компиляции.

    DecodeJsonError

    Набор ошибок описывает, что пошло не так во время декодирования строки JSON с помощью Decoder.decodeJson . Набор представляет собой объединение DecodeError с еще одной конкретной ошибкой для исключения синтаксического анализа json.

    INVALID_JSON

    Подпись:

     type RuntimeException = {
      тип: 'INVALID_JSON'
      ошибка: SyntaxError
      источник: строка
    } 

    Происходит, когда Decoder.decodeJson пытается декодировать недопустимую строку JSON:

     импорт декодирования из decode-json
    
    Decode.string.decodeJson ('Я просто строка'). Error
    // == {
    // тип: 'INVALID_JSON',
    // ошибка: новый SyntaxError ('Неожиданный токен I в JSON в позиции 0'),
    // источник: 'Я всего лишь строка'
    //} 
    .

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

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