Обновить
32K+

Отладка *

Поиск и устранение ошибок в коде

16,8
Рейтинг
Сначала показывать
Порог рейтинга
Уровень сложности

Async на Rust завис: как понять, где именно, когда паники нет и стек молчит

Уровень сложностиСложный
Время на прочтение13 мин
Охват и читатели7.6K

Сервис жив, CPU в норме, паники нет — а часть запросов зависает на минуты. В async‑Rust привычный стек часто мало помогает: задача могла застрять на блокирующем вызове, мьютексе или просто перестать получать пробуждения.

Разбираем, как отличать эти сценарии в Tokio и куда смотреть, когда отладчик молчит.

Читать далее

Новости

Стек отвечает «где упало», а вопрос был «что случилось»

Уровень сложностиСредний
Время на прочтение6 мин
Охват и читатели5.6K

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

Читать далее

Вторая копия Vue: как лишняя строка в lockfile повесила Chromium

Уровень сложностиСредний
Время на прочтение12 мин
Охват и читатели11K

Может ли лишняя запись в yarn.lock повесить браузер? Наша прожила в репозитории три месяца, не привлекая внимания, а потом ночью после релиза положила прод вечным лоадером - причём только в Chromium. Рассказываю, как мы шли к разгадке через ложные следы и что в итоге оказалось в рантайме.

Читать далее

Нагрузочный тест Sockudo: два бага в чужом Rust‑коде, которые кладут сервис на ровном месте

Уровень сложностиСредний
Время на прочтение13 мин
Охват и читатели5.7K

Я делаю NotiBox — Pusher‑совместимый сервис realtime уведомлений. Под капотом я использую Sockudo — WebSocket сервер на Rust. Прежде чем показывать реальным пользователям, я решил проверить, на сколько Sockudo на самом деле «blazingly fast».

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

Идеальный сценарий — полная загрузка процессора, памяти или сети, тогда ты реально нашёл предел ресурсов. Проверяешь масштабируемость и готово.

Другой сценарий — ничего не перегружено, но новые соединения/запросы не проходят, растёт задержка ответов. Это тоже ожидаемо и понятно как чинить: смотришь на TIME WAIT сокеты, max open files, и другие «предохранители».

А что делать, если там тоже всё по нулям? Вот тут начинается настоящее приключение.

Читать далее

Infostart Toolkit Air 2026.2: быстрее анализировать запросы и отлаживать отчеты СКД

Уровень сложностиПростой
Время на прочтение4 мин
Охват и читатели7.2K

В новой версии переработан вывод результатов запросов, расширены возможности Консоли СКД и упрощен перенос пользовательских алгоритмов между информационными базами.

Основные изменения Infostart Toolkit Air 2026.2 связаны с повседневными задачами 1С-разработчиков: анализом результатов запросов, поиском данных в больших выборках и отладкой отчетов на СКД. Результаты запросов теперь можно просматривать не только в таблице, но и в виде дерева. В обоих режимах доступны фильтрация и быстрый поиск, а при работе с несколькими коллекциями — поиск нужной таблицы по части имени. Вывод данных также оптимизирован: результаты загружаются только после выбора соответствующего элемента, что сокращает потребление памяти.

Читать далее

Мой код терял бы 230 байт из 231. Чтобы это увидеть, пришлось патчить QEMU

Уровень сложностиСредний
Время на прочтение10 мин
Охват и читатели14K

Через четыре часа после первой статьи пришёл комментарий: в моём коде не хватает трёх инструкций, и на настоящей плате он рассыплется.

Читатель arteast был прав.

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

Моя ошибка внутри эмулятора не проявляется вообще. Проверить себя было нечем.

Пришлось чинить эмулятор.

Ну, чини!

Почему кнопка «Войти через VK» заняла три дня. Кейс

Уровень сложностиПростой
Время на прочтение6 мин
Охват и читатели8.8K

На первый взгляд, Social Login — одна из самых простых функций современного веб-приложения.

Добавить кнопку «Войти через VK». Добавить кнопку «Войти через Яндекс». OAuth 2.0 давно стандартизирован, OpenID Connect тоже. Документации и библиотек полно. Да и AI сегодня умеет писать интеграции быстрее человека. Поэтому, когда я решил добавить VK ID и Яндекс ID в Авторизу, честно рассчитывал уложиться в один рабочий день:

Свою систему знаю. OIDC знаю. Подобные интеграции раньше проектировал. Под рукой ChatGPT, Claude и AI-агенты.

Что вообще может пойти не так?

Спойлер: получилось почти три дня. И самой сложной частью оказался не OAuth.

День первый. Самоуверенность

Читать далее

Логгер в топе VTune: как найти строки, создающие нагрузку

Уровень сложностиСредний
Время на прочтение6 мин
Охват и читатели7.4K

