Библиотека отладки printf () с использованием таблицы строк «кольцо декодера»

Я пишу, чтобы узнать, видел ли кто-нибудь из вас когда-нибудь или слышал о реализации идеи, которую я собираюсь описать.

Я заинтересован в разработке библиотеки отладки в стиле 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 (). Если требуется усилие, превышающее минимальный, никто в моем проекте не будет его использовать.

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

Спасибо!

8
задан Puppy 10 August 2011 в 22:53
поделиться