c++ - 英特尔引脚 : correctly continuing execution after RECEIVED_ACCESS_FAULT exception

标签 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_SafeCopy() 从您的分析例程访问应用程序内存,即 declared如下:

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

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

关于c++ - 英特尔引脚 : correctly continuing execution after RECEIVED_ACCESS_FAULT exception,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50633331/

相关文章:

C++ std::string 和字符串

haskell - Cabal 在需要分析库时没有安装依赖项?

c - 有一些我没用过的奇怪的 malloc 函数

c++ - 无法编译 Intel Pin

c++ - 如何使用静态库编写 R 扩展

C++ 使用 Map 中的参数调用函数

c++ - 如何避免调用 vector 中元素的复制构造函数

c# - 在不访问 SQL Server Profiler 的情况下分析 ADO.NET 语句

ruby-on-rails - 是否有用于 Ruby on Rails 的分析 gem/插件?