我正在创建一个大型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;
}
}
答案 0 :(得分:0)
我最近在PinHeads论坛上问了这个问题,我正在等待回应。我在文档中看到的是IMG_FindByAddress函数通过查找“为每个图像,检查地址是否在其中一个段的映射内存区域内”来操作。执行的指令可能不在有效范围内。
了解这种情况的最佳方式是查看上下文。我的pintool(基于DebugTrace)甚至在不知道它是什么图像的情况下继续运行。您可以在此之前和之后查看日志条目。我在OSX上的dydl一直都看到这个。