コンテンツにスキップ

最終更新:2026-10-12

GDB Python 拡張デバッグ

0.はじめに

デバッグはソフトウェア開発プロセスに欠かせない要素であり、GDB(GNU デバッガ)は強力なデバッグツールとして開発者の間で広く利用されています。従来のコマンドラインデバッグ機能に加えて、GDB は Python の GDB ライブラリを提供しており、開発者は Python 言語を使ってデバッグ能力を拡張・強化できます。本稿では、GDB の中で Python の GDB ライブラリを使用する方法を紹介し、その強力なデバッグ機能とユースケースを示します。

始める前に、Python と GDB が正しくインストールされており、Python のバージョンが GDB と互換性があることを確認してください。その後、以下の手順で Python の GDB ライブラリをインストールします:

a. コマンドラインで gdb を実行して GDB を開きます。

b. python コマンドを入力し、GDB の Python インタプリタに入ります。

c. import gdb を実行します。エラーが発生しなければ、Python の GDB ライブラリが正しくインストールされています。

(gdb) python
>import gdb
>end

gdb でのデバッグ中、私たちは複雑な構造の変数を確認したいことがよくあります。例えば PostgreSQL の List 構造は、何でも入れられるため、中身が具体的に何なのかを直感的に出力するのが本当に難しいものです。そこで日常の開発では python スクリプトが活躍します。以下が例です:

(gdb) tl
TargetEntry [resno=1 resname="sum"]
    Aggref [aggfnoid=2107 aggtype=1700 aggtranstype=2281 aggstar=false aggvariadic=false aggkind=110 'n' agglevelsup=0 aggsplit=AGGSPLIT_FINAL_DESERIAL aggno=0 aggtransno=0 agg_expr_id=0]

1.Hello python gdb

gdb の中でいくつかの python 操作、例えば print を実行できます。次に示す通りです:

scssCopy code
(gdb) python
> print(1+2)
> end
3
(gdb) end
This command cannot be used at the top level.

この例では、GDB の Python インタプリタに入り、簡単な Python 文 print(1+2) を実行しました。結果は 3 です。

もう一つの例として、python xxxx と直接入力して実行することもできます。

scssCopy code
(gdb) python f = 2
(gdb) python print(f)
2

この例では、GDB の中で Python 文を使って変数 f を定義し、その値を出力しました。結果は 2 です。

2.実戦:どう書く?

核心となるのは、これらのスクリプトをどのように書くかという点です。このスクリプトを通じて自分のコードを手軽に出力できるようにします。以下は実戦のセクションで、本節に関連するコードと資料は星球(コミュニティ)で更新されますので、ぜひフォローしてください:

struct Point {
    int x;
    int y;
};

ここに Point 構造体があります。これをスクリプトで出力したいのですが、どう実装すればよいでしょうか?

ロジックはとてもシンプルで、構造体を読み取って print するだけです。

import gdb

def print_point(point):
    print(f"Point: x={point['x']}, y={point['y']}")

def print_person(person):
    age = person['age']
    print(f"Person: age={age}")

class PrintCppStruct(gdb.Command):
    def __init__(self):
        super(PrintCppStruct, self).__init__("print_cpp_struct", gdb.COMMAND_USER)

    def invoke(self, arg, from_tty):
        try:
            cl = gdb.parse_and_eval(arg)
            if cl.type.code == gdb.TYPE_CODE_STRUCT and str(cl.type) == 'Point':
                print_point(cl)
            elif cl.type.code == gdb.TYPE_CODE_STRUCT and str(cl.type) == 'Person':
                print_person(cl)
            else:
                print("Unknown C++ structure type.")
        except gdb.error as e:
            print(f"Error: {e}")

PrintCppStruct()

使い方は?

source するだけです:

(gdb) source print.py

この例では、source コマンドを使って GDB の中に print.py という名前の Python スクリプトをロードしました。

(gdb) print_cpp_struct myPoint
Point: x=10, y=20

この例では、GDB の中でカスタムコマンド print_cpp_struct を使用しました。これは Python の GDB ライブラリを通じて、myPoint という名前の C++ 構造体の値を出力したものです。

GDB の中で Python の GDB ライブラリを使うことで、開発者は Python の強力な機能を活用してデバッグ能力を拡張・強化できます。Python の GDB ライブラリは豊富な API と柔軟なスクリプト作成能力を提供しており、デバッグの過程をより効率的かつ便利にします。デバッグタスクの自動化、データの分析と可視化、プログラムの挙動の動的な変更のいずれにおいても、Python の GDB ライブラリは開発者に豊富な選択肢と柔軟性を提供します。本稿が Python の GDB ライブラリの理解と活用の手助けとなり、デバッグスキルと開発効率の向上につながれば幸いです。

関連トピック

コメント