В квартире стояла летняя жара. Впрочем, ненадолго: хозяин квартиры как раз привез мне кондиционер, и его пора было запускать.
Через несколько недель
Я писал на C# программу для распаковки gzip-файлов и неожиданно поймал странное исключение, из которого следовало, что архив поврежден:
Unhandled exception. System.IO.InvalidDataException: The archive entry was compressed using an unsupported compression method. System.IO.Compression.Inflater.Inflate(FlushCode flushCode) at System.IO.Compression.Inflater.ReadInflateOutput(Byte* bufPtr, Int32 length, FlushCode flushCode, Int32& bytesRead) at System.IO.Compression.Inflater.ReadOutput(Byte* bufPtr, Int32 length, Int32& bytesRead) at System.IO.Compression.Inflater.InflateVerified(Byte* bufPtr, Int32 length) at System.IO.Compression.DeflateStream.ReadCore(Span`1 buffer) at System.IO.Compression.DeflateStream.Read(Byte[] array, Int32 offset, Int32 count) at System.IO.StreamReader.ReadBuffer() at System.IO.StreamReader.ReadLine() at MyApp.Program.ReadAllZippedLines(String filename)+MoveNext() at System.Linq.Enumerable.EnumerablePartition`1.MoveNext() at MyApp.Program.Main(String[] args) at MyApp.Program.<Main>(String[] args)
Ситуация выглядела дико: ошибка намекала на поврежденный архив, хотя сам файл не выглядел реально битым. Сказать, что это напрягало, значит ничего не сказать: если бы данные и правда оказались повреждены, потери были бы серьезные. Я просто запустил программу еще раз, и она... отработала нормально. Странно. Первая мысль была такой: может, Windows в этот момент держала файл открытым из-за антивирусной проверки, а я просто попал в неудачный момент.
Но через несколько минут ошибка вернулась. Я выключил Windows Defender, перезагрузил ноутбук и попробовал снова. Без толку. Самое неприятное было в том, что ошибка не воспроизводилась стабильно: иногда все работало, иногда нет.
На очередном запуске Visual Studio остановилась на нужной строке благодаря обработчику исключений. Я смог посмотреть, что происходит внутри C:\Program Files\dotnet\shared\Microsoft.NETCore.App\3.1.16\System.IO.Compression.dll:
internal int ReadCore(Span<byte> buffer) { this.EnsureDecompressionMode(); this.EnsureNotDisposed(); this.EnsureBufferInitialized(); int start = 0; while (true) { do { int num = this._inflater.Inflate(buffer.Slice(start)); start += num; if (start == buffer.Length || this._inflater.Finished() && (!this._inflater.IsGzipStream() || !this._inflater.NeedsInput())) goto label_7; } while (!this._inflater.NeedsInput()); int count = this._stream.Read(this._buffer, 0, this._buffer.Length); if (count > 0) { if (count <= this._buffer.Length) // здесь условие оказалось false this._inflater.SetInput(this._buffer, 0, count); else break; } else goto label_7; } throw new InvalidDataException(SR.GenericInvalidData); label_7: return start; }
Почему вообще count иногда оказывался больше длины буфера? Выглядело это так, будто либо размер буфера, либо сама переменная count в какой-то момент получали некорректное значение. Сам файл при этом не менялся, по крайней мере если верить SHA-1. Правда, во второй раз я даже не смог посчитать хеш: расширение для Проводника Windows, которым я пользовался, само упало с какой-то внутренней ошибкой.
Неужели я наткнулся на состояние гонки? Впрочем, сам распаковщик gzip не выглядел многопоточным, но я все равно пошел глубже по стеку вызовов:
private ZLibNative.ErrorCode Inflate(ZLibNative.FlushCode flushCode) { ZLibNative.ErrorCode errorCode; try { errorCode = this._zlibStream.Inflate(flushCode); } catch (Exception ex) { throw new ZLibException(SR.ZLibErrorDLLLoadError, ex); } switch (errorCode) { case ZLibNative.ErrorCode.BufError: return errorCode; case ZLibNative.ErrorCode.MemError: throw new ZLibException(SR.ZLibErrorNotEnoughMemory, "inflate_", (int) errorCode, this._zlibStream.GetErrorMessage()); case ZLibNative.ErrorCode.DataError: throw new InvalidDataException(SR.UnsupportedCompression); case ZLibNative.ErrorCode.StreamError: throw new ZLibException(SR.ZLibErrorInconsistentStream, "inflate_", (int) errorCode, this._zlibStream.GetErrorMessage()); case ZLibNative.ErrorCode.Ok: case ZLibNative.ErrorCode.StreamEnd: return errorCode; default: throw new ZLibException(SR.ZLibErrorUnexpected, "inflate_", (int) errorCode, this._zlibStream.GetErrorMessage()); } }
Иногда возвращался DataError, иногда StreamError. То есть что-то было не так либо с данными, либо с потоком. Формулировка, мягко говоря, не самая информативная.
Чтобы исключить банальную ошибку в коде, я попробовал распаковать gzip-файл из bash через gzip -dc file. В ответ прилетела странная ошибка “can’t seek file descriptor” при попытке чтения файла. Генерируется она вот здесь, в исходниках bash. Заодно я прогнал еще несколько gzip-файлов, и они тоже не распаковывались.
К этому моменту я уже всерьез подозревал порчу данных. Быстро открыл CrystalDiskInfo, проверил, нет ли переназначенных секторов, но ничего такого не увидел. Потом запустил sfc.exe /SCANNOW, и, насколько помню, он действительно нашел ошибки и исправил их. Я прогонял его еще и еще, и каждый раз он что-то чинил. Где-то на пятый запуск, кажется, ошибок больше не осталось.
В следующие несколько недель с ноутбуком начали происходить совсем уж странные вещи. Приложения запускались бесконечно долго, а иногда не запускались вовсе, исчезали иконки, текст превращался в кашу. Я уже решил, что ноутбук просто умирает. Но оставалась одна загадка: на батарее ничего подобного не происходило. Все странности начинались только при питании от сети. И почему тогда проблемы появились еще и у монитора, который я совсем недавно купил?
Пора копать глубже
Особенно меня насторожило то, что держать руки на корпусе стало неприятно. Это был уже немолодой MacBook Pro 2012 года с Boot Camp, но на алюминии не было никаких видимых следов износа. И снова всплыл тот же паттерн: дискомфорт появлялся только при работе от сети.
Отступление: к этому моменту мне уже два или три раза приходилось восстанавливать Visual Studio через Repair из-за каких-то совсем диких ошибок, по которым Google ничего не находил.
Полная картина сложилась, когда меня как следует ударило током от корпуса ноутбука. Тут я впервые всерьез подумал: а вдруг проблема вообще в электрике?
Ток там, где его быть не должно
К этому моменту у меня накопился такой набор симптомов:
На новом мониторе появлялись странные зелено-красные помехи.
На старом мониторе появлялись такие же зелено-красные помехи.
Трекпад неприятно пощипывал током.
Похоже, местами портились данные.
От ноутбука ощутимо било током.
Иногда свет в квартире после выключения как будто сам по себе чуть-чуть загорался снова.
Слишком уж странно выглядело совпадение, что и старый, и новый монитор показывали один и тот же набор артефактов. В начале года я еще и менял батарею в ноутбуке, так что не исключал и собственную ошибку.
Что вообще может заставить проводить ток то, что по идее проводить его не должно? Вариантов хватало:
Какое-то устройство подключено или собрано неправильно.
Проблемы с заземлением.
Что-то еще, о чем я пока не подумал.
Чтобы исключить влияние других устройств, я выдернул все из сетевого фильтра и включил ноутбук напрямую в розетку в ванной (она подключена через УЗО). После этого нагрузил его Prime95 примерно на 15 минут. Все выглядело нормально. Потом я подключил остальное обратно, и поначалу тоже было тихо.
А затем проблемы вернулись. Но не всегда, как мне тогда казалось. Со временем я заметил корреляцию: они проявлялись, когда на улице шел дождь или просто была высокая влажность. Неужели из-за сырости где-то что-то коротит?
Apple пишет, что использовать MacBook стоит при относительной влажности от 0% до 95% без конденсации. По температуре воздуха я тоже оставался в допустимых пределах. На всякий случай я выкрутил кондиционер на максимум, чтобы сильнее снизить и температуру, и влажность. Но стало только хуже.
Тогда я подумал: может, воздух, наоборот, слишком сухой? Попробовал поднять температуру на кондиционере, но это тоже ничего не дало.
Зато я заметил другое: проблемы коррелировали с включенным кондиционером, а кондиционер, в свою очередь, включался именно тогда, когда становилось жарко и душно.
К этому моменту я уже почти не сомневался, что дело в электрике. Я попросил хозяина квартиры прислать мастера. Пришел техник и посоветовал купить ИБП с AVR, то есть с автоматической стабилизацией напряжения.
Это такой ИБП, который сам подравнивает напряжение до нужного уровня, если оно проседает ниже порога. В моем случае речь шла о 120 В. Я и сам замечал, что свет иногда тускнеет, поэтому техник предположил, что все мои проблемы и с железом, и с софтом могут быть просто следствием просадок по питанию.
Я купил такой ИБП и сперва был очень доволен: он постоянно пищал, а значит, действительно фиксировал какие-то проблемы и компенсировал просадки напряжения.
Слишком уж постоянно. Пищал на созвонах, пищал за обедом, пищал, когда я пытался уснуть. Стоишь, пьешь воду, и тут... пиииип! Хорошо, что в тот момент я просто пил воду.
В какой-то момент я отключил звук, потому что он начал всерьез мешать и будить меня по ночам. По статистике ИБП за несколько дней уже успел отработать как минимум 20 инцидентов с питанием. "Ничего себе, пашет не зря", подумал я.
К сожалению, еще через несколько дней все проблемы вернулись.
Заземление
Следующим логичным шагом было проверить заземление. Заземление - это путь, по которому лишняя или нежелательная электрическая энергия безопасно уходит в грунт. Если с этим есть проблема, то лишний ток может не уходить куда должен. Терминологию я, возможно, местами коверкаю: я не электрик. Но смысл был именно такой.
Простой тестер розеток за 10 долларов быстро подтвердил подозрение: заземления не было.
Отступление: к этому моменту ноутбук стал почти непригоден к использованию даже на батарее. Начались случайные выключения, экран мог просто почернеть. В журнале событий сыпались записи, связанные с проблемами питания APIC. В итоге я параллельно купил новый ноутбук.
После этого я снова попросил хозяина квартиры прислать уже именно электрика. Он задал много вопросов, а потом предложил подключить кондиционер в другую розетку, потому что в квартире было две отдельные линии питания. Я так прожил несколько дней, но симптомы снова вернулись.
Я попросил приехать еще раз. На этот раз мне поставили совершенно новую розетку и заземлили ее (как мне сказали) через подключение водонагревателя: по крайней мере, после этого тестер начал показывать корректное заземление.
После этого, пусть один ноутбук к тому моменту уже и был фактически списан, проблемы исчезли. Никаких странных цветов на мониторе, никакого трекпада, от которого щиплет током, никаких ударов током от корпуса.
К чему я все это: иногда отладка выходит далеко за пределы IDE и сталкивается с реальным миром.
Комментарии (33)

apevzner
29.03.2026 12:24Полная картина сложилась, когда меня как следует ударило током от корпуса ноутбука. Тут я впервые всерьез подумал: а вдруг проблема вообще в электрике?
Теперь я узнал, как люди получают Дарвиновскую премию :)
Вообще говоря, автору прям повезло очень. А мог и помереть.
Пришел техник и посоветовал купить ИБП с AVR, то есть с автоматической стабилизацией напряжения.
Дурной совет, кстати.
Стабилизатор в ИБП представляет собой автотрансформатор с несколькими отводами и блок реле, который переключается между этими отводами.
Во-первых, он очень грубый. Скажем, такой ИБП обещает удерживать 220в ± 10%. На практике это означает, что при снижении напряжения до примерно 200в (-10%) ИБП скачком перейдёт на 240в (+10%). Я что-то не уверен, что это лучше, чем было в розетке до стабилизатора.
А во-вторых, контакты этих реле имеют тенденцию со временем подгорать. и от этого залипают. И вполне может быть так, что в какой-то момент одно реле уже замкнёт, а другое еще не успеет отпустить, из-за износа контактов. И тогда два отвода автотрансформатора окажутся ненадолго соединены между собой, а это - короткое замыкание, ИБП отключится по перегрузке (или за него это сделает автомат в щитке).
В итоге мы размениваем небольшие колебания напряжения, которые прекрасно бы съел блок питания компьютера, на периодические неожиданные отключения.
Это не теория, реальная практика. Переплачивая за ИБП со стабилизатором, мы приобретаем ненужный геморрой за собственные деньги.

achekalin Автор
29.03.2026 12:24ИБП с двойным преобразованием как раз закрывает все ваши сомнения. Но, будем честны, компьютерные импульсные блоки питания очень несинусоидальное потребление имеют...

apevzner
29.03.2026 12:24ИБП с двойным преобразованием
Они шумят…

achekalin Автор
29.03.2026 12:24Почему?
Опять же, вам шашечки или ехать? )

apevzner
29.03.2026 12:24Почему?
Потому, что всё время преобразовывают. Если считать, что у ник КПД - 90%, то 10% потребляемой электроэнергии им надо всё время рассеивать в виде тепла.
В отличии от них, “простые” ИБП когда всё ОК, ничего почти и не делают, только поддерживают заряд батарей небольшим током.
Опять же, вам шашечки или ехать? )
Зачем мне ИБП двойного преобразования?

achekalin Автор
29.03.2026 12:24Вы немного смешали разные типы ИБП.
В ИБП с двойным преобразованием (online) нагрузка всегда питается от инвертора. Сеть сначала выпрямляется в DC, затем снова формируется в AC. Батарея подключена к той же DC-шине, поэтому при пропадании сети никакого «переключения» не происходит — просто исчезает вход от выпрямителя, а инвертор продолжает работать от батареи. Отсюда и «нулевое время переключения» — не потому что оно мгновенное, а потому что события переключения как такового нет.
Байпас — это отдельный режим (обход), который используется при перегрузке, неисправности или иногда для повышения КПД. В нормальном режиме online-ИБП через байпас не работает.
По поводу КПД: да, у двойного преобразования он ниже, чем у line-interactive, потому что энергия проходит через два этапа преобразования (AC→DC→AC). Но это осознанная плата за качество питания: стабильное напряжение, частота, фильтрация помех и полная развязка от входной сети. В современных моделях КПД обычно 92–96% в нормальном режиме и выше в ECO (если он включен, но тогда это уже не «чистый online» режим).
P.S. Если обсуждать миллисекунды переключения или «как быстро он перейдет на батарею» — это применимо к line-interactive/offline, но не к системам с двойным преобразованием.

hardegor
29.03.2026 12:24Не поможет. Скорее всего появилась сильная утечка конденсатора, который стоит в блоке питания между фазой и землёй, или ещё где-то протекло. Заземление как-раз помогло -утечка пошла в землю, но надо ремонтировать блок питания ноута.

iamkisly
29.03.2026 12:24А мог и помереть
На преддипломной в колледже посадили паять какие-то платы с интегрированным блоком питания. Через время пришел техдиректор посмотрел на ожоги на ладонях от тыканья в импульсный источник питания и сказал "пересадите его куда-нибудь где он не убьется". Так я не получил премию дарвина.. Лысый спасибо тебе )

