Я пишу, чтобы увидеть, видел ли кто-нибудь из вас или не слышал о реализации идеи, которую я собираюсь описать.
Я заинтересован в разработке библиотеки отладки в стиле 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"
и т. Д., Которые видны в строке формата, но сама строка формата НЕ передается. (Я, вероятно, сейчас просто запрещу "%s"
элементы ...) Вернувшись в мое местоположение, у нас будет программа, которая ищет уникальные идентификаторы в таблице, находит соответствующую строку формата и использует ее для восстановления исходное сообщение отладки.
Мне кажется, что кто-то, возможно, уже имел эту идею раньше, и я подумал, что, возможно, кто-то в сообществе видел бы что-то подобное (или даже знал о библиотеке с открытым исходным кодом, которая делает это).
Ограничения:
Чтобы уточнить, я имею здесь дело с C / C ++, и меня не интересует реализация заменителя printf (), полностью завершенная на 100% - такие вещи, как строки не буквального формата, %s
(строковые) спецификаторы формата или более сложные спецификаторы формата, такие как добавление ширины или точности в список varargs с помощью %*.*d
, не должны поддерживаться.
Я хочу, чтобы таблица строк создавалась автоматически как часть процесса сборки, чтобы добавление отладки включало не больше работы, чем добавление традиционного printf (). Если требуется больше, чем минимальное количество усилий, никто в моем проекте не будет его использовать.
Выполнение дополнительной работы в рамках процесса сборки для генерации таблицы строк в значительной степени предполагается. К счастью, у меня есть контроль над всем исходным кодом, с которым я заинтересован в использовании этой библиотеки, и у меня есть большая гибкость в процессе сборки.
Спасибо!