簡體   English   中英

gcc-如何自動檢測每個基本塊

[英]gcc - how to auto instrument every basic block

GCC具有用於功能輸入/退出自動儀器選項。

-finstrument-functions生成用於調用和退出函數的檢測調用。 在函數進入之后和函數退出之前,將使用當前函數的地址及其調用站點來調用以下概要分析函數。 (在某些平台上,__ builtin_return_address不能在當前功能之外運行,因此,分析功能可能無法使用調用站點信息。)void __cyg_profile_func_enter(無效* this_fn,無效* call_site); void __cyg_profile_func_exit(void * this_fn,void * call_site);

我希望每個“基本塊”都有這樣的內容,以便我可以動態記錄每個分支的執行情況。

我該怎么做?

有一個名為American Fuzzy Lop的模糊器 ,它解決了非常相似的檢測基本塊之間的跳轉以收集邊緣覆蓋率的問題 :如果基本塊是頂點,則在執行過程中會遇到什么跳轉(邊緣)。 值得一看其來源。 它具有三種方法:

  • afl-gccafl-gcc的包裝程序,由包裝程序替代as它根據基本的塊標簽和跳轉指令重寫了匯編代碼
  • Clang編譯器插件
  • QEMU補丁,用於檢測已編譯的代碼

另一個也是最簡單的選擇可能是使用DynamoRIO動態儀表系統。 與QEMU不同,它是專門為實現自定義工具而設計的(可以手動重寫機器代碼,也可以簡單地插入一些調用,如果我正確掌握了文檔,甚至在某些情況下可以自動內聯)。 如果您認為動態檢測非常困難,請看一下它們的示例-它們只有大約100-200行(但是您仍然至少需要在這里以及關於二手功能閱讀它們的文檔,因為它可能包含一些要點:例如DR構造動態基本塊,這與編譯器的經典基本塊不同 使用動態檢測,您甚至可以檢測使用過的系統庫。 如果這不是您想要的,可以使用類似

static module_data_t *traced_module;

// in dr_client_main
traced_module = dr_get_main_module();

// in basic block event handler
void *app_pc = dr_fragment_app_pc(tag);
if (!dr_module_contains_addr(traced_module, app_pc)) {
    return DR_EMIT_DEFAULT;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM