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.2k
Pinでコードカバレッジツールを自作してみた話
Intelから公開されているPinという動的バイナリ計装ツールを使ってコードカバレッジツールを自作してみた話です。
simotin13
August 10, 2024
Tweet
Share
More Decks by simotin13
See All by simotin13
C/C++用のコードカバレッジツールを自作してみた話
simotin13
0
17
マイコン向けのただのリンカを自作してみた話
simotin13
0
29
Featured
See All Featured
Automating Front-end Workflow
addyosmani
1371
200k
Writing Fast Ruby
sferik
628
62k
Documentation Writing (for coders)
carmenintech
75
5k
A designer walks into a library…
pauljervisheath
208
24k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.4k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
229
22k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
45
2.5k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
18
1.2k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
33
2.4k
Designing for humans not robots
tammielis
254
25k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
8
560
What’s in a name? Adding method to the madness
productmarketing
PRO
23
3.7k
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
ご清聴どうもありがとうございました。