void TbTrace::printDebugInfo(uint64_t pid, uint64_t pc, unsigned tbSize, bool printListing) { ModuleCacheState *mcs = static_cast<ModuleCacheState*>(m_events->getState(m_cache, &ModuleCacheState::factory)); const ModuleInstance *mi = mcs->getInstance(pid, pc); if (!mi) { return; } uint64_t relPc = pc - mi->LoadBase + mi->ImageBase; m_output << std::hex << "(" << mi->Name; if (relPc != pc) { m_output << " 0x" << relPc; } m_output << ")"; m_hasModuleInfo = true; std::string file = "?", function="?"; uint64_t line=0; if (m_library->getInfo(mi, pc, file, line, function)) { size_t pos = file.find_last_of('/'); if (pos != std::string::npos) { file = file.substr(pos+1); } m_output << " " << file << std::dec << ":" << line << " in " << function; m_hasDebugInfo = true; } if (PrintDisassembly && printListing) { m_output << std::endl; printDisassembly(mi->Name, relPc, tbSize); } }
void printInstruction(const INSTRUCTION * const i) { DISASSEMBLY d; FlushDecoded(&d); d.Address = (DWORD)(i->data); DWORD ilen = 0; Decode(&d, (char *)(i->data), &ilen); printf("[%2d] ", i->index); printDisassembly(d); printf("size:\t\t%d\n", i->totalSize); if (i->regReads) { printf("reads:\t\t"); for (BYTE reg = 0; reg < 8; reg++) { if (GET_READS(i, reg)) printf ("%s ", REG[2][reg]); } printf("\n"); } if (i->regWrites) { printf("writes:\t\t"); for (BYTE reg = 0; reg < 8; reg++) { if (GET_WRITES(i, reg)) printf ("%s ", REG[2][reg]); } printf("\n"); } if (i->freeRegs) { printf("free:\t\t"); for (BYTE reg = 0; reg < 8; reg++) { if (IS_FREE_REG(i,reg)) printf ("%s ", REG[2][reg]); } printf("\n"); } if (i->flags) printf("flags:\t\t0x%08X\n", i->flags); printf("offsets:\tOPCODE:%d, MODRM:%d, SIB:%d, DISP:%d:0x%08X, IMM:%d:0x%08X\n", OFFSET_TO_OPCODE(i), OFFSET_TO_MODRM(i), OFFSET_TO_SIB(i), OFFSET_TO_DISP(i), getDisp(i), OFFSET_TO_IMM(i), getImm(i)); if (i->jmp) printf("jumps to:\t%d\n", i->jmp->index); if (i->directVA) printf("refers to:\t0x%08X\n", *((DWORD *)(i->data + i->directVA))); }
void printIDisassembly(const INSTRUCTION * const iHead, const DWORD numInstr, const DWORD baseAddr) { DISASSEMBLY d; d.Address = baseAddr; const INSTRUCTION *i = iHead; DWORD offset = 0; for (int index = 0; index < numInstr && i; index++, i = i->next) { FlushDecoded(&d); offset = 0; Decode(&d, (char *)i->data, &offset); printf("[%3d]\t", i->index); printDisassembly(d); d.Address += d.OpcodeSize + d.PrefixSize; } }