下面介紹如何在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;
}
還沒有直接的答案,但我發現了由PIN_AddInternalExceptionHandler設置的全局未捕獲異常處理程序的作品。就像[SetUnhandledExceptionFilter](http://msdn.microsoft.com/en-us/library/windows/desktop/ms680634(v = vs.85).aspx)所做的一樣。 –
你實際插入這段代碼的重要性在於瞭解你的問題。事實上,你這樣描述它:「在我的pintool的主要功能」表明你沒有理解pintools如何工作,特別是分析和儀器的時間。因此,這不能被認爲是一個問題。換言之,這個問題不夠精確,無法解決。你應該更詳細地解釋你的問題。 – Heyji
@Heyji顯然這是在主要的分析時間,它沒有捕獲拋出的異常,代碼是如此之短而且可重複,爲什麼它不夠精確? –