Я пишу, чтобы узнать, видел ли кто-нибудь из вас когда-нибудь или слышал о реализации идеи, которую я собираюсь описать.
Я заинтересован в разработке библиотеки отладки в стиле printf для встроенная цель. Цель чрезвычайно удалена, а бюджет полосы пропускания связи между мной и целью чрезвычайно ограничен, поэтому я хочу иметь возможность получать отладочные сообщения в очень эффективном формате.
Довольно часто операторы отладки выглядят примерно так: :
myDebugLibraryPrintf("Inside loop, processing item %d out of %d.\n", i, numItems);
Конечно, когда это раскрывается в текст, напечатанная строка выглядит примерно так: «Внутренний цикл, обработка элемента 5 из 10. \ n», всего ~ 42 байта или около того. Более 90% данных, распечатываемых этим оператором, статичны, буквальны - известны во время компиляции. Конечно, во время компиляции неизвестны только «5» и «10».
Я бы хотел иметь возможность отправлять обратно только эти два целых числа (8 байтов вместо 42). Как только я получил эти данные,У меня было бы какое-то «кольцо декодера», которое позволяет мне «восстанавливать» полученные данные и распечатывать полное сообщение отладки здесь, в моем местоположении.
Я бы сгенерировал «кольцо декодера» автоматически (как часть процесса сборки), присвоив каждому оператору myDebugLibraryPrintf () уникальный идентификатор во время компиляции и создав таблицу, которая сопоставляет эти уникальные идентификаторы со строками исходного формата. Затем каждый раз, когда myDebugLibraryPrintf () вызывается для цели, он передает уникальный идентификатор и любое из «% d»
, «% f»
и т. Д. Значений varargs, показанных в строка формата, но сама строка формата НЕ передается. (Я, вероятно, пока просто запретлю "% s"
элементы ...) Вернувшись в мое местоположение, у нас будет программа, которая ищет уникальные идентификаторы в таблице и находит соответствующую строку формата , и использует его для восстановления исходного сообщения отладки.
Я чувствую, что у кого-то, вероятно, была эта идея раньше, и я подумал, может быть, кто-то в сообществе видел что-то подобное (или даже знал о библиотеке с открытым исходным кодом, которая this).
Ограничения:
Чтобы уточнить, здесь я имею дело с C / C ++, и меня не интересует реализация printf () на 100% с полной заменой - такие вещи, как нелитеральный формат строки, спецификаторы формата % s
(строка) или более сложные спецификаторы формата, такие как размещение ширины или точности в списке varargs с помощью % *. * d
, не должны поддерживаться .
Я хочу, чтобы таблица строк создавалась автоматически как часть процесса сборки, чтобы добавление отладки не потребовало больше работы, чем добавление традиционной printf (). Если требуется усилие, превышающее минимальный, никто в моем проекте не будет его использовать.
В значительной степени предполагается выполнение дополнительной работы как часть процесса сборки для создания таблицы строк. К счастью, у меня есть контроль над всем исходным кодом, с которым я заинтересован в использовании этой библиотеки, и у меня есть большая гибкость в процессе сборки.
Спасибо!