Обновить
128K+

Отладка *

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

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

Баги, которые не ловит Rust

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

В апреле 2026 года Canonical раскрыла 44 CVE в uutils — реализации GNU coreutils на Rust, которая поставляется по умолчанию с версии 25.10. Большинство из уязвимостей обнаружилось при внешнем аудите, проведённом перед выпуском 26.04 LTS.

Я изучил список и решил, что из него можно многому научиться.

Примечательно то, что все эти баги оказались в кодовой базе на Rust, написанной людьми, которые знают, что делают, и ни один из багов не был отловлен механизмом проверки заимствований, clippy lints и cargo audit.

Я пишу эту статью не для того, чтобы покритировать команду разработчиков uutils. Ровно наоборот: мне хочется поблагодарить её за публикацию результатов аудита с подробностями, благодаря которым все мы можем научиться чему-то новому.

Кроме того, на нашем подкасте Rust in Production недавно был вице-президент по разработке Ubuntu Джон Сигер, заслуживший похвалы слушателей за честный рассказ о состоянии Rust в Canonical.

Если вы пишете системный код на Rust, то эта статья будет самым сжатым анализом того, где сейчас заканчивается безопасность Rust.

Читать далее

Новости

Сепаратор для логов. Сжимаем логи для контекста LLM без потери читаемости

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

logzip — утилита для сжатия логов перед анализом в LLM. Вместо того чтобы отправлять в Claude/GPT сырые 10 МБ лога, мы сжимаем его до 3.4 МБ (−58%), сохраняя полную читаемость и видимость ошибок. Статья рассказывает о проблеме (Lost in the Middle, переплата за мусорные токены), архитектуре на Rust, алгоритме Recursive BPE и реальном ROI: −$2,070 в год на API.

Проект open source (MIT), интегрирован с Claude Desktop через MCP.

Читать далее

Ножом и термофеном: реверс-инжиниринг USB-устройства

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

В 2024 году bjiru выложил видео о портативном устройстве ME2 — выпущенной примерно в 2008 игрушке, способной при помощи USB синхронизировать очки и драгоценности между устройством и онлайн-миром. Игра была крайне нишевой, поэтому никто не архивировал её ПО, драйверы и ресурсы; по крайней мере, до тех пор, пока bjiru не создал онлайн-клиент игры.

Я руководитель Miuchiz Reborn — созданного в 2015 году проекта по реверс-инжинирингу, эмуляции и поддержке доступности похожей игры, состоящей из онлайн-части и портативного устройства, соединяемых через USB. ME2 тоже была старой игрой подобного типа, поэтому моя группа Miuchiz рассказала мне о ней ещё в 2018 году; она считала (ошибочно), что они могут быть архитектурно схожи. Несмотря на то, что я уже несколько лет знал о существовании устройства, именно видео bjiru подтолкнуло меня начать его исследование.

Поначалу я занимался исключительно воссозданием сервера, необходимого для обеспечения функциональности копии компьютерной игры, принадлежащей bjiru, но со временем я обратил внимание и на портативное устройство. Разумеется, воссоздание онлайн-игры не было бы полным без механизма синхронизации очков с устройством. В конце концов, это общение между компьютером и устройством ME2 было основной «фишкой» игры. Я подумал, что мой предыдущий опыт работы с портативными устройствами Miuchiz поможет мне в анализе ритуала необходимого им общения... если мне удастся выполнить реверс-инжиниринг кода.

Читать далее

Структуры данных на практике. Глава 14: Обработка строк и эффективность использования кэша

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

«В Computer Science есть только две сложные вещи: инвалидация кэша и придумывание названий», — Фил Карлтон

Разрыв в производительности

Наш парсер логов обрабатывал 800 тысяч строк в секунду. Нам требовалось 3 миллиона строк в секунду. От нужного нам показателя мы отставали в 3,75 раза.

Задача инструмента заключалась в парсинге строк логов в реальном времени, извлечении временных меток, уровней логов и сообщений из миллионов строк в секунду. Обработка миллиона строк логов в текущей реализации требовала 1,25 секунды — слишком долго для анализа в реальном времени.

Профилировщик показывал 85 миллионов промахов кэша. Для обработки строк это казалось слишком большим показателем.

В реализации использовались стандартные строковые функции C — простые, читаемые, но, очевидно, слишком медленные.

Я переписал этот код, добавив обработку строк с учётом кэша. Результаты были такими:

В 4,5 раза быстрее и в 7 раз меньше промахов кэша.

В этой главе мы поговорим о том, как эффективно использовать кэш при обработке строк.

