fstream与Pin不兼容

时间:2018-03-08 22:55:59

标签: c++ binary instrumentation intel-pin

我编写了一个非常简单的Pin工具,它只包含一个工具函数,即下面的instruction。它没有分析功能/回调。其目的是仅存储可能执行的指令的地址。

#include <cstdint>
#include <iostream>
#include <fstream>
#include <list>
#include "pin.H"

std::ofstream of1;
std::list<uint64_t> instrList;
uint64_t instrCount = 0;

VOID instruction(INS ins, VOID* v)
{
    ADDRINT ip = INS_Address(ins);
    of1 << ip << std::endl;
    of1.flush();
    instrList.push_back(ip);
    ++instrCount;
}

VOID finishFunc(INT32 code, VOID *v)
{
    of1.close();

    std::ofstream of2;
    of2.open("out2.txt", std::ofstream::out);
    of2 << std::hex;
    for (std::list<uint64_t>::iterator i = instrList.begin(); i != instrList.end(); ++i)
        of2 << *i << std::endl;
    of2.close();

    std::cerr << "Instruction count: " << instrCount << std::endl;
}

int main(int argc, char* argv[])
{
    PIN_Init(argc, argv);

    of1.open("out1.txt", std::ofstream::out);
    of1 << std::hex;

    INS_AddInstrumentFunction(instruction, 0);
    PIN_AddFiniFunction(finishFunc, 0);

    PIN_StartProgram();

    return 0;
}

文件out1.txtout2.txt的内容应该相同。 我将此Pin工具附加到某些程序,例如/bin/ls。对于他们来说,out1.txtout2.txt是相同的。但是,当我将其附加到gcc编译代码时,out1.txt会有比out2.txt更多的行。 out2.txt有一些等于instrCount的行,这似乎是合理的。似乎fstream对应out1.txt存在问题。与out1.txt相比,out2.txt有许多重复的行。

这些代码段显示它们开始不同的地方(标有<):

out1.txt:。

7f87ceb050a2
7f87ceb050a4
7f87ceb050a5
7f87ceb050a8
7f87ceb050aa
7f87ceb050b2
7f87ceb050b7
7f87ceb050b9
<7f87ceb050a4
<7f87ceb050a5
<7f87ceb050a8
<7f87ceb050aa
<7f87ceb050b2
<7f87ceb050b7
<7f87ceb050b9
<7f87ceb050b2
45218c
<7f87ceb050b7
45218e
<7f87ceb050b9
452190

out2.txt:

7f87ceb050a2
7f87ceb050a4
7f87ceb050a5
7f87ceb050a8
7f87ceb050aa
7f87ceb050b2
7f87ceb050b7
7f87ceb050b9
45218c
45218e
452190

我在PIN_LOCK内部使用instruction功能,但这并没有改变任何内容。我还尝试使用fprintf写入输出文件,但问题仍然存在。

知道如何解决这个问题吗?

0 个答案:

没有答案