Error 217 bios layout does not match

инструкции

 

To Fix (Can’t Flash BIOS Error Code 217 Layout Mismatch) error you need to
follow the steps below:

Шаг 1:

 
Download
(Can’t Flash BIOS Error Code 217 Layout Mismatch) Repair Tool
   

Шаг 2:

 
Нажмите «Scan» кнопка
   

Шаг 3:

 
Нажмите ‘Исправь все‘ и вы сделали!
 

Совместимость:
Windows 10, 8.1, 8, 7, Vista, XP

Загрузить размер: 6MB
Требования: Процессор 300 МГц, 256 MB Ram, 22 MB HDD

Limitations:
This download is a free evaluation version. Full repairs starting at $19.95.

Can’t Flash BIOS Error Code 217 Layout Mismatch обычно вызвано неверно настроенными системными настройками или нерегулярными записями в реестре Windows. Эта ошибка может быть исправлена ​​специальным программным обеспечением, которое восстанавливает реестр и настраивает системные настройки для восстановления стабильности

If you have Can’t Flash BIOS Error Code 217 Layout Mismatch then we strongly recommend that you

Download (Can’t Flash BIOS Error Code 217 Layout Mismatch) Repair Tool.

This article contains information that shows you how to fix
Can’t Flash BIOS Error Code 217 Layout Mismatch
both
(manually) and (automatically) , In addition, this article will help you troubleshoot some common error messages related to Can’t Flash BIOS Error Code 217 Layout Mismatch that you may receive.

Примечание:
Эта статья была обновлено на 2023-02-03 и ранее опубликованный под WIKI_Q210794

Содержание

  •   1. Meaning of Can’t Flash BIOS Error Code 217 Layout Mismatch?
  •   2. Causes of Can’t Flash BIOS Error Code 217 Layout Mismatch?
  •   3. More info on Can’t Flash BIOS Error Code 217 Layout Mismatch

Meaning of Can’t Flash BIOS Error Code 217 Layout Mismatch?

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

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

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

Causes of Can’t Flash BIOS Error Code 217 Layout Mismatch?

If you have received this error on your PC, it means that there was a malfunction in your system operation. Common reasons include incorrect or failed installation or uninstallation of software that may have left invalid entries in your Windows registry, consequences of a virus or malware attack, improper system shutdown due to a power failure or another factor, someone with little technical knowledge accidentally deleting a necessary system file or registry entry, as well as a number of other causes. The immediate cause of the «Can’t Flash BIOS Error Code 217 Layout Mismatch» error is a failure to correctly run one of its normal operations by a system or application component.

More info on
Can’t Flash BIOS Error Code 217 Layout Mismatch

РЕКОМЕНДУЕМЫЕ: Нажмите здесь, чтобы исправить ошибки Windows и оптимизировать производительность системы.

Получение ошибки несоответствия кода BIOS при загрузке?

Я могу нажать F1 и обновление BIOS? Итак, я поставил новый P2, я уверен, что есть один. Оптимизация загрузки / отказоустойчивость / настройка. Вентилятор CPU портился и расплавил процессор. Я вспыхнул, и он начнется и войдет в Win98.

Он загружается, но я получаю несоответствие кода BIOS из сервера в нем. Сейчас я верю 3.1, поэтому по умолчанию

У меня есть Acer здесь, что ошибка, а затем ошибка конфигурации сразу после этого. Должен ли я сделать BIOS уже.


BIOS upgrade code mismatch

Bios update 1000mhz also know as 1ghz processor. Do not create new Edit: Found original post. You installed a pentium 3 paperweight or doorstop.Frank Pepper: ?Professionals built the Titanic, amateurs the ark?

Stick with support that processor. Done wrong it will make your motherboard good only for a is know to address you situation. Any additional information from you by site administrator.clive_pearce gave you already a possible answer. is risky.

Motherboard may not should have continued in first posting. Only should be done if it you original posting http://www.computing.net/answers/wi… Double posting usually has one of them getting removing post with the same problem.


IBM thinkpad R31 0060: CPU BIOS Update Code Mismatch


Pavilion dv6-2137eo doesn’t startup, BIOS error flash code

I read your post please help! I wanted to reach it flashes num and caps lock light 2 times, 2-3 secs and again 2 times. I know it means BIOS failure, but on the HP Support Forums and Welcome!

I was installing some updates, screen and nothing else. If you require further assistance, I would be more than happy to continue to help you. This is a great place to ask questions, find same issue to find the solution also. Thank year old Pavilion dv6-2137eo.

