1
0
Fork 0

opcode grouping in trace view

This commit is contained in:
torusrxxx 2018-11-13 23:32:15 +08:00 committed by Duncan Ogilvie
parent 24e71e86ee
commit e5c838c276
2 changed files with 54 additions and 36 deletions

View File

@ -103,6 +103,46 @@ QString TraceBrowser::getAddrText(dsint cur_addr, char label[MAX_LABEL_SIZE], bo
return addrText;
}
//The following function is modified from "RichTextPainter::List Disassembly::getRichBytes(const Instruction_t & instr) const"
//with patch and code folding features removed.
RichTextPainter::List TraceBrowser::getRichBytes(const Instruction_t & instr) const
{
RichTextPainter::List richBytes;
std::vector<std::pair<size_t, bool>> realBytes;
formatOpcodeString(instr, richBytes, realBytes);
const duint cur_addr = instr.rva;
if(!richBytes.empty() && richBytes.back().text.endsWith(' '))
richBytes.back().text.chop(1); //remove trailing space if exists
if(DbgIsDebugging())
{
for(size_t i = 0; i < richBytes.size(); i++)
{
auto byteIdx = realBytes[i].first;
auto isReal = realBytes[i].second;
RichTextPainter::CustomRichText_t & curByte = richBytes.at(i);
DBGRELOCATIONINFO relocInfo;
curByte.highlightColor = mDisassemblyRelocationUnderlineColor;
if(DbgFunctions()->ModRelocationAtAddr(cur_addr + byteIdx, &relocInfo))
{
bool prevInSameReloc = relocInfo.rva < cur_addr + byteIdx - DbgFunctions()->ModBaseFromAddr(cur_addr + byteIdx);
curByte.highlight = isReal;
curByte.highlightConnectPrev = i > 0 && prevInSameReloc;
}
else
{
curByte.highlight = false;
curByte.highlightConnectPrev = false;
}
curByte.textColor = mBytesColor;
curByte.textBackground = mBytesBackgroundColor;
}
}
return richBytes;
}
QString TraceBrowser::paintContent(QPainter* painter, dsint rowBase, int rowOffset, int col, int x, int y, int w, int h)
{
if(!mTraceFile || mTraceFile->Progress() != 100)
@ -299,33 +339,11 @@ NotDebuggingLabel:
case 2: //opcode
{
RichTextPainter::List richBytes;
RichTextPainter::CustomRichText_t curByte;
RichTextPainter::CustomRichText_t space;
unsigned char opcodes[16];
int opcodeSize = 0;
mTraceFile->OpCode(index, opcodes, &opcodeSize);
space.text = " ";
space.flags = RichTextPainter::FlagNone;
space.highlightWidth = 1;
space.highlightConnectPrev = true;
curByte.flags = RichTextPainter::FlagAll;
curByte.highlightWidth = 1;
space.highlight = false;
curByte.highlight = false;
for(int i = 0; i < opcodeSize; i++)
{
if(i)
richBytes.push_back(space);
curByte.text = ToByteString(opcodes[i]);
curByte.textColor = mBytesColor;
curByte.textBackground = mBytesBackgroundColor;
richBytes.push_back(curByte);
}
RichTextPainter::paintRichText(painter, x, y, getColumnWidth(col), getRowHeight(), 4, richBytes, mFontMetrics);
Instruction_t inst = mDisasm->DisassembleAt(opcodes, opcodeSize, 0, mTraceFile->Registers(index).regcontext.cip, false);
RichTextPainter::paintRichText(painter, x, y, getColumnWidth(col), getRowHeight(), 4, getRichBytes(inst), mFontMetrics);
return "";
}
@ -841,7 +859,7 @@ void TraceBrowser::makeVisible(duint index)
setTableOffset(index - getViewableRowsCount() + 2);
}
QString TraceBrowser::getIndexText(duint index)
QString TraceBrowser::getIndexText(duint index) const
{
QString indexString;
indexString = QString::number(index, 16).toUpper();
@ -888,6 +906,7 @@ void TraceBrowser::updateColors()
mAutoCommentBackgroundColor = ConfigColor("DisassemblyAutoCommentBackgroundColor");
mCommentColor = ConfigColor("DisassemblyCommentColor");
mCommentBackgroundColor = ConfigColor("DisassemblyCommentBackgroundColor");
mDisassemblyRelocationUnderlineColor = ConfigColor("DisassemblyRelocationUnderlineColor");
}
void TraceBrowser::openFileSlot()
@ -1071,15 +1090,9 @@ void TraceBrowser::pushSelectionInto(bool copyBytes, QTextStream & stream, QText
inst = mDisasm->DisassembleAt(opcode, opcodeSize, cur_addr, 0);
QString address = getAddrText(cur_addr, 0, addressLen > sizeof(duint) * 2 + 1);
QString bytes;
QString bytesHTML;
if(copyBytes)
{
for(int j = 0; j < opcodeSize; j++)
{
if(j)
bytes += " ";
bytes += ToByteString((unsigned char)(opcode[j]));
}
}
RichTextPainter::htmlRichText(getRichBytes(inst), bytesHTML, bytes);
QString disassembly;
QString htmlDisassembly;
if(htmlStream)
@ -1101,13 +1114,16 @@ void TraceBrowser::pushSelectionInto(bool copyBytes, QTextStream & stream, QText
bool autocomment;
if(GetCommentFormat(cur_addr, comment, &autocomment))
fullComment = " " + comment;
stream << address.leftJustified(addressLen, QChar(' '), true);
stream << getIndexText(i) + " | " + address.leftJustified(addressLen, QChar(' '), true);
if(copyBytes)
stream << " | " + bytes.leftJustified(bytesLen, QChar(' '), true);
stream << " | " + disassembly.leftJustified(disassemblyLen, QChar(' '), true) + " |" + fullComment;
if(htmlStream)
{
*htmlStream << QString("<tr><td>%1</td><td>%2</td><td>").arg(address.toHtmlEscaped(), htmlDisassembly);
*htmlStream << QString("<tr><td>%1</td><td>%2</td><td>").arg(getIndexText(i), address.toHtmlEscaped());
if(copyBytes)
*htmlStream << QString("%1</td><td>").arg(bytesHTML);
*htmlStream << QString("%1</td><td>").arg(htmlDisassembly);
if(!comment.isEmpty())
{
if(autocomment)

View File

@ -32,7 +32,8 @@ private:
void setupRightClickContextMenu();
void makeVisible(duint index);
QString getAddrText(dsint cur_addr, char label[MAX_LABEL_SIZE], bool getLabel);
QString getIndexText(duint index);
QString getIndexText(duint index) const;
RichTextPainter::List getRichBytes(const Instruction_t & instr) const;
void pushSelectionInto(bool copyBytes, QTextStream & stream, QTextStream* htmlStream = nullptr);
void copySelectionSlot(bool copyBytes);
void copySelectionToFileSlot(bool copyBytes);
@ -98,6 +99,7 @@ private:
QColor mAutoCommentBackgroundColor;
QColor mCommentColor;
QColor mCommentBackgroundColor;
QColor mDisassemblyRelocationUnderlineColor;
signals:
void displayReferencesWidget();