Microsoft никога не е искала да разбирате кодовете за грешки в Windows – ето какво всъщност означават те

Най-четени

Даниел Десподов
Даниел Десподов
Новинар. Увличам се от съвременни технологии, информационна безопасност, спорт, наука и изкуствен интелект.

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

Това е така, защото Microsoft никога не е искала да разбирате кодовете за грешки на Windows. Системата от кодове за грешки на Windows е предназначена за разработчиците, които вече познават вътрешното функциониране на операционната система, само че тези кодове за грешки се оказват в милиони потребителски компютри от десетилетия насам. Може би ще можете да използвате инструменти с отворен код, за да коригирате частите на Windows, които ви дразнят, но разбирането на кодовете за грешки е начинът, по който действително ще отстраните тези проблеми.

Кодовете за грешки на Windows не са създадени за вас

Създадени са за инженерите, но се показват на всички останали.

Кодовете за грешки в Windows се изписват в шестнадесетичната система. Това е префиксът 0x, който винаги виждате преди действителния код. Шестнадесетичната система е с база 16 – езикът, който компютрите и програмистите от ниско ниво използват, тъй като се преобразува лесно в двоична система. За нормалните човешки същества като вас и мен той е безсмислен. Не можете да се опитате да отстраните грешка 0x000000709: Операцията не може да бъде завършена, ако не знаете коя точно операция е била провалена.

Още по-лошо е, че в Windows всъщност има три отделни, паралелни системи за кодове за грешки, които са се наслагвали една върху друга в продължение на десетилетия от историята на операционната система. На най-ниско ниво ядрото на Windows използва кодовете NTSTATUS. Те произлизат от изпълнителния модул NT, ядрото на Windows, и се използват от драйверите на устройствата, управлението на паметта, файловите системи и всичко останало, което работи на хардуерно ниво.

Така например грешката за отказ на достъп на ниво ядро дава кода за грешка STATUS_ACCESS_DENIED 0xC0000022. Почти никога няма да видите точно този код при ежедневната си употреба на Windows, защото в момента, в който напусне ядрото и достигне до която и да е програма, срещнала проблема, той се превежда.

Този слой за преобразуване се нарича Win32 API. Той преобразува кодовете NTSTATUS в прост набор от кодове за грешки в системата Win32. Те се съобщават на вашите приложения чрез вътрешна функция, наречена GetLastError(). Това е мястото, където числа като 0x5 започват да се превеждат в разбираеми кодове за грешки като „Access Denied“ (Отказан достъп) на обикновен английски език.

На най-горния слой ще видите трета система, наречена HRESULT, използвана от COM (Component Object Model), Компонентния обектен модел на Microsoft. Той осигурява функционалността на бекенда зад приложения като Office, ActiveX и по-голямата част от начина, по който приложенията на Windows комуникират помежду си. Вместо да опрости допълнително кодовете за грешки обаче, HRESULT опакова кода за грешка на Win32 обратно в още една шестнадесетична структура, преди да ви го покаже.

Какво съобщават тези кодове за грешки

Логиката зад шестнадесетичното форматиране.

Microsoft никога не е искала да разбирате кодовете за грешки в Windows – ето какво всъщност означават те

Когато видите код за грешка на Windows, например 0x80070005, не виждате случайно число. Това е структурирана 32-битова стойност, пълна с информация. Водещата осмица в кода по-горе ви казва, че първият бит е зададен на 1, което означава, че това е неуспех (успехът би започнал с 0). Цифрата 0007 в средата е код на съоръжението. В този случай той идва от FACILITY_WIN32, което означава, че грешката е възникнала в подсистемата Win32. Последният код 0005 в края е просто код за грешка 5 на Win32, което означава, че на който и да е процес, сблъскал се с този проблем, е бил отказан достъп до ресурс, от който се е нуждаел. Например когато се опитвате да изтриете файл, използван от друга програма в Windows.

Този специфичен код за грешка се опитва да ви каже, че даден процес няма разрешение да направи това, което се опитва да направи. Този единичен код за грешка може да означава няколко неща. Той може да означава, че даден файл е заключен, че вашият потребителски акаунт няма администраторски права за този конкретен ключ на системния регистър, че антивирусната ви програма може да е блокирала операцията или че Windows Update не е успял да запише в защитена системна папка. Един и същ код за грешка обхваща всички тези много различни ситуации, поради което отстраняването му никога не е толкова просто, колкото може да изглежда в един наръчник.

Друг пример е „0x80004005: Код за грешка „Неуточнена грешка“ (Unspecified Error“). Кодът на механизма тук е FACILITY_NULL, което означава, че Microsoft не е възложил това на конкретна подсистема. Кодът 0x4005 се съотнася към E_FAIL, което просто означава, че нещо се е счупило или не е работило правилно. Можете да видите този код за грешка при извличане на ZIP файлове, стартиране на виртуални машини, работа с повредени файлове на Windows Update или достъп до мрежови споделяния. Всеки път, когато нещо на по-ниско ниво в стека на Windows се провали, но компонентът на по-високо ниво не си е направил труда да предаде конкретната причина нагоре, ще бъдете посрещнати с този код за грешка.