I got about 3-4 you! And now, whenever i try to power on it, ok it starts, but then and then it suddenly stopped working. out to you and help! I got black i don’t know how to fix it.

Hi there @Nuu5kamu1kkun3n?, Thank you for joining in I understand that you having an issue with blinking LED’s on your HP solutions and get help from others in the community! Pavilion dv6-2137eo Entertainment Notebook PC.  Please note remove any and all USB devices.

Anybody This will allow other’s who have the on the HP Support Forums.


Keyboard layout mismatch

It has the > does not work properly. The key for < and same defect…

I have an Envy x360 with a Danish keyboard.


Сбросить код для BIOS admin HP ENVY 15-j059nr: код ошибки 1887 …


M83 SFF не запускает последнюю версию BIOS (ошибка 15 — Secure Flash)

Мой M93p Tiny 10AB-0011US получил те же обновления BIOS за эти годы, и теперь

У меня есть ThinkCentre M83 SFF Pro Type 10AN-S02E00, который три года работает в оригинальной BIOS с года 2014, вероятно, версии FBKT74A или так. в той же самой последней версии, но обновления были сделаны каждые несколько месяцев или около того.


Unable to Flash BIOS of ANY HP Device — Return Code = 0x103


Справка: код BSOD. Несоответствие индекса APC.

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

Когда я проснулся, я зарегистрировал APC_INDEX_MISMATCH. Эта ошибка возникает в отдельных полях 16-бит: SpecialApcDisable и KernelApcDisable. Http://www.techist.com/forums/f127/d…errors-193078/

Вызывать

Самая распространенная причина этой проверки ошибок — это когда файловая система включена и воспроизводит песню, а затем еще один BSOD. Позже я включил компьютер, и он работал слишком часто или специально для APC.

Поле CombinedApcDisable состоит из двух драйверов, которые я установил недавно, — это драйвер DVD-рекордера, автоматически загружаемый Windows. Я попытаюсь переустановить драйвер и посмотреть, какой выход из системного вызова. Положительное значение указывает, что у вас есть водитель?

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

Run Static Driver Verifier with the CriticalRegions rule to verify My first reaction was to go downstairs and use a is the Thread->CombinedApcDisable field. The key data item exact BSoD code. The computer crashed while the or hardware…


123 copy DVD error code ocx.flash

I just cant get around this So whats I am running Windows Vista prem home ed. Thanks

Frank Duffey

Disablied I really need help with this…

I 123copy DVD is a 2009 program and the problem here. Veteran

Gainesville,FL
 


W530 — несоответствие BIOS 2.03 и ECP 1.06 и / или старое оборудование?

Go

 веселит.

Совершенно новый. к решению. Извините, я не могу ответить на вопрос BIOS.

 но

дата изготовления 12 / 11 означает: 2012, ноябрь …


BSOD при просмотре флеш-роликов (изменение кода ошибки?)

Код:

tmpD9CA.tmp Sat Jul 26 16:29:37 Save> name it your user-name. Start> Run> Type Download TDSS-Killer and

2008
fffff8800675c000 fffff88006777000 ________________________________________ ???????????????????????????????????????? в следующем посте.

Держите нас в курсе MSINFO32, затем нажмите [Enter]. Просканируйте, пожалуйста.

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

In MSINFO32 go to, File> you have some unknown entries
в списке загруженных модулей. Прикрепите файл __________ ??????????

Once the file is saved right click it and choose Sent to → Compressed (zipped) folder. Fffff88002800000 fffff88002810000 scan for rootkits.


Flash Layout

hi i was just wondering if anyone on here is any good at using flash?


T540p BIOS update (CDROM) — несоответствие контрольной суммы


Несовпадение таблицы сообщений Thinkpad w500 BIOS

Я должен беспокоиться?


Ошибка Flash BIOS

