Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Pinでコードカバレッジツールを自作してみた話
Search
simotin13
August 10, 2024
0
1.3k
Pinでコードカバレッジツールを自作してみた話
Intelから公開されているPinという動的バイナリ計装ツールを使ってコードカバレッジツールを自作してみた話です。
simotin13
August 10, 2024
Tweet
Share
More Decks by simotin13
See All by simotin13
C/C++用のコードカバレッジツールを自作してみた話
simotin13
0
18
マイコン向けのただのリンカを自作してみた話
simotin13
0
31
Featured
See All Featured
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.2k
Testing 201, or: Great Expectations
jmmastey
45
7.7k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
23
1.5k
jQuery: Nuts, Bolts and Bling
dougneiner
65
7.9k
VelocityConf: Rendering Performance Case Studies
addyosmani
333
24k
Done Done
chrislema
185
16k
YesSQL, Process and Tooling at Scale
rocio
173
15k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
9
930
Making the Leap to Tech Lead
cromwellryan
135
9.6k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
How To Stay Up To Date on Web Technology
chriscoyier
791
250k
Why You Should Never Use an ORM
jnunemaker
PRO
59
9.6k
Transcript
Pinを使ってコードカバレッジツールを 自作してみた話 @simotin13
Who am I? @simotin13 Hiroyuki Miyazaki ・関西で主に組込系のコード書いてます。 ・組込,Ruby,低レイヤが好きです。
Abstract~話す内容~ ・Intelが公開しているPinという動的バイナリ計装ツール(Dynamic Binary Instrumentation Tool)を使って、カバレッジツールを書いてみました。 ・2022年のkernel/VM online part5で発表させて頂いた、gdbとDWARFを使ってカバ レッジツールを作ったというネタの続編的なお話しになります。
Motivation そもそもなぜカバレッジツールを作っているのか? ・組込開発(マイコン)で気軽に使えるカバレッジツールが欲しい ・gdbを使うことでアーキテクチャやプラットフォームに依存しないトレース ができる。
Motivation 課題 gdbのトレースが遅い!
Motivation ▪引用 34C3 - Implementing an LLVM based Dynamic Binary
Instrumentation framework https://www.youtube.com/watch?v=Zt74lOuU6zc デバッガ(gdb)を使うとトレースが遅くなるのはあるある
Motivation デバッガ(gdb)を使うと遅くなるのはトレースあるある ・解決策として動的バイナリ計測 (DynamicBinaryInstrumentation)のツールが使われている →DBI、Pinについては「実践バイナリ解析」という書籍でも解説さ れていたので調べてみることに。
About Pin Intelが公開しているPinというDBIツールを使ってみる https://www.intel.com/content/www/us/en/developer/articles/tool/pin- a-dynamic-binary-instrumentation-tool.html ・Linux,Windows,macOS上で動作する ・Pin本体はソースコード非公開 ・API(C++)がたくさんあって嬉しい(examplesも結構そろっている) ・任意のプログラムのトレースができる ・DWARFの解析をやってくれる(ただしDWARF4限定)
・Instructionレベルでの計装が可能 ・マニュアルが充実している ・コミュニティ(メーリングリスト)が活発
How to make coverage tool カバレッジツールの作り方 トレーサー ソースコードの行番 号と.textのアドレス のマッピング情報
+ = カバレッジツール
About Pin Intelが公開しているPinというDBIツールを使ってみる https://www.intel.com/content/www/us/en/developer/articles/tool/pin- a-dynamic-binary-instrumentation-tool.html ・Linux,Windows,macOS上で動作する ・Pin本体はソースコード非公開 ・API(C++)がたくさんあって嬉しい(examplesも結構そろっている) ・任意のプログラムのトレースができる ・DWARFの解析をやってくれる(ただしDWARF4限定)
・Instructionレベルでの計装が可能 ・マニュアルが充実している ・コミュニティ(メーリングリスト)が活発 必要条件を満たしてくれる Good!
About Pin Intelが公開しているPinというDBIツールを使ってみる https://www.intel.com/content/www/us/en/developer/articles/tool/pin- a-dynamic-binary-instrumentation-tool.html ・Linux,Windows,macOS上で動作する ・Pin本体はソースコード非公開 ・API(C++)がたくさんあって嬉しい(examplesも結構そろっている) ・任意のプログラムのトレースができる ・DWARFの解析をやってくれる(ただしDWARF4限定)
・Instructionレベルでの計装が可能 ・マニュアルが充実している ・コミュニティ(メーリングリスト)が活発 代わりに泥水をすすってくれる Thanks!
About Pin Intelが公開しているPinというDBIツールを使ってみる https://www.intel.com/content/www/us/en/developer/articles/tool/pin- a-dynamic-binary-instrumentation-tool.html ・Linux,Windows,macOS上で動作する ・Pin本体はソースコード非公開 ・API(C++)がたくさんあって嬉しい(examplesも結構そろっている) ・任意のプログラムのトレースができる ・DWARFの解析をやってくれる(ただしDWARF4限定)
・Instructionレベルでの計装が可能 ・マニュアルが充実している ・コミュニティ(メーリングリスト)が活発 代わりに泥水をすすってくれる Thanks! void PIN_GetSourceLocation(ADDRINT address, INT32 *column, INT32 *line,std::string *fileName) →命令のアドレスを渡すとファイル名、行番号・カラム位置を返してくれるAPIをPinが提供してくれて いる
About Pin Intelが公開しているPinというDBIツールを使ってみる https://www.intel.com/content/www/us/en/developer/articles/tool/pin- a-dynamic-binary-instrumentation-tool.html Linux,Windows,macOS上で動作する ・Pin本体はソースコード非公開 ・API(C++)がたくさんあって嬉しい(examplesも結構そろっている) ・任意のプログラムのトレースができる ・DWARFの解析をやってくれる(ただしDWARF4限定)
・Instructionレベルでの計装が可能 ・マニュアルが充実している ・コミュニティ(メーリングリスト)が活発 C0?C1?C2? いえ、バイナリカバレッジです。 Excellent!
How to make a coverage tool ぼくのかんがえたさいきょうのカバレッジツールが作れそう! Pin DWARF +
= カバレッジツール
How to make a coverage tool ▪初期化時 ソースコードと.textのアドレスのマップを作る。 ▪実行時 プログラム実行時に実行されるアドレスを記録する。
ソースコードと.textのアドレスのマップから、どの行が実行されたかが分かる。 ▪終了時 ターゲットプログラムの終了後、実行された行の内容を踏まえて、レポート(HTML)を 生成する カバレッジツールのための計装
How to use Pin Pin用のプラグインのビルド Pinを使う人はAPIを使って計装したい処理をプラグイン(.so)として実装する。 Makefileに独特の作法があるのでexamplesのMakefileを参考にする必要がある。 Makefileが書けたらPIN_ROOTというPin本体へのパスを指定してビルド 例). make
PIN_ROOT=../pin-3.27-98718-gbeaa5d51e-gcc-linux
How to use Pin $./pin -t ./obj-intel64/CodeCoverage.so -- examples/c_function_call/cov_sample 1
2 Pinの使い方 実行したいプラグインを指定する コマンドライン引数は -- 以降に指定
Performance パフォーマンスを調べてみるためSQLiteをビルドして動かしてみた sqlite3.c 257,673行 shell.c 31,095行 ・mallocやstrlenなどの標準的な関数がやたらと自前で実装されている ・shellを起動する際に排他処理用のリソース初期化などを行う
Performance パフォーマンスを調べてみるためSQLiteをビルドして動かしてみた sqlite3.c 257,673行 shell.c 31,095行 ・mallocやstrlenなどの標準的な関数がやたらと自前で実装されている ・shellを起動する際に排他処理用のリソース初期化などを行う gdbでトレースすると30分以上経ってもシェルが表示され なかった...
Performance デモ
Performance Pinを使ったバージョンで普通にsqliteのシェル を起動したときと比べてほとんどパフォーマン スの劣化を感じない(体感)
Summary ・Pin(DBI)は早くて便利 ・C++やrustのプログラムで試すとsegmentation faultで落ちることがある(課題) ・最新のバージョンだとうまく動かなかった(課題)
References ~参考文献~ ▪Pinについて Intelの公式ページ https://www.intel.com/content/www/us/en/developer/articles/tool/pin-a-dynamic-binary-instrumentation-tool.html ▪DBIについて ・実践バイナリ解析 Dennis Andriesse 2022
KADOWAKA
ご清聴どうもありがとうございました。