Профайлер показывает write() и worker файлового логгера среди верхних стеков. Однако системный профайлер не знает, какая из тысяч строк вывода в лог породила нагрузку. Отключать логирование совсем — ужасное решение. Как же связать файловый ввод-вывод с конкретными строками вывода в лог, каналами и backend?

Читать далее

Проектирование меню в стесненных условиях

Уровень сложностиСредний
Время на прочтение12 мин
Охват и читатели9.9K

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

Читать далее

Линейки версий WordPress под микроскопом

Уровень сложностиПростой
Время на прочтение17 мин
Охват и читатели7.5K

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

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

Чтобы показать вам драматизм ситуации, я для примера провёл с помощью профилировщика PHP измерение ресурсозатратности каждой линейки семейства WordPress - это версии 1, 2, 3, 4, 5, 6 и недавняя 7.

Кому интересно, прошу под кат. Увидите, как от первых версий, на которых WordPress завоёвывал славу легковесной блоговой системы, он пришёл в конце концов к многократно утяжелённой платформе по множеству срезов измерения.

Читать далее

Просто дайте мне ввести цифры

Время на прочтение10 мин
Охват и читатели8.9K

Цифровая идентификация и её значение для веба в последние годы стали темой горячих обсуждений. Они привнесли с собой множество спорных моментов: законы о проверке возраста и их влияние на онлайн-анонимность; Википедия потенциально будет вынуждена верифицировать в Великобритании личность пользователей; привязка к официальным операционным системам iOS и Android стала обязательным форм-фактором для кошельков цифровой идентификации; кроме того, стоит упомянуть ситуацию, когда американские цифровые аккаунты были закрыты потому, что их пользователь был судьёй Международного уголовного суда.

В своей истории я расскажу о швейцарской правительственной системе идентификации AGOV. Этот развёрнутый в 2024 году сервис сегодня насчитывает 1,6 миллиона аккаунтов и становится всё более необходимым: через него можно получать пособие по безработице, предоставлять налоговую декларацию (а это обязательное действие!) и выполнять множество других операций. В кантоне Цюрих это единственная возможность подачи заявления на гражданство.

В конечном итоге, я был вынужден создать аккаунт AGOV. К сожалению, его регистрация была довольно сложной задачей, пока я не нашёл причины странного бага accessibility. Вдохновившись статьёй «Просто дайте мне выделить текст», хочу представить вашему вниманию «Просто дайте мне ввести цифры».

Читать далее

Профилировщик CMS-движков для вебстудий

Уровень сложностиПростой
Время на прочтение6 мин
Охват и читатели14K

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

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

Для поиска таких мест были созданы разные инструменты профилирования. Этим термином называют всестороннее измерение нагрузки, оказываемой исследуемым скриптом на сервер сайта. Например, для языка PHP наиболее известными профилировщиками кода являются следующие: Blackfire, Xdebug Profiler, Tideways, XHProf/XGHui.

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

Для решения подобной узкой задачи я разработал очень простой бесплатный профилировщик PHP. Так сказать, студийную версию профайлера, то есть урезанную до объёма, достаточного вебмастеру при работе над проектами в студии. И делюсь этим скриптом с сообществом. Кому интересно, прошу под кат.

Читать далее

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

Уровень сложностиСредний
Время на прочтение7 мин
Охват и читатели8.6K

В 1990-м Titus выпустила Fire & Forget II: гонку, где спорткар с пулемётом умеет взлетать. Я гонял её ребёнком с одной дискеты, а недавно полез внутрь её бинарника, просто посмотреть, как она устроена. Внутри оказалось неожиданно много: кооперативная многозадачность на голом 8086, собственный скриптовый язык с французскими мнемониками, две виртуальные машины, исполняющие один и тот же байткод, и полминуты игры самого разработчика, спрятанные в демо-записи. Их не видел никто и никогда. По дороге игра пересобралась на C11 и теперь живёт в браузере: не трогайте клавиатуру в меню, и увидите то самое демо. Но статья не про порт:

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

Читать далее

Ближайшие события

Структуры данных на практике. Глава 16: Фильтры Блума и вероятностные структуры данных

Время на прочтение12 мин
Охват и читатели13K

Наш веб-краулер потреблял 128 МБ ОЗУ только на отслеживание посещённых URL. На встраиваемом устройстве с 256 МБ это была половина всей памяти.

Задача краулера была простой: отслеживать посещённые URL, чтобы не краулить одну и ту же страницу дважды. После обработки 1 миллиона URL (средняя длина 80 байт) хэш-таблица, в которой хранились эти URL, разрослась до 96 МБ плюс оверхед.

«Можем ли мы обменять точность на память? Нас вполне устроит несколько дублированных операций, если это позволит сэкономить большой объём памяти», — сказал мне мой менеджер во время ревью кода.

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

Читать далее

Самодельный BIOS для микшерного пульта и запуск DOS на нём

Уровень сложностиСредний
Время на прочтение22 мин
Охват и читатели14K

