web-dev-qa-db-ja.com

lldbを使用してgccでコンパイルされたプログラムをデバッグしたり、gdbを使用してclangでコンパイルされたプログラムをデバッグしたりすることはできますか?

(序文:私はC/C++にかなり慣れていないので、ネイティブコードでのデバッグが実際にどのように機能するかはわかりません。)

一部のソースは、gdbとlldbは マシンコードにコンパイルされた任意のプログラム をデバッグできると言っています。他の人は、gdbでデバッグするには、mccをgccでコンパイルする必要があると言います -gフラグ 。 gcc自体のドキュメントでは、これはオプションであり、実際に使用すると、デバッガーに問題が発生する可能性があることが示唆されています以外 gdb。 Clangには-gフラグとドキュメントは、基本的に「デバッグ情報を生成する」とだけ言っています。

これらのデバッガーは、独自のツールチェーン(GNUおよびLLVM)に制限されているのですか、それとも、使用しているコンパイラーから何らかの方法で独立していますか?

49
Neil Traft

理論的には、lldbを使用してGCCで構築されたプログラムとgdbを使用してLLVMで構築されたプログラムをデバッグできるはずです。どちらの場合も、-gでコンパイルする必要があります。

これは、両方のコンパイラが同じ形式でオブジェクトファイルを生成するためです(たとえば、Linuxでは、両方とも [〜#〜] elf [〜#〜][〜#〜] dwarf [〜#〜] デバッグ情報)と両方のデバッガは、その形式を解析する方法を知っています。

実際には、両方のコンパイラーが、それぞれのデバッガーだけが消費する方法を知っているデータをデバッグ情報にプッシュします。しかしながら:

  1. LLVMが生成したデータは、gdbの妨げにはなりません。
  2. GCCで生成されたデータはlldbを妨げるべきではありませんが、可能であれば、具体的に gccにnot非標準のデータを追加するよう依頼 。たとえば、Linuxでは、-gdwarf-2ではなく-gを使用しても、標準に準拠したDWARFのみが生成されます。

デバッグ情報なしでプログラムをデバッグすることもできます(-gでコンパイルされていません)が、デバッガーの低レベルの情報(アセンブリコード、メモリ、およびレジスター)に制限され、表示できないことに注意してください。行番号、関数名、変数名とその内容の間のマッピングなどの高レベルの構成要素.

40
Oak