9

シンボルのデバッグと、それらで何ができるか、さらにはデバッグについていくつか質問があります。私は主に GCC に関する回答に興味がありますが、MSVC を含む他のコンパイラでどのように見えるかを知りたいです。

初めに:

  • デバッグ シンボルの一般的な形式/種類は何ですか?
  • それらはコンパイラやプラットフォームとどのように関連していますか? プラットフォーム間で GCC と MinGW では常に同じ形式ですか?
  • ビルドにそれらが含まれているかどうか、およびそれらがどのような形式であるかを実行時に確認できますか?

そして、いくつかのより実用的な質問...どうすればいいですか:

  • 現在のファイルと行番号を確認しますか?
  • 実行中の (修飾された) 関数名を取得しますか?
  • 現在の完全なスタック トレースを取得しますか?

実行時チェックについて話していることを強調しておきます。これらはすべて GDB で読み取ってきれいに印刷できますが、デバッグ シンボル自体からどの程度の情報が得られ、GDB もアクセスできるソース コードからどの程度の情報が得られるかはわかりません。

デバッグシンボルを解析してそのような情報を生成できるライブラリがあるでしょうか?

デバッグ シンボルは、そのようなソリューションにある程度の移植性を期待できるほど十分に標準化されていますか?

4

1 に答える 1

8

デバッグシンボルの一般的な形式/タイプは何ですか?

DWARFおよびSTABS(これらは実行可能ファイル内の特別なセクションに埋め込まれています)、プログラムデータベース(PDB、外部ファイル、MSVCで使用)。

それらはコンパイラやプラットフォームとどのように関連していますか?プラットフォーム間でGCCとMinGWで常に同じ形式ですか?

GCCはLinux(ELF)とWindows(PE)の両方でDWARF / STABS(GCCコンパイル時オプションだと思います)を使用しますが、他のことはわかりません。MSVCは常にPDBを使用します。

ビルドにそれらが含まれているかどうか、およびそれらがどのような形式であるかを実行時にチェックできますか?

実行可能イメージを解析して、デバッグ情報を含むセクションがあるかどうかを確認できます(STABSのドキュメントDWARFの仕様を参照)。PDBファイルは、実行可能ファイルまたはシンボルサーバーを介して配布されます(したがって、オンラインにしたくない場合は、X.exe / X.dll用のX.pdbがあるかどうかを確認してください)。

これらのシンボルの読み取りと使用方法について— DWARF / STABSについてはわかりません(おそらくGNU binutilsの周りに、それらを見つけて抽出できるものがあります)が、PDBの場合、最善の策はdbghelpを使用することです—その使用法はかなりよく文書化されていますネット上にはたくさんの例があります。PDBファイルのクエリに使用できるDIASDKもあります。

デバッグシンボルは十分に標準化されているので、そのようなソリューションにはある程度の移植性が期待できますか?

DWARFには正式な仕様があり、それは地獄のように複雑です。PDB AFAIKは文書化されていませんが、dbghelp / DIAは文書化されており、推奨される方法です。

于 2011-02-18T19:20:24.390 に答える