ぐだぐだ低レベルプログラミング(61) ARM64(AArch64)、gdb -tui

Joseph Halfmoon

前々回、デフォルトでインストール済であったlldb (LLVM系?のデバッガ)を使ってみましたが、アセンブラレベルの表示がちょいと思うような感じと違っておりました。gdbとほぼほぼ互換とはいいつつも違うところはあるみたいです。そこで本家gdbをインストールし、TUIモードで動作させてみました。この感じかね。

※「ぐだぐだ低レベルプログラミング」投稿順indexはこちら

実験は、Androidスマホ上にインストールしたTermux環境に、パソコンからSSH接続して行っています。ユーザーモードですが、ほぼ普通にLinuxとして使用可能であります。SSH接続したところが以下に。

TermuxWelcome

今回インストールして使用したGDBのバージョンは以下のとおりです。gdbVersion

GDBのマニュアルについては、以下から辿れるのではないかと思います。

GDB: The GNU Project Debugger

GDBのTUIモード

最近はVScodeのような環境下でデバッグ行うことが普通だと思います(私はそうです。)マウスクリックでブレークポイント張ってアイコンクリックして走らせて、という感じで「素のGDB」を使うケースが少ないじゃないかと思います(私はGDBのコマンドなど完全に忘れてました。元から大して使い込んでなかったし。)

今回はGDBの持つTUIモードを使ってアセンブラ命令レベルでのステップ実行やレジスタの観察ができることを確かめたいと思います。

TUI(Text User Interface)モードでの起動は以下です。ターゲットのasm000ファイルは、前々回、clang/llvmでビルド(-g -O0)してあるものです。

$ gdb -tui ./asm000

TUIモードで立ち上げると、冒頭のアイキャッチ画像のように「ソースウインドウ」をともなってGDBが立ち上がってきます。下側のコマンド入力部分はGDBのプロンプトがあらわれて普通にコマンド入力できます。listコマンドを打ち込まなくてもソースが見えているので「安心感」が半端ないです。

起動しただけではまだ被デバッグのプロセスが存在していないので、適当にブレークポイント張って run することで実体が生成されます。今回の「アセンブラレベルでの命令動作の観察」という目的向けには以下のようにすることにいたしました。

    • tui reg general  で汎用(整数)レジスタファイルを常時表示
    • display/i $pc でカレントのPCの指す命令を逆アセンブル表示

この設定をしたところが以下に。

gdbTUI007

ここで stepi 命令を使えば、1命令毎にステップ実行してくれます(関数を呼び出す場合には中に入っていく。)1ステップ実行したところが以下に。

gdbTUI008

アセンブラで書いた被テスト関数の中に入ると、ソース表示はアセンブラソースに切り替わります。らくちん。

ステップ実行を繰り返せば、上部のレジスタウインドウの中でレジスタが書き換わって行きます。書き換わった部分が反転表示されるので分かり易いです。また、デフォルトで16進と10進併記のところも得点が高い?です。

gdbTUI010

このくらいの表示ができれば十分ですかね。実は gdbの上に被せる cgdb というインタフェース・プログラムもダウンロードしてあるのです。cgdbはまた今度確かめてみますかね。一番はデバッガのコマンド忘れないことだけれども。。。

ぐだぐだ低レベルプログラミング(61) ARM64(AArch64)、レジスタ一覧描いてみた へ戻る

ぐだぐだ低レベルプログラミング(62) ARM64(AArch64)、Add命令その1即値 へ進む