Esempio n. 1
0
static void updateEvents(PluginData* plugin, PDWriter* writer)
{
    char* res = 0;
    int len = 0;

	if (!plugin->conn)
		return;

	// Fetch the data that has been sent from VICE

    if (!getData(plugin, &res, &len))
        return;

	plugin->state = PDDebugState_stopException;

	// do data parsing here

	stopOnExec(plugin, res);

	parseRegisters(plugin, res, len);

	parseStep(plugin, res);

	parseBreakpoint(plugin, res, writer);

	parseDisassembly(writer, res, len);

	parseForCallstack(writer, res, len);
}
Esempio n. 2
0
void TbTrace::printDisassembly(const std::string &module, uint64_t relPc, unsigned tbSize)
{
    Disassembly::iterator it = m_disassembly.find(module);
    if (it == m_disassembly.end()) {
        llvm::sys::Path disassemblyListing;
        if (!m_library->findDisassemblyListing(module, disassemblyListing)) {
            std::cerr << "Could not find disassembly listing for module "
                         << module << std::endl;
            return;
        }

        if (!parseDisassembly(disassemblyListing.str(), m_disassembly)) {
            return;
        }
        it = m_disassembly.find(module);
        assert(it != m_disassembly.end());
    }

    //Fetch the basic blocks for our module
    ModuleBasicBlocks::iterator bbit = m_basicBlocks.find(module);
    if (bbit == m_basicBlocks.end()) {
        llvm::sys::Path basicBlockList;

        if (!m_library->findBasicBlockList(module, basicBlockList)) {
            std::cerr << "TbTrace: could not find basic block list for  "
                      << module << std::endl;
            exit(-1);
        }

        TbTraceBbs moduleBbs;

        if (!BasicBlockListParser::parseListing(basicBlockList, moduleBbs)) {
            std::cerr << "TbTrace: could not parse basic block list in file "
                      << basicBlockList.str() << std::endl;
            exit(-1);
        }

        m_basicBlocks[module] = moduleBbs;
        bbit = m_basicBlocks.find(module);
        assert(bbit != m_basicBlocks.end());
    }


    while((int)tbSize > 0) {
        //Fetch the right basic block
        BasicBlock bbToFetch(relPc, 1);
        TbTraceBbs::iterator mybb = (*bbit).second.find(bbToFetch);
        if (mybb == (*bbit).second.end()) {
            m_output << "Could not find basic block 0x" << std::hex << relPc << " in the list" << std::endl;
            return;
        }

        //Found the basic block, compute the range of program counters
        //whose disassembly we are going to print.
        const BasicBlock &bb = *mybb;
        uint64_t asmStartPc = relPc;
        uint64_t asmEndPc;

        if (relPc + tbSize >= bb.start + bb.size) {
            asmEndPc = bb.start + bb.size;
        }else {
            asmEndPc = relPc + tbSize;
        }

        assert(relPc >= bb.start && relPc < bb.start + bb.size);


        //Grab the vector of strings for the program counter
        ModuleDisassembly::iterator modIt = (*it).second.find(asmStartPc);
        if (modIt == (*it).second.end()) {
            return;
        }

        //Fetch the range of program counters from the disassembly file
        ModuleDisassembly::iterator modItEnd = (*it).second.lower_bound(asmEndPc);

        for (ModuleDisassembly::iterator it = modIt; it != modItEnd; ++it) {
            //Print the vector we've got
            for(DisassemblyEntry::const_iterator asmIt = (*it).second.begin();
                asmIt != (*it).second.end(); ++asmIt) {
                m_output << "\033[1;33m" << *asmIt << "\033[0m" << std::endl;
            }
        }

        tbSize -= asmEndPc - asmStartPc;
        relPc += asmEndPc - asmStartPc;

        if ((int)tbSize < 0) {
            assert(false && "Cannot be negative");
        }
    }

}