我正在创建一个大的pintool,我有两个问题:
该工具(仅在下面删节到相关部分)有时无法识别特定执行指令的映像/例程。有人知道这种情况何时/为什么会发生吗?
该工具(在检测Barnes-Hut基准测试时)在运行一段时间后总是以内存不足(OOM)错误终止(尽管在独立运行时,基准测试会成功完成)。使用哪些工具来调试/跟踪引脚仪表应用程序的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;
}
}
我最近在PinHeads论坛上问了这个问题,我正在等待回应。我在文档中读到的是IMG_FindByAddress函数通过查找"对于每个图像,检查地址是否在其一个段的映射内存区域内"来操作。可能会执行不在有效范围内的指令。
在这种情况下,知道它在哪个图像中的最好方法是查看上下文。我的pintool(基于DebugTrace)即使不知道它在哪个图像中也会继续运行。您可以查看此操作发生之前和之后的日志条目。我在OSX上的dydl中经常看到这个