fix crashes in trace viewer when pressing hotkeys
This commit is contained in:
		
							parent
							
								
									4cf0844255
								
							
						
					
					
						commit
						062dee26f6
					
				| 
						 | 
					@ -478,6 +478,7 @@ void TraceBrowser::setupRightClickContextMenu()
 | 
				
			||||||
            return (duint)0;
 | 
					            return (duint)0;
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
    mBreakpointMenu->build(mMenuBuilder);
 | 
					    mBreakpointMenu->build(mMenuBuilder);
 | 
				
			||||||
 | 
					    mMenuBuilder->addAction(makeShortcutAction(DIcon("label.png"), tr("Label Current Address"), SLOT(setLabelSlot()), "ActionSetLabel"), isDebugging);
 | 
				
			||||||
    mMenuBuilder->addAction(makeShortcutAction(DIcon("comment.png"), tr("&Comment"), SLOT(setCommentSlot()), "ActionSetComment"), isDebugging);
 | 
					    mMenuBuilder->addAction(makeShortcutAction(DIcon("comment.png"), tr("&Comment"), SLOT(setCommentSlot()), "ActionSetComment"), isDebugging);
 | 
				
			||||||
    mMenuBuilder->addAction(makeShortcutAction(DIcon("highlight.png"), tr("&Highlighting mode"), SLOT(enableHighlightingModeSlot()), "ActionHighlightingMode"), isValid);
 | 
					    mMenuBuilder->addAction(makeShortcutAction(DIcon("highlight.png"), tr("&Highlighting mode"), SLOT(enableHighlightingModeSlot()), "ActionHighlightingMode"), isValid);
 | 
				
			||||||
    MenuBuilder* gotoMenu = new MenuBuilder(this, isValid);
 | 
					    MenuBuilder* gotoMenu = new MenuBuilder(this, isValid);
 | 
				
			||||||
| 
						 | 
					@ -854,7 +855,7 @@ void TraceBrowser::updateColors()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void TraceBrowser::openFileSlot()
 | 
					void TraceBrowser::openFileSlot()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    BrowseDialog browse(this, tr("Open run trace file"), tr("Open trace file"), tr("Run trace files (*.%1);;All files (*.*)").arg(ArchValue("trace32", "trace64")), QApplication::applicationDirPath(), false);
 | 
					    BrowseDialog browse(this, tr("Open run trace file"), tr("Open trace file"), tr("Run trace files (*.%1);;All files (*.*)").arg(ArchValue("trace32", "trace64")), QApplication::applicationDirPath() + QDir::separator() + "db", false);
 | 
				
			||||||
    if(browse.exec() != QDialog::Accepted)
 | 
					    if(browse.exec() != QDialog::Accepted)
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
    emit openSlot(browse.path);
 | 
					    emit openSlot(browse.path);
 | 
				
			||||||
| 
						 | 
					@ -936,6 +937,8 @@ void TraceBrowser::parseFinishedSlot()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void TraceBrowser::gotoSlot()
 | 
					void TraceBrowser::gotoSlot()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					    if(mTraceFile == nullptr || mTraceFile->Progress() < 100)
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
    GotoDialog gotoDlg(this, false, true); // Problem: Cannot use when not debugging
 | 
					    GotoDialog gotoDlg(this, false, true); // Problem: Cannot use when not debugging
 | 
				
			||||||
    if(gotoDlg.exec() == QDialog::Accepted)
 | 
					    if(gotoDlg.exec() == QDialog::Accepted)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