apevzner
29.03.2026 12:24Я в детстве пытался починить ламповый радиоприёмник
В общем, экспериментальный факт: 250в постоянного тока меня не убивает. Но удовольствие прям сильно ниже среднего
У человека с другой проводимостью кожи и результат может оказаться другой

DvoiNic
29.03.2026 12:24Я в детстве частенько чинил телевизоры в семье (стандартная проблема - хреновая облудка контактов ламповых панелек, отчего терялся контакт), поэтому тоже получал немало "экспериментальных фактов" от неразряженых конденсаторов... В результате уже к институту твердо понял: "цифра", где нет таких напряжений, гораздо более приятна для жизни и работы...

DvoiNic
29.03.2026 12:24Скажем, такой ИБП обещает удерживать 220в ± 10%. На практике это означает, что при снижении напряжения до примерно 200в (-10%) ИБП скачком перейдёт на 240в (+10%).
Есть еще "умельцы", которые "для улучшения" включают последовательно два стабилизатора. И вот напряжение просаживается, сначала на повышение один стаб уходит, потом при провале второй... а потом (где-то там на линии отключается автомат, на котором висит большая нагрузка) напряжение на некоторое время становится нормальным, "штатным"... А вот всем на выходе - в этот момент резко плохеет...

MountainGoat
29.03.2026 12:24В игре God of War можно задолбать белку, если постоянно дёргать его за колокольчик.
В реале же можно задолбать ML алгоритм, если постоянно учить его возвращать температуру процессора, не давая доступ к сенсору. В итоге он начнёт сообщать температуру, ориентируясь только на ошибки в делении и на последовательность выполнения потоков (как следствие частоты процессора. )

