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.4k
Pinでコードカバレッジツールを自作してみた話
Intelから公開されているPinという動的バイナリ計装ツールを使ってコードカバレッジツールを自作してみた話です。
simotin13
August 10, 2024
Tweet
Share
More Decks by simotin13
See All by simotin13
C/C++用のコードカバレッジツールを自作してみた話
simotin13
0
21
マイコン向けのただのリンカを自作してみた話
simotin13
0
46
Featured
See All Featured
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
5
710
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
270
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.3k
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
150
What’s in a name? Adding method to the madness
productmarketing
PRO
24
3.9k
Why Our Code Smells
bkeepers
PRO
340
58k
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
0
120
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
44
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
2.7k
The browser strikes back
jonoalderson
0
330
Heart Work Chapter 1 - Part 1
lfama
PRO
5
35k
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
890
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
ご清聴どうもありがとうございました。