srupのメモ帳

競プロで解いた問題や勉強したことを記録していくメモ帳

Intel Pin の使い方

Dynamic Binary Instrumentation (DBI) は実行時にバイナリに命令を挿入することによって, プログラムの実行トレースから情報を取り出す技術であり, それを用いたツールの一つである Intel Pin を使っていく. 以下で簡単に使っていく手順をメモしていく.
公式のUser Guide もある. User Guid

1. インストール

OSにあったものを, url からダウンロードし, 以下のコマンドで解凍する.

$ tar zxf pin-3.7-97619-g0d0c92f4f-gcc-linux.tar.gz

回答したフォルダにサンプルが入っているので, それを移管コマンドでコンパイルする.

$ cd pin-3.7-97619-g0d0c92f4f-gcc-linux/source/tools/SimpleExamples
$ make all TARGET=intel64

コンパイルが終わると, obj_intel64 フォルダのしたに, サンプル例を実際の動かすための共有ライブラリ(.so) が出来上がる.

2. 実行方法

pin の実行方法は Usage: pin [OPTION] [-t <tool> [<toolargs>]] -- <command line> である.

例えば, 実行した命令数をカウントしたい場合以下のようにすれば良い. 下の例では, /bin/ls を実行したときの命令数をカウントしている.

$ ../../../pin -t obj-intel64/inscount0.so -- /bin/ls
buffer_linux.cpp       follow_child_app2.cpp  inscount_tls.cpp  nonstatica.cpp               stack-debugger.cpp
buffer_windows.cpp     follow_child_tool.cpp  invocation.cpp    obj-intel64              statica.cpp
countreps.cpp          fork_app.cpp       isampling.cpp pinatrace.cpp                staticcount.cpp
detach.cpp         fork_jit_tool.cpp      itrace.cpp    proccount.cpp                strace.cpp
divide_by_zero_unix.c  imageload.cpp          little_malloc.c   replacesigprobed.cpp             w_malloctrace.cpp
divide_by_zero_win.c   inscount.out       makefile      safecopy.cpp
emudiv.cpp         inscount0.cpp          makefile.rules    stack-debugger-tutorial.sln
fibonacci.cpp          inscount1.cpp          malloc_mt.cpp stack-debugger-tutorial.vcxproj
follow_child_app1.cpp  inscount2.cpp          malloctrace.cpp   stack-debugger-tutorial.vcxproj.filters

実際の結果は, inscount.out に吐き出されているので, 確認してみる実行命令数が以下のように記載されている.

$ cat inscount.out
Count 729204

参考文献

  • [intel Pinを使ってみる]

inaz2.hatenablog.com