|
|
To Fix (Can’t Flash BIOS Error Code 217 Layout Mismatch) error you need to |
|
Шаг 1: |
|
---|---|
Download (Can’t Flash BIOS Error Code 217 Layout Mismatch) Repair Tool |
|
Шаг 2: |
|
Нажмите «Scan» кнопка | |
Шаг 3: |
|
Нажмите ‘Исправь все‘ и вы сделали! | |
Совместимость:
Limitations: |
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
Автор | Сообщение | |||
---|---|---|---|---|
|
||||
Member Статус: Не в сети |
FAQ — ответы на часто задаваемые вопросы Инструкции по прошивке матплат различных производителей |
Реклама | |
Партнер |
Spell |
|
Member Статус: Не в сети |
влад. ру сброс настроек делали после прошивки BIOS? |
влад. ру |
|
Member Статус: Не в сети |
Spell писал(а): сброс настроек делали после прошивки BIOS? нет |
Spell |
|
Member Статус: Не в сети |
После прошивки BIOS рекомендуется делать сброс настроек…Попробуйте выполнить сброс джампером и снова на разгоне проверьте… |
влад. ру |
|
Member Статус: Не в сети |
Spell писал(а): После прошивки BIOS рекомендуется делать сброс настроек…Попробуйте выполнить сброс джампером и снова на разгоне проверьте… Непомогло.. |
Olegator66 |
|
|
maco писал(а): Afudos инженерной версии с ключами. не помог, при попытке прошить пишет: |
Spell |
|
Member Статус: Не в сети |
влад. ру писал(а): что то эта БЕТА доверия не вызывает.. Да там нет разницы этом случае…Тут чет другое уже. А хотя знаете че..Скиьнте-ка пожалуйста скрин этого пункта,где напряжение на проц выставляется… |
maco |
|
Member Статус: Не в сети |
Olegator66 |
Olegator66 |
|
|
maco Указываю: |
maco |
|
Member Статус: Не в сети |
Olegator66 |
mdk-s |
|
Junior Статус: Не в сети |
Здравствуйте ! Проблема такая . Перепрошивал биос из под винды , все цифирки пробежали , комп сам пошел на перезагрузку и все . Перезагрузился и все ступор .Вентили крутятся , сиди пытается дернуться , винчестер тоже пытается и все на этом . Индикатор активности гаснет и только ветиляторы остаются работать . P.S. Биос сбрасывал , батарейку вытаскивал . |
maco |
|
Member Статус: Не в сети |
mdk-s |
mdk-s |
|
Junior Статус: Не в сети |
maco писал(а): mdk-s Типа все , кирдык . А процедура эта долгая или нет , с сервис центром связываться ? |
maco |
|
Member Статус: Не в сети |
mdk-s |
Olegator66 |
|
|
maco |
maco |
|
Member Статус: Не в сети |
Olegator66 |
Olegator66 |
|
|
maco |
Serjixxx |
|
Member Статус: Не в сети |
Здравствуйте! |
maco |
|
Member Статус: Не в сети |
Olegator66 Serjixxx |
XIce |
|
Member Статус: Не в сети |
всем привет. Есть материнка Foxconn MCP61SM2MA-ERS2H, нашел на нее свежий биос. Но возник вопрос: у меня нет дисковода, т.е. с помощью дискеты не получится. Есть какой-нибудь другой надежный способ? |
—
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения |
Лаборатория
Новости
0 / 0 / 0 Регистрация: 14.08.2019 Сообщений: 3 |
|
1 |
|
14.08.2019, 19:52. Показов 26275. Ответов 10
Добрый день!
__________________
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.
0 |
0 / 0 / 0 Регистрация: 14.08.2019 Сообщений: 3 |
|
15.08.2019, 21:31 [ТС] |
4 |
Сбросил CMOS, после чего снова попробовал прошить BIOS программой FOX LiveUpdate. Все получилось. BIOS стал прошиваться. По окончанию загрузки программа FOX LiveUpdate предложила перезагрузить компьютер. Согласился, дал перезагрузку и после этого комп вообще перестал включаться. При включении компьютера кулера начинают крутиться и сразу останавливаются, через пару секунд снова начинают крутиться и останавливаются и так по кругу, пока не выключишь питание. Отсоединял от БП всё кроме материнской платы, такая же проблема…Замыкал на БП зелёный и чёрный провода, вентилятор крутится.
0 |
1732 / 165 / 31 Регистрация: 16.12.2017 Сообщений: 848 |
|
15.08.2019, 22:50 |
5 |
Да это происходит если последовательность версий Bios не соблюдена иногда решает повторный сброс CMOS Clear, если не помогло запуститься в нормальном режиме потребуется прошить программатором, либо через флешку принудительном режиме зажав определённые клавиши для запуска прошивки. Добавлено через 9 минут Добавлено через 14 минут Добавлено через 2 минуты
1 |
1732 / 165 / 31 Регистрация: 16.12.2017 Сообщений: 848 |
|
15.08.2019, 22:55 |
6 |
Вот смотри здесь на плате. Кликните здесь для просмотра всего текста
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.
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.
Впрочем, я не думаю что этот подход будет незнаком опытным программистам.
Скорее всего это — здравствуй велосипед, ибо вероятнее всего данная проблема кем-то уже решалась ранее, но я просто не знал о данном решении.
А если нет — значит буду вторым.
Отдельный респект соавтору и вдохновителю данной статьи — Виктору Федоренкову.
Удачи.