Истинският проблем е в преобразуването, а не в сложността

Липсващото ниво между системата и потребителя

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

Специфичен NTSTATUS код, описващ точно защо мениджърът на паметта не е работил, може да бъде съпоставен с общия Win32 ERROR_NOT_ENOUGH_MEMORY код, дори когато RAM може да не е действителният проблем. Възможно е системата да е изчерпала специфичен тип памет от пула на ядрото, който няма нищо общо с вашата оперативна памет. Но този нюанс се губи при преобразуването.

Една много специфична стойност на NTSTATUS може да показва, че определена операция е неуспешна, защото устройството е заето в определено състояние, но когато Win32 я превежда, се сблъсква с общо съобщение ERROR_BUSY. Няколко напълно различни NTSTATUS кода могат да се превърнат в един и същ код на Win32. В момента, в който той бъде опакован като HRESULT и ви бъде показан, единственото, което виждате, е, че нещо е заангажирано. Не и кое устройство, кой ресурс или защо.

При BSOD се прилагат съвсем други правила

Стоп кодовете срещу обикновените съобщения за грешки.

Blue Screen of Death (BSOD) или кодовете за грешка на синия екран на смъртта (BSOD) са свързани с начина, по който Windows ви показва кодове за грешки, но те са от съвсем друга област. Те все така се показват като шестнадесетичен код, но са с имена като CRITICAL_PROCESS DIED или MEMORY_MANAGEMENT. Имената са по-полезни от суровите числа и са много по-пряка индикация за мястото на възникване на проблема.

Това е вероятно единствената област в Windows, в която системата разполага с кодове за грешки, които могат да бъдат разчетени от човека. Въпреки това те не са добре представени на екрана. По-старите версии на Windows бяха по-зле в това отношение, като подхвърляха на потребителите случайни шестнадесетични числа и ги принуждаваха да декодират останалите. По-новите актуализации на Windows 11 най-накрая започнаха да поставят текста на преден план.

Превръщане на кодовете за грешки в Windows в нещо разбираемо

Инструменти и трикове, които действително помагат.

Microsoft никога не е искала да разбирате кодовете за грешки в Windows – ето какво всъщност означават те

Следващия път, когато видите код за грешка в стил 0x8007XXXX, премахнете префикса 0x8007 и потърсете останалата 16-битова стойност като грешка на Win32. Например 0x80070057 се превръща в 0x57, което се превежда като ERROR_INVALID_PARAMETER. Това показва, че записът в регистъра, стойността на конфигурацията или метаданните за актуализация са повредени. Голяма част от провалите на Windows Update се свеждат до точно такъв вид лош параметър.

Съществуват и инструменти, които могат да потърсят тези кодове за грешки вместо вас. Microsoft разполага с инструмент от команден ред, наречен err.exe, в SDK, който може да преведе кодовете NTSTATUS, Win32 и HRESULT в съответните им имена и описания. PowerShell също може да извлича Win32 кодовете за грешки чрез средата GetLastError. Освен това има и тонове сайтове за търсене на трети страни, като например James Darpinian’s Decoder или cable.arya.ch, където можете бързо да намерите конкретния код за грешка.

Проблемът не е в шестобалната система – проблемът е в лошата комуникация

Истинският проблем не е в това, че Windows съобщава кодове за грешки в шестнадесетичен формат или в многослойни системи за грешки. Всъщност те имат смисъл от инженерна гледна точка. Проблемът е, че Microsoft никога не си е направила труда да изгради подходящ човешки слой върху своята структура за докладване на грешки, оставяйки кодовете за грешки четими само за тези, които имат задълбочени познания за системата.

Добрият дизайн на грешки трябва да ви каже какво се е объркало, защо се е случило и какво можете да направите, за да го разрешите. Кодовете за грешки на Windows технически познават първите две неща, което означава, че могат да помогнат за третото; Microsoft просто никога не си е направила труда да ги направи четливи.

АбонаментВсичко важно от света на технологиите, директно в пощата ти.

С абонирането приемате нашите Условия и Политика за поверителност. Може да се отпишете с един клик по всяко време.


Коментирайте статията в нашите Форуми. За да научите първи най-важното, харесайте страницата ни във Facebook, и ни последвайте в Google Новини, TikTok, Telegram и Viber или изтеглете приложението на Kaldata.com за Android, iPhone, Huawei, Google Chrome, Microsoft Edge и Opera!

Абонирай се
Извести ме за
guest

3 Коментара
стари
нови оценка

Нови ревюта

Подобни новини