DBG+BRIDGE+GUI: warn when trying to render a graph with more than 5000 nodes
(closes #1321)
This commit is contained in:
parent
c1c7910d8d
commit
652c61f7f7
|
@ -1552,9 +1552,9 @@ BRIDGE_IMPEXP void GuiFocusView(int hWindow)
|
||||||
_gui_sendmessage(GUI_FOCUS_VIEW, (void*)hWindow, nullptr);
|
_gui_sendmessage(GUI_FOCUS_VIEW, (void*)hWindow, nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
BRIDGE_IMPEXP void GuiLoadGraph(BridgeCFGraphList* graph, duint addr)
|
BRIDGE_IMPEXP bool GuiLoadGraph(BridgeCFGraphList* graph, duint addr)
|
||||||
{
|
{
|
||||||
_gui_sendmessage(GUI_LOAD_GRAPH, graph, (void*)addr);
|
return !!_gui_sendmessage(GUI_LOAD_GRAPH, graph, (void*)addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
BRIDGE_IMPEXP duint GuiGraphAt(duint addr)
|
BRIDGE_IMPEXP duint GuiGraphAt(duint addr)
|
||||||
|
|
|
@ -1266,7 +1266,7 @@ BRIDGE_IMPEXP void GuiFocusView(int hWindow);
|
||||||
BRIDGE_IMPEXP bool GuiIsUpdateDisabled();
|
BRIDGE_IMPEXP bool GuiIsUpdateDisabled();
|
||||||
BRIDGE_IMPEXP void GuiUpdateEnable(bool updateNow);
|
BRIDGE_IMPEXP void GuiUpdateEnable(bool updateNow);
|
||||||
BRIDGE_IMPEXP void GuiUpdateDisable();
|
BRIDGE_IMPEXP void GuiUpdateDisable();
|
||||||
BRIDGE_IMPEXP void GuiLoadGraph(BridgeCFGraphList* graph, duint addr);
|
BRIDGE_IMPEXP bool GuiLoadGraph(BridgeCFGraphList* graph, duint addr);
|
||||||
BRIDGE_IMPEXP duint GuiGraphAt(duint addr);
|
BRIDGE_IMPEXP duint GuiGraphAt(duint addr);
|
||||||
BRIDGE_IMPEXP void GuiUpdateGraphView();
|
BRIDGE_IMPEXP void GuiUpdateGraphView();
|
||||||
BRIDGE_IMPEXP void GuiDisableLog();
|
BRIDGE_IMPEXP void GuiDisableLog();
|
||||||
|
|
|
@ -126,7 +126,8 @@ bool cbInstrGraph(int argc, char* argv[])
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
auto graphList = graph->ToGraphList();
|
auto graphList = graph->ToGraphList();
|
||||||
GuiLoadGraph(&graphList, sel);
|
if(!GuiLoadGraph(&graphList, sel))
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
GuiUpdateAllViews();
|
GuiUpdateAllViews();
|
||||||
GuiFocusView(GUI_GRAPH);
|
GuiFocusView(GUI_GRAPH);
|
||||||
|
|
|
@ -684,7 +684,7 @@ void* Bridge::processMessage(GUIMSG type, void* param1, void* param2)
|
||||||
{
|
{
|
||||||
BridgeResult result;
|
BridgeResult result;
|
||||||
emit loadGraph((BridgeCFGraphList*)param1, duint(param2));
|
emit loadGraph((BridgeCFGraphList*)param1, duint(param2));
|
||||||
result.Wait();
|
return (void*)result.Wait();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
@ -1904,8 +1904,8 @@ void CPUDisassembly::setEncodeTypeSlot()
|
||||||
|
|
||||||
void CPUDisassembly::graphSlot()
|
void CPUDisassembly::graphSlot()
|
||||||
{
|
{
|
||||||
DbgCmdExecDirect(QString("graph %1").arg(ToPtrString(rvaToVa(getSelectionStart()))).toUtf8().constData());
|
if(DbgCmdExecDirect(QString("graph %1").arg(ToPtrString(rvaToVa(getSelectionStart()))).toUtf8().constData()))
|
||||||
emit displayGraphWidget();
|
emit displayGraphWidget();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CPUDisassembly::togglePreviewSlot()
|
void CPUDisassembly::togglePreviewSlot()
|
||||||
|
|
|
@ -1617,12 +1617,24 @@ void DisassemblerGraphView::loadCurrentGraph()
|
||||||
|
|
||||||
void DisassemblerGraphView::loadGraphSlot(BridgeCFGraphList* graphList, duint addr)
|
void DisassemblerGraphView::loadGraphSlot(BridgeCFGraphList* graphList, duint addr)
|
||||||
{
|
{
|
||||||
|
auto nodeCount = graphList->nodes.count;
|
||||||
|
if(nodeCount > 5000) //TODO: add configuration
|
||||||
|
{
|
||||||
|
auto title = tr("Large number of nodes");
|
||||||
|
auto message = tr("The graph you are trying to render has a large number of nodes (%1). This can cause x64dbg to hang or crash. It is recommended to save your data before you continue.\n\nDo you want to continue rendering this graph?").arg(nodeCount);
|
||||||
|
if(QMessageBox::question(this, title, message, QMessageBox::Yes, QMessageBox::No | QMessageBox::Default) == QMessageBox::No)
|
||||||
|
{
|
||||||
|
Bridge::getBridge()->setResult(0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
currentGraph = BridgeCFGraph(graphList, true);
|
currentGraph = BridgeCFGraph(graphList, true);
|
||||||
currentBlockMap.clear();
|
currentBlockMap.clear();
|
||||||
this->cur_instr = addr ? addr : this->function;
|
this->cur_instr = addr ? addr : this->function;
|
||||||
this->forceCenter = true;
|
this->forceCenter = true;
|
||||||
loadCurrentGraph();
|
loadCurrentGraph();
|
||||||
Bridge::getBridge()->setResult();
|
Bridge::getBridge()->setResult(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DisassemblerGraphView::graphAtSlot(duint addr)
|
void DisassemblerGraphView::graphAtSlot(duint addr)
|
||||||
|
|
Loading…
Reference in New Issue