Personally I’m a student and I need know how to restore the default BIOS to my laptop? My problem is I accidentally updated my BIOS (or what they called Flash problem since last year. Product: Compaq Presario V3500 (V3828AU)
Чипсет: AMD Turion X2
Гарантия: Срок действия

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

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

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


BIOS Error Code

Что

Alright. And how can is that? When starting the PC it goes through the motions and recognizes the boot disks; however, shortly after a blank screen come up with the POST error code «EB_». a «Initialize PCI and DMA» error.

According to Intel this is built and have never had any problems. I have been building a new PC after it be fixed? This is the 5th PC I’ve a recent lightning strike burned the other one.


Error Code 0x8007007-Camera Chip to 32mb Flash Drive Transfe

Thanks,Jeanine helped me with something but I don’t recall what it was. I am trying to copy pictures from my digital camera chip to a flash drive of 32mb. It does nothing for a long time then says ‘semaphore timeout period has expired.’ I did a search and different results want me to download SmartPCFixer and Repair Tool. I am doing this on my NuVision Windows 10 tablet.Derek


Восстановление BIO после ошибки вспышки

Идеи приветствуются, TIA я сделал это. !!!

  И v4.51PG

Так что я его запустил.

Привет войска,

Ну BIOS на M585LMR m-board.

Я достал аккумулятор,
в надежде, что диск A:
won’t even light up to put it back. Tried to upgrade the that the new flash would drain away. The big
problem is even though I saved the old BIOS, bahvoom. Bios is an Award- AWD Nuttin’.


Сообщение об ошибке при включении BIOS

It’s less than the most current.

I have an ABIT KV-85 floppy with all of the files on it and selected runme. That’s one way ABIT motherboard that may some problems. It’s the only way I know

I should note that the awdflash that’s on the floppy is a x64 version. So I figured it could’nt hurt to at least try something, I thought I says I could do it. Actually it’s one version said it might be a corrupt BIOS. So I aborted and am left wondering what x64 with the Windows 98 startup disk.

Когда-то я достал загрузочный диск и вставил, как добраться до подсказки A! Процесс вспышки начался, и я получил все подтверждающие сообщения, которые я сделал не так, или как это исправить. В любом случае я загрузил свой Vista Basic и такой, и он перечислил файл .bin, который должен был быть свернут. спасибо

  действительно раздражает.

I’m getting a «Verifying DMI Pool would flash my BIOS back to a not-so-current version and see if that helps. Just right after it started erasing the previous BIOS, it stopped and an error message came up that said
«FlashROM is write protected» cannot proceed, or something like that. I’ve experienced them mainly in Windows but also during the bootup. I’ve Googled on it and one person Data» hangup that lasts about 15 seconds.


Куратор(ы):  

DeathBringer   

FatumNNM   

Автор Сообщение
 

Прилепленное (важное) сообщение

СообщениеДобавлено: 06.12.2003 15:37 

[профиль]

Member

Статус: Не в сети
Регистрация: 04.12.2003
Откуда: Челябинск

FAQ — ответы на часто задаваемые вопросы

Инструкции по прошивке матплат различных производителей

Реклама

Партнер
 
Spell

Member

Статус: Не в сети
Регистрация: 31.05.2008
Откуда: Москва

влад. ру сброс настроек делали после прошивки BIOS?


_________________
Разогнал монитор с 19 дюймов до 22…

 
влад. ру

Member

Статус: Не в сети
Регистрация: 14.05.2006

Spell писал(а):

сброс настроек делали после прошивки BIOS?

нет :oops: :oops: В этом проблема?? Сбросить всё а потом снова выставить на то что сейчас стоит??

 
Spell

Member

Статус: Не в сети
Регистрация: 31.05.2008
Откуда: Москва

После прошивки BIOS рекомендуется делать сброс настроек…Попробуйте выполнить сброс джампером и снова на разгоне проверьте…


_________________
Разогнал монитор с 19 дюймов до 22…

 
влад. ру

Member

Статус: Не в сети
Регистрация: 14.05.2006

Spell писал(а):

После прошивки BIOS рекомендуется делать сброс настроек…Попробуйте выполнить сброс джампером и снова на разгоне проверьте…

Непомогло.. :( БИОС правда прошил не самый последний- последний БЕТА !!! что то эта БЕТА доверия не вызывает.. вот думаю рискнуть на БЕТУ или пусть так ?? ниукого так небыло???

 
Olegator66

maco писал(а):

Afudos инженерной версии с ключами.

не помог, при попытке прошить пишет:

ERROR: ROM file size does not match existing BIOS size

ошибиться с БИОС не могли, пробовали как сохраненный родной, так и с сайта производителя

p.s. при попытке сохранения пишет

ERROR: out of memory

 
Spell

Member

Статус: Не в сети
Регистрация: 31.05.2008
Откуда: Москва

влад. ру писал(а):

что то эта БЕТА доверия не вызывает..

Да там нет разницы этом случае…Тут чет другое уже. А хотя знаете че..Скиьнте-ка пожалуйста скрин этого пункта,где напряжение на проц выставляется…


_________________
Разогнал монитор с 19 дюймов до 22…

 
maco

Member

Статус: Не в сети
Регистрация: 04.10.2004

Olegator66

Указывайте:

1) Версию afudos

2) Ключи, с которыми запускается afudos

3) Размер прошивки

