私が説明しようとしているアイデアの実装を見たり聞いたりしたことがあるかどうかを確認するために書いています。
組み込みターゲット用の 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」だけはコンパイル時にわかりません。
私がやりたいのは、これら 2 つの整数 (42 ではなく 8 バイト) だけを送り返すことです。そのデータを受信すると、受信したデータを「再構成」し、ここで私の場所で完全なデバッグ メッセージを出力できる、ある種の「デコーダ リング」ができます。
コンパイル時にすべての myDebugLibraryPrintf() ステートメントに一意の ID を自動的に (ビルド プロセスの一部として) 与え、それらの一意の ID を元の書式文字列にマップするテーブルを生成することで、"デコーダ リング" を生成します。次に、ターゲットで myDebugLibraryPrintf() が呼び出されるたびに、一意の ID と、フォーマット文字列にある"%d"
、"%f"
などの varargs 値が送信されますが、フォーマット文字列自体は送信されません。(おそらく今のところ"%s"
項目を許可しないことにします...) 私の場所に戻ると、テーブル内の一意の ID を検索し、適切なフォーマット文字列を見つけ、それを使用して元のデバッグ メッセージを再構築するプログラムができます。 .
誰かがおそらく以前にこのアイデアを持っていたような気がします.コミュニティの誰かがそのようなものを見たことがあるでしょう(またはこれを行うオープンソースライブラリを知っていることさえあります).
制約:
明確にするために、ここでは C/C++ を扱っており、printf() の 100% 完全な代替実装 (非リテラル形式文字列、
%s
(文字列) 形式指定子、またはより高度な)には興味がありません。 varargs リストに幅や精度を入れるような書式指定子は、%*.*d
サポートする必要はありません。ビルド プロセスの一部として文字列テーブルを自動的に生成して、従来の printf() を追加するだけでデバッグを追加できるようにしたいと考えています。最小限の労力以上が必要な場合、私のプロジェクトの誰もそれを使用しません。
文字列テーブルを生成するビルド プロセスの一部として余分な作業を行うことは、ほぼ想定されています。幸いなことに、私はこのライブラリを使用することに関心のあるすべてのソース コードを管理しており、ビルド プロセスには多くの柔軟性があります。
ありがとう!