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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
simotin13
August 10, 2024
1.7k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Pinでコードカバレッジツールを自作してみた話
Intelから公開されているPinという動的バイナリ計装ツールを使ってコードカバレッジツールを自作してみた話です。
simotin13
August 10, 2024
More Decks by simotin13
See All by simotin13
RTSPクライアントを自作してみた話
simotin13
0
580
C/C++用のコードカバレッジツールを自作してみた話
simotin13
0
50
マイコン向けのただのリンカを自作してみた話
simotin13
0
95
Featured
See All Featured
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
830
How to make the Groovebox
asonas
2
2.2k
The SEO Collaboration Effect
kristinabergwall1
1
480
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
330
Information Architects: The Missing Link in Design Systems
soysaucechin
0
970
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.9k
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
450
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.3k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
Tell your own story through comics
letsgokoyo
1
950
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
22k
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
ご清聴どうもありがとうございました。