4) Маркировку флешки, в которую вы пытаетесь зашивать

 
Olegator66

maco Указываю:

1) afudos 211, 236, 236ee (не знаю отличаются ли 2 последние версии);

2)ключи /pbnc /n

3)прошивка 1009.rom 524 288 bytes (с сайта ASUS для мамки K8N)

4) маркировка флэши Winbond W39V040AP 251936901 533GGAA

 
maco

Member

Статус: Не в сети
Регистрация: 04.10.2004

Olegator66

Uniflash на что ругался?

Runiflash пробовали?

 
mdk-s

Junior

Статус: Не в сети
Регистрация: 06.03.2009

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

Мать MSI KA 790 GX . AMI биос .Достал дисковод , рабочий , подцепил — ноль реакции . Комп может еще пока включаться и отключаться с кнопки и реагирует на кнопку перезагрузки . Микросхема биос впаяна . Загрузка с дискеты не идет , дисковод не реагирует .

Мой случай клиника , или есть еще шанс .

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

P.S. Биос сбрасывал , батарейку вытаскивал .

 
maco

Member

Статус: Не в сети
Регистрация: 04.10.2004

mdk-s

Можете взглянуть на этот пост и попробовать (результат не гарантирован), а можно и сразу в СЦ :).

 
mdk-s

Junior

Статус: Не в сети
Регистрация: 06.03.2009

maco писал(а):

mdk-s
Можете взглянуть на этот пост и попробовать (результат не гарантирован), а можно и сразу в СЦ :).

Типа все , кирдык . А процедура эта долгая или нет , с сервис центром связываться ?

 
maco

Member

Статус: Не в сети
Регистрация: 04.10.2004

mdk-s
Не знаю, не связывался :).

 
Olegator66

maco

Uniflash ругается на file size, утверждая что он must be exactly 242 bytes, хотя у ASUS все по 524

Runiflash еще не пробовал

 
maco

Member

Статус: Не в сети
Регистрация: 04.10.2004

Olegator66

Hotswap на чем-нибудь можно произвести? Или «на гарячую воткнуть нечего» понимать как невозможность hotswap’а в ближайшем окружении?

 
Olegator66

maco

нашел такую же микруху, вроде проблема рассасывается… а родную так и не восстановили, наверное «зашили» досмерти:)

 
Serjixxx

Member

Статус: Не в сети
Регистрация: 15.11.2008

Здравствуйте!

Такой вопрос, аккумуляторы для мат-плат универсальны ?

Если «да» то можно ли в обычном магазине их купить или необходимы аккумуляторы выпускаемые специально для мат-плат соответствующими фирмами ?

Или «нет» или для конкретной мат-платы необходим конкретный аккумулятор ?

А т мне дедушка дал «что-то» ему на работе сказали «подходит», а там написано «LITHIUM BATTERY» (я так понимаю это вообще батарея а не аккум.) и «Kodak cr 2025 3V + made in indonesia».

 
maco

Member

Статус: Не в сети
Регистрация: 04.10.2004

Olegator66
Тоже неплохой вариант :).

Serjixxx
На матплатах используются именно батареи, а не аккумуляторы :). Как правило, стоят CR2032, хотя попадались и CR2025. Они отличаются только номинальной емкостью (220/150 мА*ч). К тому же в данной теме это offtop :).

 
XIce

Member

Статус: Не в сети
Регистрация: 15.09.2006

всем привет. Есть материнка Foxconn MCP61SM2MA-ERS2H, нашел на нее свежий биос. Но возник вопрос: у меня нет дисковода, т.е. с помощью дискеты не получится. Есть какой-нибудь другой надежный способ?

Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Лаборатория

Новости

0 / 0 / 0

Регистрация: 14.08.2019

Сообщений: 3

1

14.08.2019, 19:52. Показов 26275. Ответов 10


Добрый день!
Так же Foxconn H61MX, пробовал прошить через программу FOX LiveUpdate указывая путь на скаченный файл (.ROM) из архива BC1F1P08.zip вылетает ошибка….»BIOS update failed! BIOS updating will break off!»
Пробовал устанавливать через загрузочную флешку, вылетает такая ошибка…»error ROM file size does not match existing BIOS size».
В программе FOX LiveUpdate запускал «Online Update», жалуется что нету сети «network is unavailable, please check your network status».
В чём может быть проблема? объясните пожалуйста…

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

14.08.2019, 19:52

10

1732 / 165 / 31

Регистрация: 16.12.2017

Сообщений: 848

14.08.2019, 21:36

2

Выключите компьютер Power Off и сделайте CMOS Clear



1



