BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース LLVMがPDBフォーマットのドキュメント化とYAMLへの変換を実現

LLVMがPDBフォーマットのドキュメント化とYAMLへの変換を実現

原文(投稿日:2017/08/21)へのリンク

Windowsプラットフォームで提供される充実したツーリングのメリットを活用には、LLVMなどのコンパイラがPDBファイルを生成可能であることが必要だ。PDBすなわちProgram Debug Databaseは、Windowsプラットフォームでコンパイルされたコードを記述するリテラルデータベースである。さまざまなレコードを含むことにより、デバッガなどのツールで、コンパイルされたコードとソースコードの対応付けが可能になる。

パフォーマンス向上のため、このデータには複雑なインデックスが付けられている。それが問題の一部なのだ。LLVM WindowsチームのZach Turner氏は次のように記している。

CodeViewは、1980年代半ばにMicrosoftが開発したデバッグ情報のフォーマットです。さまざまな理由から他のデバッガは、DWARFと呼ばれる別のフォーマットを開発しました。これが最終的に標準化されて、現在では多くのコンパイラやプログラム言語がサポートしています。CodeViewとDWARFはいずれも、ソース行とコードアドレスのマッピングと、プログラムで使用している型やシンボルを記述したレコードセットを定義しています。デバッガはこの情報を利用して、関数名でブレークポイントを設定したり、変数の値を表示するなどの処理をします。しかし、CodeViewはほとんど文書化されていません。最新の公式資料の発表から少なくとも20年は経過しているのです。一部のレコードは資料で記述されたフォーマットを維持していますが、他は改訂されていたり、まったく記載されていない、新しいレコードが導入されていたりします。

[…]

[PDBは]CodeViewを包含していますが、さまざまな方法でCodeViewレコードをインデックスするために、それ以外の要素も含まれています。これによって、型やシンボルを名称やアドレスで検索する処理の高速化や、個々の入力ファイルの仮想的な“テーブル”、その他ユーザに見えない部分でWindows上のデバッグ体験に大きく影響するような、さまざまな情報が手に入るのです。ただし問題があります - CodeViewには最小限ながらドキュメントがありますが、PDBはまったく文書化されていないのです。これは非常に大きな問題です。

MicrosoftはPDBファイルを参照するツールやSDKを提供しているが、生成するためのツールは提供していない。公開されているPDBコードはコンパイルさえできない代物なので、プロプライエタリなライブラリを使わざるを得ない状況だ。

Microsoftがアップロードしている部分的なコードに基づくことで、LLVMチームは自身のPDBジェネレータの構築に成功した。これにより、“アルファ版レベル”という認識ではあるが、CLANGとLLVMバックエンドでコンパイルされたアプリケーションで、Windowsのツーリングを使った開発が始められるようになった。Turner氏は続ける。

これを試して、問題点をバグトラッカに報告して欲しいと思っています。まずはWindows版clangの最新スナップショットをダウンロードすることから始めてください。

PDBをサポートする調査の一環として、LLVMはPDBフォーマットの文書化を行なっている。完全ではないが、この複雑なフォーマットに関して、これまでは入手できなかった貴重な情報を提供するものだ。

この作業を補完するため、llvm-pdbutilというツールも開発された。注目すべき点は、YAMLとPDBとの双方向の変換が可能なことだ。(YAMLを知らない人のために説明すると、これは括弧の代わりに空白を使用する、可読性を持ったフォーマットである。最もよく知られているのは、APIドキュメント言語であるRAMLで使用されているフォーマットとしてだろう。)

注意が必要なのは、実際には2つのPDBフォーマットが存在することだ。これまで説明したフルバージョンに加えて、.NET Coreアプリケーション用のPortable PDBフォーマットが存在する。Portable PDBは文書化されており、参照するためのオープンソースライブラリがある。

 
 

この記事を評価

採用ステージ
スタイル
 
 

この記事に星をつける

おすすめ度
スタイル

BT