void LldbEngine::activateFrame(int frameIndex) { if (state() != InferiorStopOk && state() != InferiorUnrunnable) return; StackHandler *handler = stackHandler(); const int n = handler->stackSize(); if (frameIndex == n) { DebuggerCommand cmd("reportStack"); cmd.arg("nativeMixed", isNativeMixedActive()); cmd.arg("stacklimit", n * 10 + 3); runCommand(cmd); return; } QTC_ASSERT(frameIndex < handler->stackSize(), return); handler->setCurrentIndex(frameIndex); gotoLocation(handler->currentFrame()); DebuggerCommand cmd("activateFrame"); cmd.arg("index", frameIndex); cmd.arg("thread", threadsHandler()->currentThread().raw()); cmd.arg("continuation", "updateLocals"); runCommand(cmd); }
void PdbEngine::activateFrame(int frameIndex) { resetLocation(); if (state() != InferiorStopOk && state() != InferiorUnrunnable) return; StackHandler *handler = stackHandler(); int oldIndex = handler->currentIndex(); //if (frameIndex == handler->stackSize()) { // reloadFullStack(); // return; //} QTC_ASSERT(frameIndex < handler->stackSize(), return); if (oldIndex != frameIndex) { // Assuming the command always succeeds this saves a roundtrip. // Otherwise the lines below would need to get triggered // after a response to this -stack-select-frame here. handler->setCurrentIndex(frameIndex); //postCommand("-stack-select-frame " + QByteArray::number(frameIndex), // CB(handleStackSelectFrame)); } gotoLocation(handler->currentFrame()); }
void PdbEngine::activateFrame(int frameIndex) { if (state() != InferiorStopOk && state() != InferiorUnrunnable) return; StackHandler *handler = stackHandler(); QTC_ASSERT(frameIndex < handler->stackSize(), return); handler->setCurrentIndex(frameIndex); gotoLocation(handler->currentFrame()); updateLocals(); }
void StackTreeView::contextMenuEvent(QContextMenuEvent *ev) { DebuggerEngine *engine = currentEngine(); StackHandler *handler = engine->stackHandler(); const QModelIndex index = indexAt(ev->pos()); const int row = index.row(); StackFrame frame; if (row >= 0 && row < handler->stackSize()) frame = handler->frameAt(row); const quint64 address = frame.address; QMenu menu; menu.addAction(action(ExpandStack)); QAction *actCopyContents = menu.addAction(tr("Copy Contents to Clipboard")); actCopyContents->setEnabled(model() != 0); QAction *actSaveTaskFile = menu.addAction(tr("Save as Task File...")); actSaveTaskFile->setEnabled(model() != 0); if (engine->hasCapability(CreateFullBacktraceCapability)) menu.addAction(action(CreateFullBacktrace)); QAction *additionalQmlStackAction = 0; if (engine->hasCapability(AdditionalQmlStackCapability)) additionalQmlStackAction = menu.addAction(tr("Load QML Stack")); QAction *actShowMemory = 0; if (engine->hasCapability(ShowMemoryCapability)) { actShowMemory = menu.addAction(QString()); if (address == 0) { actShowMemory->setText(tr("Open Memory Editor")); actShowMemory->setEnabled(false); } else { actShowMemory->setText(tr("Open Memory Editor at 0x%1").arg(address, 0, 16)); actShowMemory->setEnabled(engine->hasCapability(ShowMemoryCapability)); } } QAction *actShowDisassemblerAt = 0; QAction *actShowDisassemblerAtAddress = 0; QAction *actShowDisassemblerAtFunction = 0; if (engine->hasCapability(DisassemblerCapability)) { actShowDisassemblerAt = menu.addAction(QString()); actShowDisassemblerAtAddress = menu.addAction(tr("Open Disassembler at Address...")); actShowDisassemblerAtFunction = menu.addAction(tr("Disassemble Function...")); if (address == 0) { actShowDisassemblerAt->setText(tr("Open Disassembler")); actShowDisassemblerAt->setEnabled(false); } else { actShowDisassemblerAt->setText(tr("Open Disassembler at 0x%1").arg(address, 0, 16)); } } QAction *actLoadSymbols = 0; if (engine->hasCapability(ShowModuleSymbolsCapability)) actLoadSymbols = menu.addAction(tr("Try to Load Unknown Symbols")); if (engine->hasCapability(MemoryAddressCapability)) menu.addAction(action(UseAddressInStackView)); menu.addSeparator(); menu.addAction(action(UseToolTipsInStackView)); menu.addSeparator(); menu.addAction(action(SettingsDialog)); QAction *act = menu.exec(ev->globalPos()); if (!act) return; if (act == actCopyContents) { copyContentsToClipboard(); } else if (act == actShowMemory) { MemoryViewSetupData data; data.startAddress = address; data.title = tr("Memory at Frame #%1 (%2) 0x%3"). arg(row).arg(frame.function).arg(address, 0, 16); data.markup.push_back(MemoryMarkup(address, 1, QColor(Qt::blue).lighter(), tr("Frame #%1 (%2)").arg(row).arg(frame.function))); engine->openMemoryView(data); } else if (act == actShowDisassemblerAtAddress) { AddressDialog dialog; if (address) dialog.setAddress(address); if (dialog.exec() == QDialog::Accepted) currentEngine()->openDisassemblerView(Location(dialog.address())); } else if (act == actShowDisassemblerAtFunction) { const StackFrame frame = inputFunctionForDisassembly(); if (!frame.function.isEmpty()) currentEngine()->openDisassemblerView(Location(frame)); } else if (act == actShowDisassemblerAt) engine->openDisassemblerView(frame); else if (act == actLoadSymbols) engine->loadSymbolsForStack(); else if (act == actSaveTaskFile) saveTaskFile(this, handler); else if (act == additionalQmlStackAction) engine->loadAdditionalQmlStack(); }