GidraVydra
29.03.2026 12:24Windows Defender...bash...на макбуке...

achekalin Автор
29.03.2026 12:24Да. Сам удивился, однако у человека еще тот, интеловский МакБук, bootcamp, ну и баш под виндой
немолодой MacBook Pro 2012 года с Boot Camp, но на алюминии не было никаких видимых следов износа.
Вполне понятен выбор человека - один из лучших буков под винду, особенно, если не гнаться за последними версиями windows.

GidraVydra
29.03.2026 12:24На таком железе сейчас разве что интернет-серфингом заниматься, да и то, в весьма экономном режиме. Но автор там работает в Visual Studio. Или он и за новыми версиями студии не гонится?

achekalin Автор
29.03.2026 12:24Я так понимаю, в том буке 16 Гб ОЗУ, а ведь вроде не так давно было время, когда 16 Гб было ого-го!
Ну и да, если человек за свои покупал, скажем, и, скажем, экономно относится, а код разрабатывает аккуратно, а не вот эти мегапроекты, как порой MS загнёт, вроде "калькулятор всего на полгига", то и жить можно...

sirmax123
29.03.2026 12:24Я возможно не понимаю но если честно, проблема кажется придуманной (ИИ)
Какие могут быть проблемы у ноута с внешним БП - если что то не так, ноут уйдет на батарею
Бить током от ноута - кто-то может пояснить КАК?
Если от БП идет 110 (220), на разве в цепях питания не будет пробоя?
В общем, история не похожа на правду, особенно отсутвие заземления - в МАК-буках как минимуму европейскиж БП есть варианты вообще без заземления
DvoiNic
29.03.2026 12:24Бить током от ноута - кто-то может пояснить КАК?
Если в БП есть какая-то емкостная связь между сетью и выходом. В обычных десктопах обычно емкости на входе (как выше уже сказали) могут такое обеспечивать, а вот в бп ноутов (и конкретно маков) - не знаю. сомнения тоже берут,

