私の質問に答えるためにDWARF DIフォーマットのための良い文書を見つけることができないようです。私はC言語にコンパイルする言語を書いていますが、DWARFデバッグ情報をCコードに生成する方法はありますか、それともアセンブリのみですか?生成されたCコードを持つDWARF DI?
は、それが原始的#line
などの良くないものと#file
ディレクティブを使用以外の(生成)Cコードにデバッグ情報を追加するために不可能ですか?
私の質問に答えるためにDWARF DIフォーマットのための良い文書を見つけることができないようです。私はC言語にコンパイルする言語を書いていますが、DWARFデバッグ情報をCコードに生成する方法はありますか、それともアセンブリのみですか?生成されたCコードを持つDWARF DI?
は、それが原始的#line
などの良くないものと#file
ディレクティブを使用以外の(生成)Cコードにデバッグ情報を追加するために不可能ですか?
私は、生成されたCをデバッグ情報(-g)でコンパイルすると思いますので、あなたの高水準言語を記述する追加のDWARFレコードをどうやって作成するかということです。考えられるアプローチ:
(1)オブジェクトファイルを編集して、CコードのDWARFレコードを増やします。私はおそらくlibdwarfまたはpyelftoolsで実行可能な既存のツールを知りません。
(2)追加のDWARFレコードをコンパイラを介して「密輸」する方法を見つける。 #pragmaでリンカコマンドを与えることができます。しかし私はこれをサポートするコンパイラについては知らない。
(3)LLVMは、IR representationのデバッグレコードをサポートしています。 clangを使用して生成されたCをIR(01)にコンパイルし、次にfoo.llを増やし、.o(llc foo.ll
)を生成してリンクする準備ができました。
3番目のオプションが最も簡単なようです。
コンパイラがアセンブリを生成できると仮定すると、いくつかのことが可能です。この例については、my favorite gdb test caseを参照してください。
通常これは行われません。正しいことを得るのはかなり難しいかもしれません。今日では、コンパイラをGCCまたはLLVMへの直接のフロントエンドにする方が良いでしょう。生成されたCコードのデバッグをより簡単にするためにgdbまたはlldbヘルパースクリプトを記述することができます。
"これは正しいことが非常に難しいかもしれません.DWARFデータを使った作業に対して正規化された難易度でさえもそうです。 –
ええ、それは実用的な解決策ではなく、もっと楽しいトリックのようです。 –
アイデアありがとうございます。私は第3のオプションに行くかもしれない! –