Читать далее

MemHawk: часть 2. Real-time flamegraph в вашей Grafana

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

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

Сегодня рассмотрим как получилось совместить быстрый профайлинг с удобством визуализации в Grafana в реальном времени.

Ключевые особенности:
Flamegraph аллокаций и деаллокаций за интервал времени
График потребления памяти с детализацией до функции/строчки в коде(настраиваемо)
Flamegraph в момент пика памяти
Flamegraph суммарного числа аллокаций
Flamegraph суммарного объема аллокаций

Звучит интересно!

Структуры данных на практике. Глава 13: Структуры данных без блокировок

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

«Блокировки — это goto конкурентного программирования», — Морис Херлихи

Проблема 60%

Наша система логгинга тратила 60% своего времени на ожидание снятия блокировок. Не на выполнение полезной работы, только на одно ожидание.

Восемь ядер, пытавшихся записывать сообщения логов, имели общий кольцевой буфер. Реализация была простой: буфер защищался мьютексом. При высокой нагрузке, когда все ядра записывали логи одновременно, профилировщик демонстрировал ужасный паттерн: 60% тактов CPU тратилось на операции с мьютексом.

Пропускная способность: 850 тысяч сообщений в секунду. В восьмиядерной системе она должна быть гораздо выше.

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

Этот вопрос привёл к полной смене архитектуры...

Читать далее

Потоковая запись ADC семплов на STM32

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

В этом тексте я показал как настроить потоковую запись ADC семплов на микроконтроллере STM32.

ADC модуль это основа любого электронного измерения. Основа любого DMM. Всё что за корпусом микроконтроллера - это аналоговый мир. ADC это портал который позволяет аналоговым сигналам просачиваться в мир цифры.

Читать далее

Лечим загрузчик часов Redmi Watch 5 от падений

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

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

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

Читать далее

Как я экономлю 80% контекста нейросетей при работе с логами

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

Разаработанная фоновая утилита позволяет производить вставку сжатых логов с абсолютной прозрачностью для восприятия AI агентами. В статье описал свой путь к оптимизации сжатия до 80%.

Читать далее

Структуры данных на практике. Глава 12: Кучи и очереди с приоритетом

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

«Плохие программисты беспокоятся о коде. Хорошие программисты беспокоятся о структурах данных и их взаимосвязях», — Линус Торвальдс

Споры о планировщике

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

Вставлять новые задачи с приоритетом (O(log n))

Запрашивать задачу с наибольшим приоритетом (O(1))

Удалять задачу с наибольшим приоритетом (O(log n))

Кто-то предложил: «Давайте используем отсортированный массив». Но вставка будет занимать O(n) — придётся сдвигать элементы.

Кто-то ещё сказал: «Возьмём связанный список». Однако поиск наибольшего выполняется за O(n) — необходимо сканировать весь список.

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

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

Читать далее

Вайбдебаггинг — уже реальность? Мы дали ИИ-агенту отладчик и проверили

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

В конце прошлого года Cursor выпустил Debug Mode — режим, в котором агент может собирать логи из рантайма, чтобы лучше понимать причины багов. Судя по реакции на Reddit, идею приняли с интересом.

Но что, если пойти более прямым путём? Дать агенту «руки», чтобы он отлаживался так же, как это делает разработчик: ставил брейкпоинты, ходил по ним, выполнял evaluate expression? Этим вопросом недавно задались исследователи из Microsoft Research и сделали экспериментальный фреймворк Debug2Fix. Субагент, оснащённый инструментами для взаимодействия с отладчиком, разбирался с багами из датасетов GitBug-Java и SWE-Bench-Live на 20% лучше, чем обычный агент без таких инструментов.

Если агент уже интегрирован с IDE, естественно дать ему доступ к полноценному дебаггеру, когда он так близко. Тем более что этим занимаются даже в Microsoft. Поэтому в недавнем релизе своего ассистента для IntelliJ мы добавили Debug Agent, позволяющий агенту взаимодействовать с дебаггером в среде разработки.

Сегодня попробуем починить реальный баг с помощью агента с инструментами дебаггера в IDE и Cursor в Debug Mode и проверим, действительно ли ИИ нужен полный доступ к отладчику или достаточно и хорошего логгирования.

Читать далее

Анализ технологии Denuvo

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

Этот пост предназначен исключительно для образовательных целей. Denuvo считается одним из самых успешных решений для управления цифровыми правами, поэтому оно многим интересно. В этом посте представлен большой объём моих личных заметок и переписки с другими реверс-инженерами (см. раздел «Благодарности»), содержащий информацию о последних версиях Denuvo; многое из этого раньше не публиковалось.

