Я надеюсь, что пример псевдо-кода поможет прояснить идею:

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

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

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

Ограничения:

Чтобы уточнить, я имею здесь дело с C / C ++, и меня не интересует реализация заменителя printf (), полностью завершенная на 100% - такие вещи, как строки не буквального формата,%s (строковые) спецификаторы формата или более сложные спецификаторы формата, такие как добавление ширины или точности в список varargs с помощью%*.*d не нуждается в поддержке

Я хочу, чтобы таблица строк создавалась автоматически как часть процесса сборки, чтобы добавление отладки включало не больше работы, чем добавление традиционной функции printf (). Если требуется больше, чем минимальное количество усилий, никто в моем проекте не будет его использовать.

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

Спасибо!

Ответы на вопрос(4)

Ваш ответ на вопрос