Как стать автором
Обновить
24.52

Отладка *

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

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

Об (отсутствии) синтаксической поддержки обработки ошибок в Go

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

Программисты на Go уже давно и долго жалуются на слишком многословную обработку ошибок. Все мы близко (а иногда и болезненно) знакомы со следующим шаблоном кода:

x, err := call()
if err != nil {
// обработка err}

Проверка if err != nil встречается настолько часто, что может становиться объёмнее остального кода. Обычно это происходит в программах, выполняющих много вызовов API, в которых обработка ошибок рудиментарна и они просто возвращаются. Некоторые программы в итоге выглядят примерно так:

func printSum(a, b string) error {
x, err := strconv.Atoi(a)
if err != nil {
return err
}
y, err := strconv.Atoi(b)
if err != nil {
return err
}
fmt.Println("result:", x + y)
return nil }

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

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

Читать далее

Новости

Как я нашёл уязвимость в ядре Linux при помощи модели o3

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

В этом посте я расскажу, как нашёл уязвимость нулевого дня в ядре Linux при помощи модели OpenAI o3. Уязвимость обнаружилась благодаря одному лишь API o3 — не потребовались никакая дополнительная настройка, агентские фреймворки и инструменты.

Недавно я занимался аудитом уязвимостей ksmbd. ksmbd — это «сервер ядра Linux, реализующий в пространстве ядра протокол SMB3 для передачи файлов по сети». Я приступил к этому проекту специально для того, чтобы взять отдых от разработки связанных с LLM инструментов, но после релиза o3 не мог избежать искушения и не использовать в качестве небольшого бенчмарка способностей o3 баги, найденные мной в ksmbd. В одном из следующих постов я расскажу о показателях o3 при обнаружении всех этих багов, а сегодня мы поговорим о том, как в процессе моего бенчмаркинга o3 обнаружила уязвимость нулевого дня. Найденной уязвимости присвоили обозначение CVE-2025-37899 (её патч выложен на Github), это use-after-free в обработчике команды SMB logoff. Для понимания уязвимости необходимо знать о работе конкурентных подключений к серверу и о том, как они в определённых обстоятельствах могут обмениваться различными объектами. Модели o3 удалось разобраться в этом и найти место, где конкретный объект с автоматическим подсчётом ссылок освобождался, но продолжал оставаться доступным для другого потока. Насколько я понимаю, это будет первым публичным рассказом об уязвимости подобного типа, обнаруженной LLM.

Читать далее

Ускоряем работу видеодекодера rav1d на 1%

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

Какое-то время назад memorysafety.org объявил о конкурсе по повышению производительности rav1d — порта AV1-декодера dav1d на Rust.

Моя фамилия Равид, совсем как название декодера, поэтому я решил, что будет забавно попробовать (хоть я и, вероятно, не смогу участвовать в конкурсе).

Эта статья посвящена двум найденным мной небольшим улучшениям производительности (первый PRвторой PR) и рассказу о том, как я их нашёл.

Читать далее

Да как отлаживать этот ваш Tcl?

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

puts "ПЛИС-культ привет, FPGA / RTL / Verification ХАБ!"

Последние несколько месяцев я плотно сижу в Vivado и Tcl и вот решил с вами поделиться своими "открытиями" в области отладки Tcl скриптов, которые вероятно не многие из вас вообще пишут или используют в своей работе.

Несмотря на свою архаичность, Tool Command Language все же остается самым востребованным языком управления средой проектирования для ПЛИС и ASIC. ЕМНИП все эти инструменты управляются через Tcl, Vivado так уж точно, поэтому было бы не плохо научиться или хотя бы посмотреть какие инструменты отладки этих самых пресловутых Tcl-сценариев вообще существуют или существуют ли они вообще, кроме православного puts

В этой заметке, я постараюсь вам показать, что advanced tcl debugging - это не миф, а вполне реальная сущность, которая была создана еще на заре двухтысячных и не то что бы эта сущность как-то изменилась за эти 20 с небольшим лет.

Открывайте ваши консольки, погнали!

Как Мэтт Годболт «продал» мне Rust (рассказав о C++)

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

Мэтт Годболт, знаменитый разработчик Compiler Explorer — потрясающий человек, вам стоит найти в вебе и изучить весь созданный им контент. Именно этим и занимался, просматривая Correct by Construction: APIs That Are Easy to Use and Hard to Misuse. Я уже больше двадцати лет работаю с C/C++, поэтому эта тема была мне близка.

Когда я смотрел его доклад, ко мне постоянно приходила мысль: «Да! И именно поэтому в Rust это делается так». После просмотра видео я подумал, что этот доклад — отличный способ понять, как Rust помогает разработчикам не только в безопасности по памяти, и в своей статье я расскажу об этом.

Но прежде нам следует поговорить о поднятых Мэттом проблемах и о том, как он предлагает решать их в C++. Сделайте себе одолжение и посмотрите доклад целиком, а я разберу один из его пунктов.

Читать далее

Почему Windows 7 долго входила в систему с одноцветным фоном рабочего стола?

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

Лично у меня установлен одноцветный фон. Он был стандартным в Windows 951, и с тех пор я не расстаюсь с этим голубовато-зелёным цветом. Он меня успокаивает.

Поэтому представьте моё удивление, когда мне показали статью техподдержки «Экран Welcome может отображаться в течение 30 секунд в процессе входа, если вы установили одноцветный фон в Windows 7 или в Windows Server 2008 R2». Почему вход выполняется медленнее с одноцветным фоном?

Читать далее

Как 20-летний баг GTA San Andreas всплыл в Windows 11 24H2

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

Я занимаюсь разработкой SilentPatch, исправляющего ошибки старых игр серии GTA и других игр. В issue tracker проекта на GitHub я получил недавно очень специфичный отчёт о баге:

Самолёта Skimmer нет в Windows 11 24H2

Когда я обновил Windows до версии 24H2, самолёт Skimmer полностью пропал из игры. Его невозможно создать с помощью трейнера или найти на обычных точках спауна. Я играю и в версию с модами (которая до обновления Windows была абсолютно нормальной), и в «ванильную» с единственным установленным silentpatch (я пробовал версии silentpatch за 2018 год, 2020 год и самую новую). Самолёт всё равно не спаунится в игре.

Если бы я услышал о подобном впервые, то посчитал бы сомнительным и заподозрил, что дело может быть в чём-то другом, а не конкретно в Windows 11 24H2. Однако на GTAForums я получал комментарии точно о такой же проблеме с ноября прошлого года. Некоторые из пользователей винили в ней SilentPatch, однако другие говорили, что то же самое происходит и в игре без модов:

Очевидно, Skimmer не может заспауниться при игре в Windows 11 24h2; надеюсь, этот баг устранят.

Дополнение: кажется, я подтвердил это — создал виртуальную машину с Windows 11 23h2, и этот чёртов самолёт замечательно спаунится; апдейт той же виртуальной машины до 24h2 ломает Skimmer. Остаётся только догадываться, почему небольшое обновление операционной системы в 2024 году ломает какой-то левый самолёт в игре 2005 года.

После нового обновления Silent patch из игры пропадает Skimmer, а когда я пытаюсь создать его с помощью RZL-Trainer или Cheat Menu пользователя Grinch, игра зависает и приходится закрывать её через Диспетчер задач.

[…] Я был вынужден обновиться до 24H2, и после апдейта у меня возникла та же проблема со Skimmer в GTA SA, что и у остальных. Это значит, что проблему вызывают не моды или что-то другое: она возникла после свежего обновления Windows.

Читать далее

Восстановление раритетного аналогового синтезатора Alpha Juno-1 фирмы Roland

Уровень сложностиСредний
Время на прочтение3 мин
Количество просмотров2.1K

Одно время  на прогулках по блошиным рынкам я увлеченно высматривал винтажные музыкальные инструменты, особенно синтезаторы 70x-80x годов. Я нахожу их звуки очень красочными и разнообразными, а так же эти устройства интересны с точки зрения схемотехники.

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

И это оказалась не «пиликалка» с пластиковым звуком и не кондовый электроорган, - а очень даже продвинутый для середины 80ых и актуальный по сей день аналоговый полифонический синтезатор с цифровым управлением, выпущенный компанией Roland.

После приобретения музыкальный инструмент не подавал ни каких признаков жизни кроме подсветки дисплея. Вскрытие и сверка со схемой из документации показали то, что хоть разработчики и использовали Poka Yoke для предотвращения неправильного подключения межплатных кабелей, но или не досмотрели или ассортимента не хватило и установили на главной плате два разъёма с одинаковым количеством контактов и невнимательный настройщик который обслуживал синтезатор перепутал местами те единственные два кабеля в которых можно было ошибиться. В таком вот состоянии инструмент мне и достался. Уcтранив ошибку сначала я очень обрадовался, - основные функции заработали, но к сожалению вышли из строя два входа микросхемы IC7 “Gate Array“, которая выполняет роль IO интерфейса для CPU, в частности для функций клавиатуры. Из Рис. 1 и Рис. 3-4 видно как происходит обработка нажатия клавиш.

Прочесть

Профилирование Node.js приложения с помощью Pyroscope (без автоинструментирования)

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

Pyroscope — это мощный инструмент непрерывного профилирования, созданный для мониторинга производительности приложений в реальном времени. В этой статье мы рассмотрим, как быстро развернуть Pyroscope, подключить к нему Node.js приложение и проанализировать поведение кода без использования Grafana Alloy.

Читать далее

Проектируем веб-страницу, отображающую миллион элементов

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

Может ли браузер справиться с миллионом элементов? Если вы когда-нибудь пробовали рендерить в браузере миллион элементов <div>, то знаете, что происходит — он вылетает, зависает и перестаёт реагировать.

Недавно мы выпустили фичу, привлёкшую большое внимание — загрузку и визуализацию до миллиона спанов на нашей странице детализации трассировок. Это вызвало любопытство у пользователей и разработчиков, поэтому многие начали задавать вопрос: как нам это удалось?

Наша мотивация ясна — пользователям нужна эта возможность. Она позволяет использовать новые процессы отладки, упрощая эффективный анализ огромных трассировок.

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

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

Читать далее

Ускорьте отладку тяжелых Docker-образов, запускаемых в удаленной среде

Уровень сложностиСредний
Время на прочтение2 мин
Количество просмотров2.2K

Это небольшой туториал о том, как ускорить pull и push тяжелых Docker образов, которые вы собираете локально, но их запуск возможен только в удаленной среде. Например, потому что контейнер использует специфическое окружение, приложения или ресурсы, которые трудно или невозможно воспроизвести локально.

Решение “в лоб” состоит в том, чтобы запушить собранный образ в Dockerhub. А там, где вы будете его использовать, просто указать ссылку на образ. Очевидно, что у этого простого способа есть недостатки.

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

Узнать решение

Можно ли навсегда избавиться от утечек памяти из-за циклических ссылок?

Уровень сложностиСредний
Время на прочтение3 мин
Количество просмотров5.3K


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


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


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


Но мне кажется, что есть очень простой способ устранить циклические ссылки в программе, который можно реализовать практически в любом типизированном языке программирования, конечно, если при этом не использовать все разрешающее ключевое слово unsafe для Rust или оператор reinterpret_cast в случае С++.

Читать дальше →

Генератор случайных чисел, застрявший на одном значении

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

Моё исследование посвящено мини-игре Green Toad House в New Super Mario Bros (NSMB). В этой мини-игре используется случайность, поэтому в процессе я изучил генератор случайных чисел (RNG) NSMB.

Чтобы пост не был слишком длинным, будем считать, что вы знаете, что такое RNG, а также о концепции порождающих значений (seed). Если нет, то вот хорошие ресурсы для изучения: pannenkoek2012 в YouTube (SM64)Retro Game Mechanics Explained в YouTube (SMW)Википедия.

Читать далее

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

Уменьшаем размер двоичного файла на C# в 90 раз

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

Я написал на C# консольный клон Wordle, но попытался сделать двоичный файл максимально крошечным.

Я взял популярную игру Wordle с такими правилами:

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

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

В работе с консолью мне помогла игра Console Games - Snake

Проект запускается в новой консоли dotnet.

Читать далее

Патчим OpenOCD для поддержки чипа NOR Flash

Время на прочтение2 мин
Количество просмотров1.4K

Disclaimer: "чукча не писатель, чукча читатель"

UseCase 0: надоело переподключать плату с RP2040 и захотелось загружать прошивку из IDE по кнопке "Run"
UseCase 1: хочется пошаговой отладки, а не принтами.

Установил на одну из плат DebugProbe и попробовал подключиться.

Оказалось не все так просто - OpenOCD плевался на неизвестное устройство:

окунуться

Руководство по началу работы с отладочной платой MIK32-DIP (K1948ВК018, Амур) в ОС GNU/Linux

Уровень сложностиСредний
Время на прочтение4 мин
Количество просмотров3.9K

MIK32 АМУР или K1948ВК018 является российским микроконтроллером (МК) с ядром на открытой архитектуре RISC‑V. По какой‑то причине производитель МК ГК «Микрон» предлагает в качестве средства разработки,‑ средство на базе Eclipse, но исключительно под Windows, что далеко не всех устраивает. А также, в руководстве по эксплуатации на данный МК, предлагается использовать VS Code, и это конечно более универсальный (кроссплатформеный) вариант, но предполагает использование VS Code совместно с плагином PlatformIO, что опять же устраивает далеко не всех. Поэтому я рассмотрю в данном руководстве старт работы с отладочной платой MIK32-DIP в ОС GNU/Linux в IDE Eclipse.

Чтобы начать работу вам понадобятся:

Читать далее

Руководство по использованию unsafe в Swift

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

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

Читать далее

3200% нагрузки на процессор

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

Совсем недавно моя машина была в таком запущенном состоянии, что я едва мог подключиться к ней через ssh. 3200% нагрузки на CPU — полностью использовались все 32 ядра хоста! Сравните это с моим последним багом, когда использовалось всего одно ядро, то есть 100%

К счастью, я использовал среду выполнения Java 17, у которой были дампы потоков с указанием времени CPU!

Читать далее

Самые Эпичные Баги при Программировании Микроконтроллеров

Уровень сложностиПростой
Время на прочтение11 мин
Количество просмотров23K

У каждого программиста микроконтроллеров с годами кристаллизируется коллекция золотых багов. Некоторые из них весьма эпичные.

Самый типичный баг - это зависание прошивки.

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

Читать далее

Отладка приложения, которое не хочет, чтобы его отлаживали

Уровень сложностиСредний
Время на прочтение17 мин
Количество просмотров7.7K
Недавно я столкнулся с приложением, которое:

  1. Блокирует прикрепление к нему отладчиков.
  2. Выполняет преждевременный выход при попытках инъецирования кода.
  3. Приводит к вылету телефона целиком, если запустить её со включённым джейлбрейком (!).

По последнему пункту: кто вообще так делает???

Всё, что мы делаем (например, выполняем моддинг TikTok, чтобы он показывал только видео с котиками, или устраняем торможения в чужих приложениях), требует возможности исследования работы приложения.

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

Похоже, это приложение стало на удивление интересной комбинацией всего перечисленного.

Намного более сложной, чем можно было бы ожидать от обычного старого виджет-приложения.
Читать дальше →
1
23 ...