Intel Pin:在RECEIVED_ACCESS_FAULT异常后正确继续执行

时间:2018-05-31 21:53:09

标签: c++ profiling intel-pin

在我的一个分析例程中,我收到一个void*指针作为输入,这可能是一个指向字符串的“好”指针。

要检查错误指针的情况,我使用此处提出的IsBadPointer变体Most efficient replacement for IsBadReadPtr?

然而,这并不完全可靠。所以,我想捕获引发RECEIVED_ACCESS_FAULT异常,当它试图引用一个错误的指针时,将指针的值更改为一个好的值,然后继续执行。

所以,为了尝试这一点,我在我的分析例程中引用了一个全局NULL指针(string_pointer),并按如下方式设置了异常处理程序:

    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::cerr << "Exception class " << cl << endl;
    std::cerr << PIN_ExceptionToString(pExceptInfo) << endl;

    //Change string_pointer contents from NULL
    string_pointer = "<Invalid Memory>";

    return EHR_HANDLED;
}

不幸的是,这不会起作用,因为pin工具卡在异常处理程序中。有什么建议可以解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

您应始终使用PIN_SafeCopy()declared访问分析例程中的应用程序内存,如下所示:

size_t LEVEL_PINCLIENT::PIN_SafeCopy(VOID* dst, const VOID* src, size_t size)

该函数返回从源缓冲区成功复制的字节数。因此,您可以将其与size进行比较,以确定它是否完全成功。 PIN_SafeCopyEx()是一个类似的功能,可在发生故障时提供附加信息。