我写信是想看看你们中是否有人见过或听说过我将要描述的想法的实现。
我有兴趣为嵌入式目标开发一个 printf 风格的调试库。目标非常遥远,我和目标之间的通信带宽预算非常紧张,所以我希望能够以非常有效的格式获取调试消息。
很多时候,调试语句看起来像下面这样:
myDebugLibraryPrintf("Inside loop, processing item %d out of %d.\n", i, numItems);
当然,当它扩展为文本时,打印的字符串类似于“Inside loop, processing item 5 out of 10.\n”,总共约 42 个字节左右。该语句打印的 90% 以上的数据是静态的、文字的——在编译时就知道了。当然,只有“5”和“10”在编译时是未知的。
我想做的是能够只发回这两个整数(8 个字节而不是 42 个)。一旦我收到该数据,我就会有某种“解码器环”,让我“重构”接收到的数据并在我的位置打印出完整的调试消息。
我将通过在编译时自动(作为构建过程的一部分)为每个 myDebugLibraryPrintf() 语句提供唯一 ID 并生成将这些唯一 ID 映射到原始格式字符串的表来生成“解码器环”。然后,每当在目标上调用 myDebugLibraryPrintf() 时,它都会传输唯一 ID 和格式字符串中看到的任何"%d"
、"%f"
等可变参数值,但不传输格式字符串本身。(我"%s"
现在可能只是禁止项目......)回到我的位置,我们将有一个程序查找表中的唯一 ID,找到适当的格式字符串,并使用它来重建原始调试消息.
我觉得以前可能有人有过这个想法,我想也许社区中的某个人会看到类似的东西(或者甚至知道这样做的开源库)。
约束:
澄清一下,我在这里处理的是 C/C++,我对 printf() 的 100% 完全替换实现不感兴趣——比如非文字格式字符串、
%s
(字符串)格式说明符或更高级的东西%*.*d
不需要支持格式说明符,例如将宽度或精度放入可变参数列表中。我希望作为构建过程的一部分自动生成字符串表,这样添加调试所涉及的工作就不会比添加传统的 printf() 更多。如果需要的工作量超过最低限度,我的项目中没有人会使用它。
作为生成字符串表的构建过程的一部分,做额外的工作几乎是假设的。幸运的是,我可以控制我对使用这个库感兴趣的所有源代码,并且我在构建过程中有很大的灵活性。
谢谢!