0

我正在创建一个大型 pintool,我有两个问题:


该工具(以下仅删减到相关部分)有时无法识别特定执行指令的图像/例程。有人知道什么时候/为什么会发生吗?


该工具(在检测 Barnes-Hut 基准测试时)在运行一段时间后总是以内存不足 (OOM) 错误终止(尽管基准测试在独立运行时成功完成)。使用哪些工具来调试/跟踪 Pin-instrumented 应用程序的 OOM 错误?

int main(int argc, char *argv[])
{
    PIN_InitSymbols();
    if( PIN_Init(argc, argv) )
    {
    return 0;
    }

    INS_AddInstrumentFunction(Instruction, 0);

    PIN_StartProgram();

    return 0;
}

VOID Instruction(INS ins, VOID *v)
{
    INS_InsertPredicatedCall( ins,
    IPOINT_BEFORE, 
    (AFUNPTR) handle_ins_execution,
    IARG_INST_PTR,
    .....);
}


VOID handle_ins_execution (ADDRINT   addr, ...)
{
    PIN_LockClient();
    IMG img = IMG_FindByAddress(addr);
    RTN rtn = RTN_FindByAddress(addr);
    PIN_UnlockClient();
    if( IMG_Valid(img) ) {
    std::cerr << "From Image  : " << IMG_Name( img ) << std::endl;
    } else {
    std::cerr << "From Image  : " << "(UKNOWN)" << std::endl;
    }
    if( RTN_Valid(rtn) ) {
    std::cerr << "From Routine  : " << RTN_Name(rtn) << std::endl;
    } else {
    std::cerr << "From Routine  : " << "(UKNOWN)" << std::endl;
    }
}
4

1 回答 1

0

我最近在 PinHeads 论坛上问过这个问题,我正在等待回复。我在文档中读到的是 IMG_FindByAddress 函数通过查找“对于每个图像,检查地址是否在其一个段的映射内存区域内”来运行。执行的指令可能不在有效范围内。

对于这种情况,了解图像的最佳方法是查看上下文。我的 pintool(基于 DebugTrace)即使不知道它在什么图像中也会继续运行。您可以查看发生这种情况之前和之后的日志条目。我一直在 OSX 的 dydl 中看到这一点。

于 2013-11-04T16:41:29.417 回答