7

Clang を使用して、デバッグ情報を有効にして関数をコンパイルしました。Instructions には便利ながありますが、s にはそのgetDebugLoc()ようなものはありませんFunction。インスタンスが与えられたFunction場合、デバッグ情報を取得するにはどうすればよいDISubProgramですか (フォームで推測しています)。

デバッグ情報がどのように表現されるかを説明するガイド エントリを見たことがあります。メタデータには関数へのリンクが含まれていますが、明らかにリンクはありません。モジュール内のすべてのメタデータを反復処理する必要がありますか?

4

3 に答える 3

10

DebugInfoFinder を使用する必要があると思います。サンプルコードは次のとおりです。

DebugInfoFinder Finder;
Finder.processModule(M);
for (DebugInfoFinder::iterator i = Finder.subprogram_begin(),
                    e = Finder.subprogram_end();
                    i != e; ++i) {
                DISubprogram S(*i);

                if (S.getFunction() == F) {
                    errs() << S.getLineNumber(); << "\n";
                }
            }

ここで、F は探している関数です。

于 2013-10-30T15:25:07.453 に答える
3

今のところこれ以上簡単な方法はないと思います。以前は、すべての関数メタデータ エントリを収集するグローバル メタデータ ノードがありました ( ) が、DWARF 構造をより厳密に反映するllvm.dbg.spために、しばらく前に削除されました。llvm.dbg.cu

デバッグ メタデータの一般的な使用法では、関数ごとのルックアップは必要なく、スペースを節約することが重要であり、IR のメタデータはすでに大きすぎるため、削除できる余分な情報はすべて削除されたと思います。

于 2013-08-23T16:29:24.503 に答える