apevzner
29.03.2026 12:24Бить током от ноута - кто-то может пояснить КАК? Если от БП идет 110 (220), на разве в цепях питания не будет пробоя?
Очень просто.
Представим себе, от БП должны идти условные 19в. Т.е., в одном проводе 0, в другом +19.
А теперь представим, что из-за пробоя в одном проводе идёт 0 + 110 переменного тока, в другом - 19 + 110 того же переменного тока.
С точки зрения самого ноута ничего не изменилось, как было 19в между входными проводами питания, так и осталось.
Но только вот теперь дополнительно появилось 110в переменного тока на корпусе. Ноуту это не заметно, а вот человеку, который может касаться рукой металлического корпуса а ногой - чего-нибудь заземленного, вломит по полной программе.
С этим лучше не шутить.

Loco2k
29.03.2026 12:24Классика.. у меня на компе отваливались мышь с клавиатурой, когда компрессор кондиционера менял режим работы. Комп с ним был на одной линии без заземления.
Как было сказано выше, все проблемы по питанию чувствительного оборудования решаются ИБП с двойным преобразованием. Если совсем всё плохо, то по сигнальным интерфейсам ещё доп гальваническая развязка, а лучше оптика.

qwe101
29.03.2026 12:24При выключении холодильника висла клавиатура (только клавиатура). Сначала сделал кнопку RESET на клавиатуре, потом поставил фильтр (ферритовый бочонок) на провод питания, и всё хорошо.

qwe101
29.03.2026 12:24Кстати, стандартно: на хороших БП стоит емкостной фильтр, с обоих входов на землю, и корпус. на землю. Если земли фактически нет, как у всех в старых домах и половине новых, а на входе ноль и фаза, как положено, то фильтр превращается в делитель напряжения и на корпусе появляется половина входного напряжения относительно земли (ноль - это примерно земля). Ёмкости маленькие, ток маленький, но кусает. Электронику при подключении убить может. А если пробьётся конденсатор к фазному проводу, то премия Дарвина очень вероятна. Поэтому на многих блоках есть обозначение L-N, фаза-ноль, там схемотехника входов не симметричная. И в розетке ноль и фаза должны быть в определённых дырочках, только кто на это смотрит? " Сойдёт и так, 30 лет делаю как придётся, и пока жив! ". Соблюдайте хоть что нибудь!
ky0
У меня как-то было, что вайфай постоянно отваливался при определённом HDD, подключенном в соседний системник. Вынимаешь HDD - всё ок; выключаешь системник - всё ок; переставляешь HDD в другое устройство, включаешь - вайфай отваливается.
YMA
Устройство, подключаемое по USB3 может создавать помехи устройствам, работающим на 2.4GHz, в том числе WiFi, BT и всяким другим радиоприблудам. Если сделано криво, конечно же. У меня тоже есть такой внешний диск, подключаешь его - и клавиатура с мышью начинают тормозить.
https://help.keenetic.com/hc/ru/articles/213968889-Возможные-сбои-в-работе-сети-Wi-Fi-после-подключения-устройства-с-интерфейсом-USB-3-0-к-интернет-центру
ky0
В том-то и дело, не внешний диск - абсолютно обычный, внутренний.
YMA
SATA-600 в том же диапазоне фонит (просто обычно там все в железном корпусе и наружу сильно не пробивается), а вот если у вас был NVME - то это уже суровое колдунство. :)
iamkisly
Емнип у первых ревизий Routerich с шиной usb3.0 был такой же побочный эффект