2014-05-05 45 views
0

我現在正在學習英特爾引腳,我在我的pintool的主要函數中編寫以下代碼。英特爾引腳工具不能拋出拋出異常

try 
{ 
    throw std::exception("test daniel"); 
} 
catch (std::exception& e) 
{ 
    printf(e.what()); 
} 

運行(pin.exe -t Test.dll的 - 的calc.exe),但它只是墜毀,這肯定是由於未捕獲到異常。 但我想知道爲什麼我的「catch」代碼失敗。

任何人都知道原因,或者如何在pintool中發現異常?

+0

還沒有直接的答案,但我發現了由PIN_AddInternalExceptionHandler設置的全局未捕獲異常處理程序的作品。就像[SetUnhandledExceptionFilter](http://msdn.microsoft.com/en-us/library/windows/desktop/ms680634(v = vs.85).aspx)所做的一樣。 –

+0

你實際插入這段代碼的重要性在於瞭解你的問題。事實上,你這樣描述它:「在我的pintool的主要功能」表明你沒有理解pintools如何工作,特別是分析和儀器的時間。因此,這不能被認爲是一個問題。換言之,這個問題不夠精確,無法解決。你應該更詳細地解釋你的問題。 – Heyji

+0

@Heyji顯然這是在主要的分析時間,它沒有捕獲拋出的異常,代碼是如此之短而且可重複,爲什麼它不夠精確? –

回答

1

下面介紹如何在pintool中引發異常,假設您擁有所有必需的編譯選項。應該指出的是,這個簡單的pintool除了捕獲pin或工具(而不是應用程序)拋出的異常外,什麼也不做。

您將注意到異常處理函數的註冊在PIN_StartProgram()函數之前發生,否則異常將被忽略。

最後,儘管在文檔中沒有提到它,但我希望在調用PIN_AddInternalExceptionHandler()和PIN_StartProgram()之前拋出的異常不會被處理程序捕獲。相反,我希望處理程序能夠捕獲PIN_StartProgram()後拋出的異常,但同樣,文檔中未提及它。

//-------------------------------------main.cpp-------------------------------- 
#include "pin.h" 
#include <iostream> 


EXCEPT_HANDLING_RESULT ExceptionHandler(THREADID tid, EXCEPTION_INFO *pExceptInfo, PHYSICAL_CONTEXT *pPhysCtxt, VOID *v) 
{ 
    EXCEPTION_CODE c = PIN_GetExceptionCode(pExceptInfo); 
    EXCEPTION_CLASS cl = PIN_GetExceptionClass(c); 
    std::cout << "Exception class " << cl; 
    std::cout << PIN_ExceptionToString(pExceptInfo); 
    return EHR_UNHANDLED ; 
} 

VOID test(TRACE trace, VOID * v) 
{ 
    // throw your exception here 
} 

int main(int argc, char *argv[]) 
{ 
    // Initialize PIN library. This was apparently missing in your tool ? 
    PIN_InitSymbols(); 
    if(PIN_Init(argc,argv)) 
    { 
     return Usage(); 
    } 

    // Register here your exception handler function 
    PIN_AddInternalExceptionHandler(ExceptionHandler,NULL); 

    //register your instrumentation function 
    TRACE_AddInstrumentFunction(test,null); 

    // Start the program, never returns... 
    PIN_StartProgram(); 

    return 0; 
} 
+0

不錯的代碼,但它似乎仍然是一個全局未捕獲的異常處理程序,它不負責特定的代碼段,但是對於全局代碼(甚至不像您提到的那樣全局),這不是try/catch設計的,嘗試/捕捉只有嵌套時強大。 –