Time Travel Debugging でコンピュータの動きを知ろう

Windows OS のデバッグをする人にはお馴染みの TTD (Time Travel Debugging) ツールですが、このツール、コンピュータ教育に使えるんじゃないのかな?と思うのは私だけだろうか。

Time Travel Debugging - 概要
https://learn.microsoft.com/ja-jp/windows-hardware/drivers/debugger/time-travel-debugging-overview

まあ、その前に、コンピュータがどうやって動いているのか、というコンピュータ概論は理解していただいた上での話しではあるのですが、実際にコンピュータのデータの動きが見たい人にはよいのではないでしょうか。

コンピュータはご存じのとおり、デジタルデータを解釈して動作しています。メモリ内にデータを読み込み、プロセッサがそのデータを読み取り、解釈してプログラムが動きます。

デジタルデータはマシン語として解釈されて動いていますが、このデータを人間にも分かりやすく表現してくれるのがアセンブリ言語です。このアセンブリレベルまで確認できるのが、WinDBG などのデバッグツールです。

デバッグはメモリダンプを出力した瞬間、もしくはデバッグブレークした瞬間の静的なデータですが、このデータを動的にキャプチャできるのが、この TTD ツールです。

UNIX にもあるとよいのですが、今のところ、Windows にしかないツールです。

以下具体例となりますが、例えば、以下のようにスタックにレジスタの値が積まれる動作をみる場合、

t コマンドで、アセンブラコードを一個進めると、push rdp コマンドにより、以下のようにスタックに rbp レジスタの値が積まれる動作が確認できます。

この操作はライブデバッグと同じなのですが、ここで t- コマンドって打つと、この処理を巻き戻せるんですよ。動的なデータとしてキャプチャしているので、自由自在です。
調査なんかでも、直接的にはこの処理で例外が発生しているけど、この値はもっと前のここのデータからきています、みたいな調査もできます。


勉強の話に戻りますが、アセンブリを勉強しながら、スタックがどのように積まれるかって、本をみても理解しにくいですよね。でも、TTD を動かして、進めたり戻したりしてレジスタの値をみたり、スタック ポインタの位置をみたりすれば動きが理解できるんです。C 言語のポインタや仮想アドレスを理解する上でも良いツールだと思います。

Visual Studio とか開発環境でもアセンブリ表示できるんですけど、TTD は対象プロセスのコードがなくてもアセンブラ コードが見えるのが便利です。悪いことに使っちゃだめですよ。

昔は、SoftIce などの優秀なデバッガ ツールがありましたけど、最近はみなくなりましたねえ。こういうコンピュータの深層部をみる必要がない、とか言う人がいますけど、本当にそうですかねえ。

最終的にエンジニアとして生き残るのは、こういうレベルでコンピュータを理解する人だけだと私は思いますよ。普通にコード書く仕事は AI に飲み込まれるでしょうし、その AI がどう動いているのか、みたいな根本的な部分は結局のところメモリ内の動作が見れる人しか役に立たないんじゃないかって私は想像しています。

私の言葉を信じる方は、まずは上原さんのデバッグの本を読んで勉強しましょう。これができて、やっと TTD を使える感じかな。

ちなみに、この本のプロデュースは私がしていたりします。宣伝したいわけではありません。エンジニアとして生き残りたい人は少し理解できるようにしましょう。

説明したように、TTD ツールはコンピュータの動作がステップ毎に確認できるので、データをみてコンピュータを理解したい人にはうってつけだと思います。