В 1994 году у меня появился первый компьютер: Intel i486 DX2-66 с 4 МБ ОЗУ и жёстким диском на 512 МБ. На нём были установлены IBM OS/2 и Microsoft Windows 3.11. Следующие четыре года я апгрейдил эту машину каждые несколько месяцев, добавляя больше ОЗУ (до 16 МБ), привод CD-ROM и карту SoundBlaster. Так я научился апгрейдить эту машину, устанавливать новое ПО, а потом и писать ПО на BASIC. Но я ни разу не касался процесса запуска и тонкостей MS-DOS.

В 2026 году, 32 года спустя, я узнал из скриншотов DDX3216, что в Behringer использовался настоящий процессор 386. В моём мозгу сразу же активировались какие-то нейроны и я начал размышлять о том, можно ли запускать на этом устройстве ПО или даже полнофункциональную операционную систему. Для этого мне нужно было разобраться, как запускается система x86, когда управление перехватывает DOS и что необходимо для попадания в оболочку.

Читать далее

ACPI: тайна взаимодействия прошивки и ОС

Уровень сложностиСредний
Время на прочтение16 мин
Охват и читатели8.4K

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

Одним из ключевых механизмов такого взаимодействия является ACPI (Advanced Configuration and Power Interface). Эта спецификация определяет, каким образом прошивка платформы описывает аппаратную конфигурацию системы, а операционная система получает возможность управлять устройствами, питанием и событиями платформы без необходимости знать все детали конкретной реализации материнской платы или SoC.

Читать далее

Путь к ошибке: зачем нужны «Breadcrumbs» во frontend-мониторинге

Уровень сложностиПростой
Время на прочтение4 мин
Охват и читатели8.3K

Пользователь столкнулся с ошибкой в вашей программе. Трекер ошибок ее зафиксировал. Стек-трейс показывает место сбоя. Но что делал пользователь за несколько секунд до этого? Какие запросы выполнялись? На каком шаге сценарий пошёл не так?

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

Читать далее

AtelTerminal — терминал со встроенным языком для работы с COM/Ethernet/WIFI/Bluetooth устройствами

Время на прочтение5 мин
Охват и читатели8K

В процессе борьбы со всевозможными COM/Ethernet/WIFI/Bluetooth RS-485 устройствами, в том числе встраиваемыми, программаторами и тд. столкнулся с тем, что автоматизировать работу с устройством практически нечем. Т.е. написать полноценный сценарий для имитации целевого устройства, обеспечить обмен данными с во всех возможных вариантах без ручного управления не получится ничем. На форумах умники советую брать питон, что сложно для схемотехников и иногда медленно. Самые продвинутые терминалы позволяет создавать макросы, некоторые — группы макросов без возможности полноценного анализа. Поэтому пришлось наваять терминал со встроенным скриптовым языком.

Цель — создать инструмент для широкого круга пользователей, схемотехников, радиоинженеров, которые недолюбливают среды программирования. Поэтому скриптовый язык делался максимально простым, никаких рекурсий, сложных выражений, лямбд, грамматических конструкций и пр. Также сделать простым работу с данными, предоставить возможность работать с несколькими устройствами одновременно. Унифицировать способы подключения (COM/Ethernet/WIFI/Bluetooth) устройств. Иметь в распоряжении специфические функции, которые решают задачу в комплексе.

Читать далее

Собираем эмуляцию USB-устройства с помощью Buildroot с использованием USB Gadget для запуска в QEMU

Уровень сложностиСредний
Время на прочтение11 мин
Охват и читатели6.9K

В статье я расскажу, как эмулировать работу USB-устройства без наличия физического устройства. Для этого мы соберем маленький Linux-дистрибутив в Buildroot (~60мб), который с помощью USB Gadget будет притворяться реальным периферийным устройством - Modbus Slave (но можно любым дргим: мышкой, камерой и т.д.). Запустим несколько таких “устройств” с помощью QEMU, подключим их в Windows через USBip.

Читать далее

Исходный код Jedi Academy переполнен яростными комментариями разработчиков

Уровень сложностиПростой
Время на прочтение4 мин
Охват и читатели54K

Недавно я вспомнил о игре Star Wars Jedi Knight: Jedi Academy, на которую подростком потратил больше десяти тысяч часов. Изучая материалы о ней, я наткнулся на любопытную историю.

Оказывается в 2013 году, сразу после покупки Lucasfilm компанией Disney и закрытия LucasArts, разработчики Raven Software запаниковали, что их работа будет навсегда положена под сукно, поэтому они в спешке выложили весь исходный код Jedi Outcast и Jedi Academy онлайн.

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

Заглянув в основной файл боёв (bg_saber.c), можно увидеть, что вся система схваток на световых мечах представляет собой огромную спагетти-конструкцию switch из пяти тысяч строк.

Я прошерстил кодовую базу и нашёл потрясающие комментарии...

Читать далее
1
23 ...