| 
						 | 
					@ -1090,6 +1093,9 @@ void TraceBrowser::pushSelectionInto(bool copyBytes, QTextStream & stream, QText
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void TraceBrowser::copySelectionSlot(bool copyBytes)
 | 
					void TraceBrowser::copySelectionSlot(bool copyBytes)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					    if(mTraceFile == nullptr || mTraceFile->Progress() < 100)
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    QString selectionString = "";
 | 
					    QString selectionString = "";
 | 
				
			||||||
    QString selectionHtmlString = "";
 | 
					    QString selectionHtmlString = "";
 | 
				
			||||||
    QTextStream stream(&selectionString);
 | 
					    QTextStream stream(&selectionString);
 | 
				
			||||||
| 
						 | 
					@ -1100,6 +1106,9 @@ void TraceBrowser::copySelectionSlot(bool copyBytes)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void TraceBrowser::copySelectionToFileSlot(bool copyBytes)
 | 
					void TraceBrowser::copySelectionToFileSlot(bool copyBytes)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					    if(mTraceFile == nullptr || mTraceFile->Progress() < 100)
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    QString fileName = QFileDialog::getSaveFileName(this, tr("Open File"), "", tr("Text Files (*.txt)"));
 | 
					    QString fileName = QFileDialog::getSaveFileName(this, tr("Open File"), "", tr("Text Files (*.txt)"));
 | 
				
			||||||
    if(fileName != "")
 | 
					    if(fileName != "")
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
| 
						 | 
					@ -1138,6 +1147,9 @@ void TraceBrowser::copySelectionToFileNoBytesSlot()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void TraceBrowser::copyDisassemblySlot()
 | 
					void TraceBrowser::copyDisassemblySlot()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					    if(mTraceFile == nullptr || mTraceFile->Progress() < 100)
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    QString clipboardHtml = QString("<div style=\"font-family: %1; font-size: %2px\">").arg(font().family()).arg(getRowHeight());
 | 
					    QString clipboardHtml = QString("<div style=\"font-family: %1; font-size: %2px\">").arg(font().family()).arg(getRowHeight());
 | 
				
			||||||
    QString clipboard = "";
 | 
					    QString clipboard = "";
 | 
				
			||||||
    for(auto i = getSelectionStart(); i <= getSelectionEnd(); i++)
 | 
					    for(auto i = getSelectionStart(); i <= getSelectionEnd(); i++)
 | 
				
			||||||
| 
						 | 
					@ -1162,6 +1174,9 @@ void TraceBrowser::copyDisassemblySlot()
 | 
				
			||||||
void TraceBrowser::copyRvaSlot()
 | 
					void TraceBrowser::copyRvaSlot()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    QString text;
 | 
					    QString text;
 | 
				
			||||||
 | 
					    if(mTraceFile == nullptr || mTraceFile->Progress() < 100)
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for(unsigned long long i = getSelectionStart(); i <= getSelectionEnd(); i++)
 | 
					    for(unsigned long long i = getSelectionStart(); i <= getSelectionEnd(); i++)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        duint cip = mTraceFile->Registers(i).regcontext.cip;
 | 
					        duint cip = mTraceFile->Registers(i).regcontext.cip;
 | 
				
			||||||
| 
						 | 
					@ -1184,6 +1199,9 @@ void TraceBrowser::copyRvaSlot()
 | 
				
			||||||
void TraceBrowser::copyFileOffsetSlot()
 | 
					void TraceBrowser::copyFileOffsetSlot()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    QString text;
 | 
					    QString text;
 | 
				
			||||||
 | 
					    if(mTraceFile == nullptr || mTraceFile->Progress() < 100)
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for(unsigned long long i = getSelectionStart(); i <= getSelectionEnd(); i++)
 | 
					    for(unsigned long long i = getSelectionStart(); i <= getSelectionEnd(); i++)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        duint cip = mTraceFile->Registers(i).regcontext.cip;
 | 
					        duint cip = mTraceFile->Registers(i).regcontext.cip;
 | 
				
			||||||
| 
						 | 
					@ -1205,7 +1223,7 @@ void TraceBrowser::copyFileOffsetSlot()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void TraceBrowser::setCommentSlot()
 | 
					void TraceBrowser::setCommentSlot()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    if(!DbgIsDebugging())
 | 
					    if(!DbgIsDebugging() || mTraceFile == nullptr || mTraceFile->Progress() < 100)
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
    duint wVA = mTraceFile->Registers(getInitialSelection()).regcontext.cip;
 | 
					    duint wVA = mTraceFile->Registers(getInitialSelection()).regcontext.cip;
 | 
				
			||||||
    LineEditDialog mLineEdit(this);
 | 
					    LineEditDialog mLineEdit(this);
 | 
				
			||||||
| 
						 | 
					@ -1240,6 +1258,39 @@ void TraceBrowser::setCommentSlot()
 | 
				
			||||||
    GuiUpdateAllViews();
 | 
					    GuiUpdateAllViews();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void TraceBrowser::setLabelSlot()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if(!DbgIsDebugging() || mTraceFile == nullptr || mTraceFile->Progress() < 100)
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					    duint wVA = mTraceFile->Registers(getInitialSelection()).regcontext.cip;
 | 
				
			||||||
 | 
					    LineEditDialog mLineEdit(this);
 | 
				
			||||||
 | 
					    mLineEdit.setTextMaxLength(MAX_LABEL_SIZE - 2);
 | 
				
			||||||
 | 
					    QString addr_text = ToPtrString(wVA);
 | 
				
			||||||
 | 
					    char label_text[MAX_COMMENT_SIZE] = "";
 | 
				
			||||||
 | 
					    if(DbgGetLabelAt((duint)wVA, SEG_DEFAULT, label_text))
 | 
				
			||||||
 | 
					        mLineEdit.setText(QString(label_text));
 | 
				
			||||||
 | 
					    mLineEdit.setWindowTitle(tr("Add label at ") + addr_text);
 | 
				
			||||||
 | 
					restart:
 | 
				
			||||||
 | 
					    if(mLineEdit.exec() != QDialog::Accepted)
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					    QByteArray utf8data = mLineEdit.editText.toUtf8();
 | 
				
			||||||
 | 
					    if(!utf8data.isEmpty() && DbgIsValidExpression(utf8data.constData()) && DbgValFromString(utf8data.constData()) != wVA)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        QMessageBox msg(QMessageBox::Warning, tr("The label may be in use"),
 | 
				
			||||||
 | 
					                        tr("The label \"%1\" may be an existing label or a valid expression. Using such label might have undesired effects. Do you still want to continue?").arg(mLineEdit.editText),
 | 
				
			||||||
 | 
					                        QMessageBox::Yes | QMessageBox::No, this);
 | 
				
			||||||
 | 
					        msg.setWindowIcon(DIcon("compile-warning.png"));
 | 
				
			||||||
 | 
					        msg.setParent(this, Qt::Dialog);
 | 
				
			||||||
 | 
					        msg.setWindowFlags(msg.windowFlags() & (~Qt::WindowContextHelpButtonHint));
 | 
				
			||||||
 | 
					        if(msg.exec() == QMessageBox::No)
 | 
				
			||||||
 | 
					            goto restart;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if(!DbgSetLabelAt(wVA, utf8data.constData()))
 | 
				
			||||||
 | 
					        SimpleErrorBox(this, tr("Error!"), tr("DbgSetLabelAt failed!"));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    GuiUpdateAllViews();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void TraceBrowser::enableHighlightingModeSlot()
 | 
					void TraceBrowser::enableHighlightingModeSlot()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    if(mHighlightingMode)
 | 
					    if(mHighlightingMode)
 | 
				
			||||||
| 
						 | 
					@ -1251,6 +1302,9 @@ void TraceBrowser::enableHighlightingModeSlot()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void TraceBrowser::followDisassemblySlot()
 | 
					void TraceBrowser::followDisassemblySlot()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					    if(mTraceFile == nullptr || mTraceFile->Progress() < 100)
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    DbgCmdExec(QString("dis ").append(ToPtrString(mTraceFile->Registers(getInitialSelection()).regcontext.cip)).toUtf8().constData());
 | 
					    DbgCmdExec(QString("dis ").append(ToPtrString(mTraceFile->Registers(getInitialSelection()).regcontext.cip)).toUtf8().constData());
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -115,6 +115,7 @@ public slots:
 | 
				
			||||||
    void gotoNextSlot();
 | 
					    void gotoNextSlot();
 | 
				
			||||||
    void followDisassemblySlot();
 | 
					    void followDisassemblySlot();
 | 
				
			||||||
    void enableHighlightingModeSlot();
 | 
					    void enableHighlightingModeSlot();
 | 
				
			||||||
 | 
					    void setLabelSlot();
 | 
				
			||||||
    void setCommentSlot();
 | 
					    void setCommentSlot();
 | 
				
			||||||
    void copyDisassemblySlot();
 | 
					    void copyDisassemblySlot();
 | 
				
			||||||
    void copyCipSlot();
 | 
					    void copyCipSlot();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue