$30 off During Our Annual Pro Sale. View Details »
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
18
マイコン向けのただのリンカを自作してみた話
simotin13
0
40
Featured
See All Featured
4 Signs Your Business is Dying
shpigford
186
22k
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Reflections from 52 weeks, 52 projects
jeffersonlam
355
21k
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
22k
Producing Creativity
orderedlist
PRO
348
40k
The Power of CSS Pseudo Elements
geoffreycrofte
80
6.1k
The Art of Programming - Codeland 2020
erikaheidi
56
14k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.3k
Agile that works and the tools we love
rasmusluckow
331
21k
Designing for Performance
lara
610
69k
We Have a Design System, Now What?
morganepeng
54
7.9k
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
ご清聴どうもありがとうございました。