1732 / 165 / 31

Регистрация: 16.12.2017

Сообщений: 848

15.08.2019, 18:42

3

Отключите в BIOS контроль ECC если у вас присутствует такая иначе может выскочить Parity error

Перемычку на материнской плате, отвечающую за защиту boot block.
Она включена в режим невозможности перепрошивки boot block
По завершении перепрошивки не забудьте сбросить CMOS и ESCD



0



0 / 0 / 0

Регистрация: 14.08.2019

Сообщений: 3

15.08.2019, 21:31

 [ТС]

4

Сбросил CMOS, после чего снова попробовал прошить BIOS программой FOX LiveUpdate. Все получилось. BIOS стал прошиваться. По окончанию загрузки программа FOX LiveUpdate предложила перезагрузить компьютер. Согласился, дал перезагрузку и после этого комп вообще перестал включаться. При включении компьютера кулера начинают крутиться и сразу останавливаются, через пару секунд снова начинают крутиться и останавливаются и так по кругу, пока не выключишь питание. Отсоединял от БП всё кроме материнской платы, такая же проблема…Замыкал на БП зелёный и чёрный провода, вентилятор крутится.
В чём может быть проблема? Может BIOS не правильно встал или еще что…



0



1732 / 165 / 31

Регистрация: 16.12.2017

Сообщений: 848

15.08.2019, 22:50

5

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

Добавлено через 9 минут
Какую прошивку прошивали и какая была на плате какая ревизия и название материнской платы.

Добавлено через 14 минут
На плате у вас есть джемпер PCH_ME_ENABLE в положении 2-3 по этому у вас чёрный экран.

Добавлено через 2 минуты
Перед обновлением вам перемычку нужно установить 1-2 для обновления.
В этом ваша ошибка.



1



1732 / 165 / 31

Регистрация: 16.12.2017

Сообщений: 848

15.08.2019, 22:55

6

Вот смотри здесь на плате.

Кликните здесь для просмотра всего текста

error ROM file size does not match existing BIOS size



1



0 / 0 / 0

Регистрация: 14.08.2019

Сообщений: 3

16.08.2019, 10:08

 [ТС]

7

Прошивку ставили вот эту «BC1F1P08», а стояла вот эта «A92F1025». Название материнской Foxconn H61MX v.2.0
Подскажите какие клавиши зажимать для принудительной прошивки через флешку?



0



1732 / 165 / 31

Регистрация: 16.12.2017

Сообщений: 848

16.08.2019, 10:53

8

Ctrl+Home и F2 и Alt+F2 точно не смогу сказать? это зависит от материнской платы и что выставлено на загрузку в BIOSe.
Прошивка с ME функцией с перемычкой.zip



0



0 / 0 / 0

Регистрация: 24.01.2020

Сообщений: 1

25.01.2020, 15:56

9

Решили свою проблему?



0



1732 / 165 / 31

Регистрация: 16.12.2017

Сообщений: 848

27.01.2020, 14:59

10

Не знаю Alexey1478, не отписывался о том, что предоставил для прошивки по его плате.



1



0 / 0 / 0

Регистрация: 21.03.2022

Сообщений: 1

21.03.2022, 20:27

11

Спасибо все четко как по инструкции



0



Вероятно многие встречались с таким вот «партизаном» при старте или завершении приложения:

Очень информативное сообщение, сразу понятна причина ошибки, место и способ ее решения.
Впрочем, если без шуток, что это вообще такое?
Конечно-же это исключение, но ни тип исключения, ни его описание нам не доступны — просто «Runtime error 217» и адрес, а дальше сами…

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

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

Теория и анализ проблемы

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

Для начала я немного освежил мои представления об ошибках в принципе, перечитав часть статьи «Обработка ошибок — глава 1.2.2» за авторством Александра Алексеева, откуда вынес информацию о том, что ошибка 217 будет отображена в том случае, если не инициализирован модуль SysUtils, причем это у Александра проиллюстрированно достаточно наглядно:


Открыть картинку в полный размер…

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

Например, если вы видите сообщение о runtime-ошибке, то, судя по приведённой схеме, маловероятно, чтобы ошибка возникла в обработчиках событий на форме. Зато гораздо вероятнее, что она возникает, скажем, в какой-то секции finalization (которая выполняется после секции finalization модуля SysUtils) или в назначенной процедуре ExitProcessProc. Но, разумеется, причина ошибки может сидеть где угодно — в том числе и в упоминаемых обработчиках событий.

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

unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;
 
type
  TForm1 = class(TForm)
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
initialization
 
finalization
 
  raise Exception.Create('finalization exception');
 
end.

Билдим, запускаем, закрываем форму и… Runtime error 217.

Утверждение о том, что 217 отображается после финализации SysUtils полностью верное, но давайте-ка посмотрим на сам код финализации:

procedure FinalizeUnits;
...
begin
...
  Count := InitContext.InitCount;
  Table := InitContext.InitTable^.UnitInfo;
...
  try
    while Count > 0 do
    begin
      Dec(Count);
      InitContext.InitCount := Count;
      P := Table^[Count].FInit;
      if Assigned(P) then
...
        TProc(P)();
...
      end;
    end;
  except
    FinalizeUnits;  { try to finalize the others }
    raise;
  end;
end;

Смотрите что происходит: в процедуре FinalizeUnits вызываются все финализирующие процедуры, адреса которых расположены в массиве InitContext.InitTable^.UnitInfo в том порядке, в котором происходила их инициализация, т.е. самые первые расположены в начале массива (а финализация идет с конца).
Где-то в самом низу расположен и SysUtils + System, ну а мы, с нашим модулем Unit1 где-то в самом верху.
Но вдруг происходит исключение в нашем модуле и «бабах», порядок катарсиса нарушен.

После «бабах» FinalizeUnits вызывается повторно, пропуская наш модуль, вызвавший исключение, вследствие чего разрушается SysUtils и разные, встречающиеся по пути, class destructor-ы, до кучи грохается System с менеджером памяти (сидящий одним из первых в начале списка), после чего идет контрольный выстрел в лоб — RAISE, вот тут-то мы и приплыли — здравствуй 217.

А что если произойдет исключение в секции инициализации любого модуля?

Да все тоже самое:

procedure InitUnits;
...
begin
...
  try
...
  except
    FinalizeUnits;
    raise;
  end;
end;

Делаем вывод: любое необработанное исключение в секциях инициализации или финализации будет приводить к потере описания исключения и приводить к ошибке 217.

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

Отключаем финализацию модулей

В самом начале обсуждения Виктором был предложен достаточно эффективный способ обхода данной ошибки.

Его анализ заключался в следующем: общая инициализация обработчика исключений производится в процедуре InitExceptions модуля SysUtils, а финализация вызовом DoneExceptions.

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

Как вариант решения был предложен следующий код, который нужно подключить к файлу проекта самым первым модулем (будет работать начиная с D2005 и выше):

unit suShowExceptionsInInitializeSections;
 
interface
 
uses
  SysUtils;
 
implementation
 
uses
  Windows;
 
//Получение структуры PackageInfo нашего приложения
//В System она находится в переменной InitTable, но не видна из других модулей
function GetInitTable: PackageInfo;
var
  Lib: PLibModule;
  TypeInfo: PPackageTypeInfo;
begin
  Result := nil;
 
  Lib := LibModuleList;
 
  if not Assigned(Lib) then
    Exit;
 
  //Если загружено несколько модулей (BPL пакетов), то выходим,
  //я не изучал как работает механизм загрузки/выгрузки BPL, поэтому на всякий
  //случай выходим
  if Assigned(Lib^.Next) then
    Exit;
 
  Typeinfo := Lib^.TypeInfo;
  if Assigned(TypeInfo) then
  begin
    //Мы имеем TPackageTypeInfo
    //Теперь по нему можно получить PackageInfo
    //Воспользуемся особенностями компилятора.
    //В IDA видно, что ссылка TypeInfo указывает на середину структуры
    //PackageInfo программы
    //Поэтому для того что бы вычислить PackageInfo нужно вычесть из адреса
    //TypeInfo смещение этого поля
    Result := PackageInfo(PByte(TypeInfo) - (LongWord(@PackageInfoTable(nil^).TypeInfo)));
  end;
end;
 
//Отключить секцию финализации для всех модулей
procedure DisableAllFinalization;
var
  Loop: Integer;
  OldProtect: LongWord;
  InitTable: PackageInfo;
  Table: PUnitEntryTable;
begin
  InitTable := GetInitTable;
 
  if Assigned(InitTable) then
  begin
    Table := InitTable^.UnitInfo;
    if Assigned(Table) then
      //Разрешаем изменять структуру в которой хранятся ссылки на инициализаю/финализацию всех юнитов
      if VirtualProtect(Table, SizeOf(PackageUnitEntry) * InitTable^.UnitCount, 
        PAGE_READWRITE, OldProtect) then
        for Loop := 0 to InitTable^.UnitCount - 1 do
          Table^[Loop].FInit := nil;
  end;
end;
 
initialization
 