Я не стремлюсь нанести какой-либо ущерб Irdeto, поэтому часть информации была вырезана из поста.

Читать далее

Мост для ко-симуляции в Icarus Verilog и NGSpice

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

Автор: Cyberflex (по мотивам реальной разработки бриджа для Ко-симуляции "MixFighter")

Как мы сделали мост между Icarus Verilog и NGSpice: две разных реализации архитектуры.

Читать далее

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

SherlockOps, или как мы победили мониторинг

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

На протяжении всего моего опыта работы DevOps-инженером, я всегда терпеть не мог мониторинг, алерты и всё что с этим связано. Мало того, что я не любил всё это настраивать, но больше всего я ненавидел получать и резолвить алерты.

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

Читать далее

У меня нет звука, но я должен слышать: история одной регрессии ядра

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

Что делать, если после очередного обновления Linux на старом ноутбуке намертво отвалился звук, а в логах висит зловещее CORB reset timeout и 0xFFFF? Переустановка аудио-серверов не поможет, параметры загрузчика GRUB система упорно игнорирует, а LTS-ядро больше не гарантирует стабильности. В этой статье разбираем, как спуститься в логи dmesg, понять, почему устройство «задыхается» на шине PCI, и заставить ядро заново проинициализировать аудиокарту «на горячую» с помощью sysfs и systemd.

Найти звук

Как я перестал мучить людей дисклеймерами и научил нейросеть заполнять фильтры

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

У меня сайт по поиску работы. Там куча джоб-бордов подключена — hh, SuperJob, Зарплата, ТрудВсем и ещё пара штук. Всё круто, вакансии тянутся, ИИ помогает резюме составлять. Но была одна проблема, которая убивала всю конверсию на корню.

Люди не могли пользоваться поиском.

Вот серьёзно. Заходишь в аналитику — и видишь: человек открывает страницу с фильтрами, смотрит на все эти поля, что-то тыкает, жмёт «Найти» — и получает фигню. Либо 500 вакансий дворников, хотя он вообще-то бухгалтер, либо пустой экран «ничего не найдено». И уходит. Навсегда.

Я думал: ну это же элементарно! Написал в строке «Python разработчик», выбрал город Москва, зарплату от 200к — и готово. Как на любом нормальном сайте. Но нет. Люди как будто впадали в ступор. Я начал копать.

Читать далее

Обзор учебно-тренировочной платы JZ-F407VET6 (или электронная парта)

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

В этой заметке я произвел обзор учебно-треннировочной электронной платы JZ-F407VET6.
Это простая и дешевая PCB часто выручает при прототипировании и отладке программных компонентов.

Читать далее

Баг на тёмной стороне Луны

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

Код бортового управляющего компьютера космического аппарата Аполлон (AGC) — одна из самых тщательно исследованных кодовых баз в истории. Её прочитали тысячи разработчиков. Учёные публиковали статьи о её надёжности. Эмуляторы выполняют её команда за командой. Мы обнаружили в ней баг, который, похоже, оставался незамеченным пятьдесят семь лет: блокировку ресурсов в коде гироскопического управления, приводящую к утечке на ошибочный путь и отключающую возможность изменения положения платформы наведения.

Для преобразования 130 тысяч строк ассемблерного кода AGC в 12,5 тысячи строк спецификаций мы воспользовались Claude и Allium — нашим опенсорсным языком создания поведенческих спецификаций. Спецификации были выведены из самого кода, и этот процесс направил нас непосредственно к багу.

Читать далее

Аудит сайта, который навайбкодил CEO Y Combinator

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

Я провёл аудит веб-сайта CEO Y Combinator Гарри Тана после того, как он похвастался, что выдаёт по 37 тысяч строк кода в день, и держит этот темп уже 72 дня. В статье я покажу, как на самом деле выглядят в продакшене 78,4 тысячи строк ИИ-слопа. При загрузке одной главной страницы http://garryslist.org в 169 запросах загружается 6,42 МБ. И это для простого новостного блога с рассылкой.

Читать далее

CLI через Segger J-Link RTT на ARM Cortex-M (или однопортовая лапароскопия)

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

В этом тексте я написал про то как наладить интерфейс командной строки (CLI) по двухпроводному синхронному отладочному интерфейсу SWD.

Посылать в прошивку команды и получать ответ.

Чтобы можно было работать примерно как с UART, только по SWD.

Это когда прошивка в коде асинхронно получает текстовую строку от PC и отправляет текст обратно в сторону PC.

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