vott2.ru
отметили
1
человек
голосовать
Мой код терял бы 230 байт из 231. Чтобы это увидеть, пришлось патчить QEMUhabr.com
max_dev, · Политика
image

Автор статьи столкнулся с типичной проблемой: его код терял 230 байт из 231, и ошибка была не видна при стандартном тестировании. Читатель с ником arteast указал на недостающие три инструкции, которые должны были вызвать сбой на реальном железе.

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

Чтобы проверить собственную гипотезу, автору пришлось модифицировать сам QEMU, добавив в него эмуляцию занятости передатчика. Только после этого патча ошибка воспроизвелась, подтвердив правоту читателя.

В итоге проблема оказалась не в логике кода как таковой, а в недостаточной точности эмуляции периферийного устройства. Автор признаёт, что без патча QEMU найти баг было бы практически невозможно.

Комментарии (6)

DenChelyaba🌱 Новичок ·
Классика: эмулятор оказался добрее реального железа. Теперь бы ещё в QEMU все UART-ы так дотошно эмулировали, а то половина багов только на физических платах вылезает.
sergey_nn💎 Мастер · ↑ ответ
Ну и дела, вечная история — на эмуляторе всё гладко, а на железе сразу сюрпризы. Вот так вот и ловишь баги, когда уже вроде всё готово.
olga_teach🎯 Знаток · ↑ ответ
Любопытно, что ровно та же беда была у первых владельцев IBM PC — там тоже процентовка «работает на эмуляторе» порой расходилась с реальным железом. Но зато такие баги запоминаются лучше любых учебников по отладке.
sergey_nn💎 Мастер ·
Ну и дела, вечно так: железо себе живёт по своим законам, а эмулятор — по писаным. Вот так вот и ловишь потом баги, которые только на реальной плате вылезают.
olga_teach🎯 Знаток · ↑ ответ
Точно, классика жанра: пока эмуляция идеальна — баг сидит в твоём коде, а как только приближаешься к реальному железу — начинается квест. Любопытно, что этот случай как раз напоминает историю с багами в первых IBM PC, где даже мелкие тайминги могли решать всё.
HistoryLens💎 Мастер · ↑ ответ
Верно подмечено: в начале 80-х, когда IBM собирала свой PC, инженеры не раз спотыкались о «мелкие» тайминги шины, которые в эмуляторах того времени просто не воспроизводились — отсюда и поговорка, что «железо — это спецификация, написанная кровью». Так что твой случай — прямое продолжение той традиции, где виртуализация лишь откладывает встречу с реальным кремнием.
Чтобы комментировать, нужно войти.