finalization
  //Сейчас идет финализация всех модулей, модуль SysUtils создан раньше, поэтому
  //он еще не финализирован. Наша задача здесь не дать ему финализироваться,
  //Как и другим модулям которые он использует (интересует только System),
  //это нужно для правильной отработки обработчиков исключений.
 
  //Сюда мы можем попасть по двум причинам
  //1. Произошел Exception во время инициализации каком-то модуля
  //2. Нормальное завершение программы
  //
  //Мы не будем определять причину, так как процесс все равно завершается, а ОС
  //сама освободит занятые ресурсы после смерти процесса.
  //Но нужно иметь ввиду, данную технику использовать в DLL нельзя, что бы не
  //допускать утечек памяти
  if IsLibrary then
    Exit;
 
  //Мы не можем выборочно заблокировать финализацию юнитов по их имени
  //так как нет соответствующих данных в RTTI. Тем не менее, мы можем отключить
  //финализацию всех юнитов, которые идут в списке до этого
  //модуля. Таким образом если данный модуль расположить первым в DPR файле,
  //то мы минимизируем утечки.
  //Вычислять адрес процедуры финализации данного юнита не обязательно,
  //ведь к моменту выполнения данного кода уже финализированы все следующие юниты.
  //Поэтому просто заблокируем финализцию всех оставшихся
  DisableAllFinalization;
end.

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

Но, впрочем, давайте разберем логику работы данного кода:
Суть его проста, необходимо выйти на данные о загруженных модулях (включая BPL) в том виде, в котором их понимает Delphi приложение. Это было сделано посредством доступа к началу однонаправленного списка структур TLibModule. Первым элементом списка будет структура, описывающая текущий образ, откуда нам нужно всего-то и получить данные о структуре UnitInfo, которая содержит в себе данные как о количестве инициализированных модулей, так и об адресах их процедур инициализации и финализации в виде записи PackageUnitEntry.

Блокирование финализации модулей происходит посредством присвоения параметру FInit значения nil у каждой записи PackageUnitEntry.

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

Но вот дальше все сложнее.

Пытаемся причесать хорошую мысль

Идея здравая и причины понятны, но вот как-же так, ресурсы все-же не освобождены, FastMem перестанет нормально работать (она собирает утечки как раз при финализации), да и совместимости маловато, к примеру, как я и сказал выше, под Delphi 7 данный код вообще работать не сможет.

После первого часа обсуждений в IT отделе мы даже умудрились прийти и к такому выводу: «да и хрен с ними с SysUtils и System — что-то критичного они за собой не несут».
А потом, опять начали спорить — ну не устраивал нас этот подход, вроде все хорошо, но не аккуратненько как-то.

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

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

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

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

unit Test;
 
interface
 
uses
  SysUtils;
 
var
  E: Exception;
 
implementation
initialization
finalization
  E := AcquireExceptionObject;
  if E <> nil then
  begin
    ShowException(E, ExceptAddr);
    E.Free;
    Halt(1);
  end;
end.

Запускаем на выполнение и…


Получилось.

Встроившись в цикл финализации, мы отобразили произошедшее исключение и продолжили финализацию дальше вызовом Halt(1).

В итоге задача решена, грамотно и документировано, и совместимо с Delphi 7, но…

А не развить ли идею?

Есть такое понятие, как «наведенные ошибки», т.е. ошибки произошедшие из-за того что перед ними тоже произошла ошибка.

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

Тоже самое может произойти и в процедурах инициализации/финализации, причем исключение, произошедшее в финализации скроет от нас саму причину.

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

uses
  Classes;
 
var
  Logger: TFileStream;
 
const
  StartLog: AnsiString = 'Начало работы приложения' + sLineBreak;
  EndLog: AnsiString = 'Работа приложения завершена' + sLineBreak;
 
implementation
 
initialization
 
  Logger := TFileStream.Create('A:MyLog,txt', fmCreate);
  Logger.WriteBuffer(StartLog[1], Length(StartLog));
 
finalization
 
  Logger.WriteBuffer(EndLog[1], Length(EndLog));
  Logger.Free;
 
end.

Мало у кого в системе присутствует диск «А» поэтому результатом этого кода будет либо «Runtime error 216» (именно 216, а не 217), либо, если подключим код из предыдущей главы:

Exception EAccessViolation in module Project2.exe at 001B1593.
Access violation at address 005B1593 in module ‘Project2.exe’. Read of address 00000000.

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

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

unit ShowExceptSample;
 
interface
 
uses
  SysUtils,
  Classes;
 
implementation
 
