DWARF

2013年06月26日

GCC 4.7 のリリースノートに、新しく追加された -grecord-gcc-switches オプションを付けると、DWARF デバッグ情報の DW_AT_producer 属性文字列にコンパイラのコマンドライン文字列が追加されるよ、と書いてあることに気付いたので、さっそく試してみました。

続きを読む

2009年11月19日

まつもとゆきひろさんによって開発が開始されたオブジェクト指向スクリプト言語Rubyを初めとして、趣味/仕事を問わず、新しいプログラミング言語を設計/開発したいという需要は昔から一定数存在するようです。

言語処理系に関する本は昔から多数出版されてきていて、去年と今年、日本語の本だけでも10冊以上は出ているのではないかと思います。今年出版された日本語のものだけでも、5冊以上あります。

コンパイラ - 原理・技法・ツール (第二版)
プログラミング言語を作る
ふつうのコンパイラをつくろう 言語処理系をつくりながら学ぶコンパイルと実行環境の仕組み
※ 以下の3冊は、私は未読です。amazonの検索でヒットしたもの。
MLによる最新コンパイラ構成技法
やさしいインタープリタの作り方入門―オリジナルなインタープリタを作成する
やさしいコンパイラの作り方入門―オリジナルなコンパイラを作成する

さらに、11/20 に、コンパイラの構成と最適化の第二版も出ます。

インタプリタやほとんど最適化しないレベルの言語処理系ならば問題にはならないのかもしれませんが、プログラムを高速に実行しようと思うと、途中に変換や最適化が必ず入ってくるので、元のソースコードと生成物の乖離が進みます。効率的に最適化されたプログラムをデバッグするためには、デバッグ情報が不可欠です。

しかし、ソースコードの解釈方法や、機械語の生成方法については多数の文献が存在するわりには、デバッグ情報の生成について触れている本はあまり (私が知る限り、一冊も) 聞きません。デバッガベンダーとしては少し悲しいところです。

翻ってデバッグ情報 (DWARF3) の仕様を見てみると、以下のような言語への対応が仕様に入っているようです。ほとんどが伝統的な言語とその後継ですが、D 言語が入っているというのが個人的には意外でした。(D は 2007 年にDigital Mars 社からバージョン 1.0 のコンパイラが出たばかりの、かなり若い言語です。あと Unified Parallel C という言語は初耳です。)

続きを読む

2009年09月24日

これまでの流れ

- DWARF と有限状態機械
- DWARF と有限状態機械 (2)


概要、プログラムヘッダときて、今回のバイトコードで行番号プログラムの仕様は最後です。

行番号プログラムの目的は、1つのコンパイル単位中の行番号情報表を構築することです。つまり、プログラムを実行すると、表が出力として得られます。

この表は、命令アドレス、ファイル名、行、列、各種位置フラグ(ブレークポイント関係など)など、有限状態機械の状態と1列が対応するようなものです。つまり、行番号プログラムの実行過程における有限状態機械の状態遷移の記録=行番号情報表となります。
この表において、命令アドレスは増加する一方ですが、行番号はコンパイラの最適化などによる命令の並び替えによって減少する場合もあります。

続きを読む

2009年09月16日

これまでの流れ

- DWARF と有限状態機械

前回は、どのようにして行番号情報が保持されているのかという概要、そして有限状態機械の仕様について説明しました。
今回は、具体的なヘッダのフォーマットを見ていきます。

デバッグ情報の自由なベンダー拡張を許しつつ、それをサポートしないデバッガでも独自拡張部分以外のデバッグ情報は正しく読めるような工夫がしてある点が面白いところだと思います。このしくみは実際に多用されていて、コンパイラベンダーごとに、様々な独自拡張が入ったDWARFが生成されるようです。

行番号プログラムヘッダ(The Line Number Program Header)は、以下のようなフォーマットになっています。

続きを読む

2009年09月14日

DWARF はソースレベルデバッギングのための情報をオブジェクトファイル中に保持する際のデータフォーマットです。

ソースレベルデバッガが最低限必要とする情報として、ソースコード中のプログラム行の位置と、対応するマシン命令アドレスの表があります。特にコンパイラによる高度な最適化が入ってくると、1つの行から不連続なアドレスにマシン命令が生成されるようになってくるので、デバッグ情報が無ければ、どこのアドレスにブレークポイントを張れば良いのか、ステップ実行の時にどこで止めれば良いのか、などが全くわからなくなってしまいます。

この対応表は非常に巨大なものに成り得るので、DWARFは対応表をそのまま持つのではなく、行番号プログラム(line number program)によって対応表を生成するという仕様になっています。これは、JVMの仮想機械語のようなバイトコードプログラムとなっています。具体的には、ソースコードのファイル名、行/列番号、命令アドレスなどを状態とする有限状態機械を定義し、その仮想機械のバイトコード列(= 行番号プログラム)をデバッグ情報として保持します。

続きを読む

2009年08月28日

デバッガの開発は、UI レベルから JTAG レベルまで、非常に幅広いレイヤーの知識が必要です。そのため現在の PARTNER の開発は分業化が進んでいて、それぞれの領域を1 人から数人の担当者が開発する形になっています。

デバッガの肝の一つとして、ELF バイナリに入ってるデバッグ情報の解析があるのですが、そこらへんはほぼ全て社長と佐藤さんが行ってきたそうです。

私は入社してから今まで、ほぼずっとシミュレータ周りの開発をしてきましたので、どちらかというと PARTNER のコア部分とは少し離れた位置にいます。

しかし、デバッガベンダーに勤めていながら、全くデバッグ情報の解析について知らないというわけにもいかないので、少しずつ勉強していく過程をメモしていこうかと思います。

続きを読む

記事検索
最新コメント
アクセスカウンター
  • 今日:
  • 昨日:
  • 累計:

QRコード
QRコード