前々回、デフォルトでインストール済であったlldb (LLVM系?のデバッガ)を使ってみましたが、アセンブラレベルの表示がちょいと思うような感じと違っておりました。gdbとほぼほぼ互換とはいいつつも違うところはあるみたいです。そこで本家gdbをインストールし、TUIモードで動作させてみました。この感じかね。
※「ぐだぐだ低レベルプログラミング」投稿順indexはこちら
実験は、Androidスマホ上にインストールしたTermux環境に、パソコンからSSH接続して行っています。ユーザーモードですが、ほぼ普通にLinuxとして使用可能であります。SSH接続したところが以下に。
今回インストールして使用したGDBのバージョンは以下のとおりです。
GDBのマニュアルについては、以下から辿れるのではないかと思います。
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の指す命令を逆アセンブル表示
この設定をしたところが以下に。
ここで stepi 命令を使えば、1命令毎にステップ実行してくれます(関数を呼び出す場合には中に入っていく。)1ステップ実行したところが以下に。
アセンブラで書いた被テスト関数の中に入ると、ソース表示はアセンブラソースに切り替わります。らくちん。
ステップ実行を繰り返せば、上部のレジスタウインドウの中でレジスタが書き換わって行きます。書き換わった部分が反転表示されるので分かり易いです。また、デフォルトで16進と10進併記のところも得点が高い?です。
このくらいの表示ができれば十分ですかね。実は gdbの上に被せる cgdb というインタフェース・プログラムもダウンロードしてあるのです。cgdbはまた今度確かめてみますかね。一番はデバッガのコマンド忘れないことだけれども。。。