Engineering Report <dv> - Week 29, 2015
Highlights
- re2 - benchlog: Add gnuplot support
用 Python script 爬 re2 benchlog 生出需要的 gnuplot script 再畫出圖表
- 把之前 cross-compile 的 Valgrind 丟到 Android Emulator 裡跑
成功 adb push 進去,也會 work
在自己筆電上跑 Android Emulator (x86_64 -> ARM),跑起來感覺很慢,印象中把 cross-compile 的 Valgrind push 進去就花了 10 mins
- 閱讀 [2007] Valgrind: A Framework for Heavyweight Dynamic Binary Instrumentation
Valgrind 把重點放在 shadow value 這個概念上
- DBI framework 對 client code 的 representation 有兩種方式 (D&R, C&A)
D&R (disassemble-and-resynthesise) 為 Valgrind 現在使用的方式,會先把 machine code 轉成 IR (原本 client code 的所有影響都必須明確地轉成 IR),加入 instrumentation 用的 IR,最後轉回 machine code
- C&A (copy-and-annotate) 的作法則是把 instructions 逐個複製,對每個 instruction 加上註解描述影響 (annotate),利用這些描述來幫助 instrumentation
經由 data structures 來描述 (DynamoRIO)
經由 instruction-querying API (Pin)
- Valgrind 的架構有變動過 (三個版本)
- 第一版為使用 LD_PRELOAD 的方式把 Valgrind core 和 tool inject 到 client
對靜態連結不管用
較不 portable
也會有部份 client 程式在 Valgrind 掌控外事先執行過
大部份 DBI frameworks 使用這種方式
第二版和現在架構類似,但需要一大塊空的 memory mappings 來放 components,較不 reliable
- Valgrind 運作八步驟
machine code -> tree IR (反組譯)
tree IR -> flat IR (優化,刪 redundant copy)
flat IR -> flat IR (加入 instrumentation 用的 IR)
flat IR -> flat IR (優化,constant folding、dead code removal)
flat IR -> tree IR (為 instruction list 準備)
tree IR -> instruction list (top down tree matching algorithm)
instruction list -> instruction list (register allocation,把 virtual register 換成 host register)
instruction list -> machine code (組譯)
Plans
- /VEX/pub/libvex_ir.h
有很多 VEX IR 相關的資訊可以參看
把 Valgrind 的結果生成 HTML report (原定要做到的目標)