HN公開: 17歳で6か月間Cデバッガの開発に打ち込んだ若者
(github.com/d4ckard)Sprayデバッガの紹介
- SprayはCコード向けのシンプルで理解しやすいデバッガ。
- 実行中のプログラムの実行を制御し、状態を調査・変更する機能を提供。
- デバッガの内部動作への好奇心と、デバッグをより身近なものにする方法を探る目的で開発を開始。
主な機能
- 関数、ファイル内の行、アドレスに対するブレークポイントの設定。
- 変数、メモリアドレス、レジスタの値の表示と設定。
- C構文ハイライト、バックトレース、ステップ実行。
- コマンド出力形式を指定するフィルタ機能。
開発ロードマップ
- 複雑な構造体の表示と変更。
- 複雑な構造体に対する構文ハイライト。
- フレームポインタではなくDWARFベースのバックトレース。
- インライン関数、外部ライブラリのロード、デバッグ中のプログラムに送られたシグナルの捕捉。
インストール方法
- Sprayフロントエンドの一部はSchemeで書かれており、CHICKEN Schemeを通じてCにコンパイルされる。
- CHICKENのインストールが必要で、libdwarfに依存しているため先にインストールする必要がある。
- リポジトリをクローンし、
makeコマンドでSprayをインストール。 $PATHに追加すれば通常のコマンドのように使用可能。
Sprayの使い方
- デバッグ対象のバイナリではデバッグ情報が有効になっており、最適化を無効化しておく必要がある。
- Clangを使用してプログラムをコンパイルする必要がある。
- 最初の引数にデバッグ対象のバイナリ名を、その後の引数にデバッグ対象プログラムの引数を渡す。
コマンド
値の読み書き
- 変数、レジスタ、アドレスの値を表示または設定。
- レジスタ名はAT&Tアセンブリ構文に従って
%接頭辞を使用。 - 値は10進数または16進数で指定可能。
ブレークポイント
- 関数、ファイル内の行、アドレスにブレークポイントを設定・削除。
continueコマンドで次のブレークポイントまで実行を継続。
ステップ実行
- 次の行へ進む、関数の内部に入る、または現在の関数から抜ける。
- 次の命令へ進む、現在位置からバックトレースを表示。
フィルタ
- 出力形式を変更するフィルタを使用可能。
printとsetコマンドの後にフィルタを付けて出力形式を変更。
貢献方法
- すべての貢献を歓迎。プルリクエスト前にローカルのテストスイートを実行し、機能破壊がないか確認。
- 特定の値に対するoff-by-oneエラーによるテスト失敗は無視可能。
参考文献
- Sy Brandのブログシリーズ"Writing a Linux Debugger"、DWARF 5標準、libdwarfドキュメント、Eli Benderskyの"How debuggers work"記事。
GN⁺の意見
この記事で最も重要なのは、SprayがCコード向けのユーザーフレンドリーなデバッガであり、デバッグをより身近にすることに重点を置いている点です。初級ソフトウェアエンジニアにも理解しやすい構造とコマンドを提供することで、複雑なデバッグ作業をより簡単に行えるよう支援するのが魅力です。また、開発ロードマップと貢献方法が明確に示されており、オープンソースプロジェクトに参加したい開発者にとって興味深い機会を提供しています。
1件のコメント
Hacker Newsの意見
この若いプログラマーのコードは、特にクリーンで一貫性があり、モジュール化もうまくできている。この種のプロジェクトには、バイナリ形式やカーネルAPIに関する並外れた知識が必要になる。多くの「上級」プログラマーでさえ、概念レベルでこのようなものを構築するのに苦労するかもしれない。
若いプログラマーたちのコードを読むのは興味深い。経験は不足していても、かなりの知識をもとに設計しているのがわかる。著者は学ぶのが速いようで、6か月の成果は素晴らしい。
このような献身的なレベルには感嘆する。Google Summer of Code、KDE Season of Code、Linux Foundation LFX、X.org EVoC のようなプログラムに参加することを勧めたい。面白い問題がたくさんある。学生のときにこうしたプログラムを知っていればよかった。今はフルタイムの仕事があるので、オープンソースに貢献する時間がない。
プロジェクトをざっと見たが、よく整理されている。称賛に値する。
プロジェクトの完成を祝福し、幸運を祈る。コンパイラは、私がコンピューティングに興味を持つきっかけになった最初のテーマのひとつだった。
17歳の子どもたちもまだ CD を知っていることがわかる。フロッピーディスクの保存アイコンも、まだ完全に時代遅れではないのかもしれない。
17歳という若さで示された知識と成熟さは印象的だ。扱っているテーマは大学レベルで期待されるもので、このプロジェクトは大学院レベルの課程に相当するだろう。成功したキャリアを願っている。
若いころ、Turbo Pascal を使って 2D グラフィックライブラリを書いたことを思い出す。インターネットを知る前だったので個人的な楽しみで終わったが、他の人が見られるように作ったのは立派なことだと思う。コードはクリーンで、コメントもよく書かれており、README も明快だ。
プロジェクトと一緒に「デバッガを書く」チュートリアルを作るのは退屈かもしれないが、とても役に立つはずだ。
関数名と引数の間に空白を入れる理由が気になる。18年間 C コードを読んできた者としては、これはやや異質に感じる。
man styleを参照してそのスタイルを試してみることを提案したい。