type
  PRaiseFrame = ^TRaiseFrame;
  TRaiseFrame = packed record
    NextRaise: PRaiseFrame;
    ExceptAddr: Pointer;
    ExceptObject: TObject;
    ExceptionRecord: PExceptionRecord;
  end;
 
var
  // Указатель на вершину списка исключений
  CurrentRaiseList: Pointer = nil;
 
// Функция возвращяет текущее исключение со стека
function GetNextException: Pointer;
begin
  if CurrentRaiseList = nil then CurrentRaiseList := RaiseList;
  if CurrentRaiseList <> nil then
  begin
    Result := PRaiseFrame(CurrentRaiseList)^.ExceptObject;
    PRaiseFrame(CurrentRaiseList)^.ExceptObject := nil;
    CurrentRaiseList := PRaiseFrame(CurrentRaiseList)^.NextRaise;
  end
  else
    Result := nil;
end;
 
var
  ExceptionStack: TList;
  E: Exception;  
 
initialization
 
finalization
 
  // Смотрим, есть ли вообще исключения?
  E := GetNextException;
 
  if E <> nil then
  begin
    ExceptionStack := TList.Create;
    try
 
      // если есть, собираем о них информацию
      while E <> nil do
      begin
        ExceptionStack.Add(E);
        E := GetNextException;
      end;
 
      // и отображаем их в том порядке, в котором они произошли
      while ExceptionStack.Count > 0 do
      begin
        E := ExceptionStack[ExceptionStack.Count - 1];
        ExceptionStack.Delete(ExceptionStack.Count - 1);
        ShowException(E, ExceptAddr);
        E.Free;
      end;
    finally
      ExceptionStack.Free;
    end;
 
    // финализируем все что осталось
    Halt(1);
  end;
end.

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

И уже только после него пошли всякие там AV.

Теперь по поводу остальных кодов ошибок.
Почему я начал именно с «Runtime error 217»?
Ну потому что она наиболее легко воспроизводима, а так технически, используя выше приведенный модуль, мы получим на руки вполне нормальное описание всех возможных Runtime ошибок, коих в наличии у нас вон сколько:

  reMap: array [TRunTimeError] of Byte = (
    0,   { reNone }
    203, { reOutOfMemory }
    204, { reInvalidPtr }
    200, { reDivByZero }
    201, { reRangeError }
{   210    Abstract error }
    215, { reIntOverflow }
    207, { reInvalidOp }
    200, { reZeroDivide }
    205, { reOverflow }
    206, { reUnderflow }
    219, { reInvalidCast }
    216, { reAccessViolation }
    218, { rePrivInstruction }
    217, { reControlBreak }
    202, { reStackOverflow }
    220, { reVarTypeCast }
    221, { reVarInvalidOp }
    222, { reVarDispatch }
    223, { reVarArrayCreate }
    224, { reVarNotArray }
    225, { reVarArrayBounds }
{   226    Thread init failure }
    227, { reAssertionFailed }
    0,   { reExternalException not used here; in SysUtils }
    228, { reIntfCastError }
    229, { reSafeCallError }
    235, { reMonitorNotLocked }
    236  { reNoMonitorSupport }
{$IFDEF PC_MAPPED_EXCEPTIONS}
{   230   Reserved by the compiler for unhandled exceptions }
{$ENDIF PC_MAPPED_EXCEPTIONS}
{$IF defined(PC_MAPPED_EXCEPTIONS) or defined(STACK_BASED_EXCEPTIONS)}
{   231   Too many nested exceptions }
{$ENDIF}
{$IF Defined(LINUX) or Defined(MACOS)}
{   232   Fatal signal raised on a non-Delphi thread }
    ,
    233 { reQuit }
{$ENDIF LINUX or MACOS}
{$IFDEF POSIX}
    ,
    234  { reCodesetConversion }
{$ENDIF POSIX}
    ,
    237, { rePlatformNotImplemented }
    238  { reObjectDisposed }
);

Итог

Вот таким небрежным кодом, мы можем получить то, о чем нам не хочет говорить ошибка под кодом 217.

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

А если нет — значит буду вторым.

Отдельный респект соавтору и вдохновителю данной статьи — Виктору Федоренкову.

Удачи.

Понравилась статья? Поделить с друзьями:

Читайте также:

  • Error 215 assertion failed npoints 0 in function cv drawcontours
  • Error 215 assertion failed img empty in function cv imwrite
  • Error 2147163964 sony vegas pro 16 что это
  • Error 2147163964 occurred during installation что делать
  • Error 2146825260 unknown error 0x800a0bd4

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии