Использование библиотеки повышения с Intel Pin

Я пытаюсь использовать библиотеку Boost 1.60.0 с Intel Pin 2.14-71313-msvc12-windows. Следующий фрагмент кода представляет собой простую реализацию, которую я сделал, чтобы опробовать вещи:

#define _CRT_SECURE_NO_WARNINGS
#include "pin.H"
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <stdlib.h>
#include <sstream>

#include <time.h>

#include <boost/lockfree/spsc_queue.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>

   namespace boost_network{
    #include <boost/asio.hpp>
    #include <boost/array.hpp>
}

//Buffersize of lockfree queue to use
const int BUFFERSIZE = 1000;

//Tracefiles for error / debug purpose
std::ofstream TraceFile;

//String wrapper for boost queue
class statement {
public:
    statement(){ s = ""; }
    statement(const std::string &n) : s(n) {}
    std::string s;
};

//string queue to store inserts
boost::lockfree::spsc_queue<statement,     boost::lockfree::capacity<BUFFERSIZE>> buffer; // need lockfree queue for     multithreading

//Pin Lock to synchronize buffer pushes between threads
PIN_LOCK lock;

KNOB<string> KnobOutputFile(KNOB_MODE_WRITEONCE, "pintool", "o", "calltrace.txt", "specify trace file name");
KNOB<BOOL>   KnobPrintArgs(KNOB_MODE_WRITEONCE, "pintool", "a", "0", "print call arguments ");

INT32 Usage()
{
    cerr << "This tool produces a call trace." << endl << endl;
    cerr << KNOB_BASE::StringKnobSummary() << endl;
    return -1;
}

VOID ImageLoad(IMG img, VOID *)
{
    //save module informations
    buffer.push(statement("" + IMG_Name(img) + "'; '" + IMG_Name(img).c_str() + "'; " + IMG_LowAddress(img) + ";"));
}

VOID Fini(INT32 code, VOID *v)
{

}

void do_somenetwork(std::string host, int port, std::string message)
{
    boost_network::boost::asio::io_service ios;
    boost_network::boost::asio::ip::tcp::endpoint endpoint(boost::asio::ip::address::from_string(host), port);
    boost_network::boost::asio::ip::tcp::socket socket(ios);
socket.connect(endpoint);

boost_network::boost::system::error_code error;
socket.write_some(boost_network::boost::asio::buffer(message.data(), message.size()), error);

socket.close();
}

void WriteData(void * arg)
{
    int popped; //actual amount of popped objects
    const int pop_amount = 10000;
    statement curr[pop_amount];
    string statement = "";

    while (1) {
        //pop more objects from buffer
        while (popped = buffer.pop(curr, pop_amount))
        {
            //got new statements in buffer to insert into db: clean up statement
            statement.clear();

            //concat into one statement
            for (int i = 0; i < popped; i++){
                statement += curr[i].s;
            }

            do_somenetwork(std::string("127.0.0.1"), 50000,     sql_statement.c_str());
        }
        PIN_Sleep(1);
    }
}

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

    //write address of label to TraceFile
    TraceFile.open(KnobOutputFile.Value().c_str());
    TraceFile << &label << endl;
    TraceFile.close();

    // Initialize the lock
    PIN_InitLock(&lock);

    // Initialize pin
    if (PIN_Init(argc, argv)) return Usage();

    // Register ImageLoad to be called when an image is loaded
    IMG_AddInstrumentFunction(ImageLoad, 0);

    //Start writer thread
    PIN_SpawnInternalThread(WriteData, 0, 0, 0);

    PIN_AddFiniFunction(Fini, 0);

    // Never returns

    PIN_StartProgram();

    return 0;
}

Когда я создаю приведенный выше код, Visual Studio не может найти boost_network::boost::asio::ip и продолжает выдавать ошибку, говоря, что asio:: ip не существует. Ранее я сам писал этот вопрос: отправляя данные из клиента boost asio, и после использования предоставленного решения в той же рабочей области код работал нормально, и я смог общаться по сети. Я не уверен, что здесь происходит не так. По какой-то причине использование другого пространства имен, похоже, не работает, поскольку в нем говорится, что boost должен находиться в пространстве имен по умолчанию. Однако, если я не добавлю пространство имен, в этом случае строка,KNOB<BOOL> KnobPrintArgs(KNOB_MODE_WRITEONCE, "pintool", "a", "0", "print call arguments "); выдает ошибку, говоря, что BOOL неоднозначно. Пожалуйста, предложите, что должно быть жизнеспособным решением в этой ситуации. Я использую Visual Studio 2013. Тот же фрагмент кода с использованием только Pin также работает без сетевой части, и я могу записывать данные, сгенерированные из Pin, в плоский файл.

0 ответов

Другие вопросы по тегам