代码拉取完成,页面将自动刷新
// SPDX-FileCopyrightText: 2023 - 2025 UnionTech Software Technology Co., Ltd.
//
// SPDX-License-Identifier: GPL-3.0-or-later
#include "debugmanager.h"
#include "dap/dapdebugger.h"
#include "debuggersignals.h"
#include "debuggerglobals.h"
#include "interface/menumanager.h"
#include "interface/attachinfodialog.h"
#include "reversedebug/reversedebugger.h"
#include "services/debugger/debuggerservice.h"
#include "services/window/windowservice.h"
#include "services/language/languageservice.h"
#include "services/editor/editorservice.h"
#include "common/util/custompaths.h"
#include "common/project/projectinfo.h"
using namespace DEBUG_NAMESPACE;
using namespace dpfservice;
DebugManager::DebugManager(QObject *parent)
: QObject(parent)
{
connect(debuggerSignals, &DebuggerSignals::receivedEvent, this, &DebugManager::handleEvents);
}
bool DebugManager::initialize(dpfservice::WindowService *windowService,
dpfservice::DebuggerService *debuggerService)
{
currentDebugger = new DAPDebugger(this);
debuggers.insert("dap", currentDebugger);
runner = new Runner(this);
menuManager.reset(new MenuManager());
menuManager->initialize(windowService);
auto reverseDbg = new ReverseDebugger(this);
connect(reverseDbg, &ReverseDebugger::startReplay, this, &DebugManager::rrReplay);
connect(currentDebugger, &AbstractDebugger::runStateChanged, this, &DebugManager::handleRunStateChanged);
// bind debug services
using namespace std::placeholders;
if (!debuggerService->runCoredump) {
debuggerService->runCoredump = std::bind(&DebugManager::runCoredump, this, _1, _2, _3);
}
if (!debuggerService->registerDebugger) {
debuggerService->registerDebugger = std::bind(&DebugManager::registerDebugger, this, _1, _2);
}
if (!debuggerService->getDebugState) {
debuggerService->getDebugState = std::bind(&DebugManager::getRunState, this);
}
return true;
}
DWidget *DebugManager::getStackPane() const
{
return currentDebugger->getStackPane();
}
DWidget *DebugManager::getLocalsPane() const
{
return currentDebugger->getLocalsPane();
}
DWidget *DebugManager::getBreakpointPane() const
{
return currentDebugger->getBreakpointPane();
}
DWidget *DebugManager::getDebugMainPane() const
{
return currentDebugger->getDebugMainPane();
}
AbstractDebugger::RunState DebugManager::getRunState() const
{
return currentDebugger->getRunState();
}
void DebugManager::registerDebugger(const QString &kit, AbstractDebugger *debugger)
{
auto iterator = debuggers.find(kit);
if (iterator == debuggers.end()) {
debuggers.insert(kit, debugger);
}
}
void DebugManager::run()
{
// save all modified files before debugging.
dpfGetService(EditorService)->saveAll();
AbstractDebugger::RunState state = currentDebugger->getRunState();
switch (state) {
case AbstractDebugger::RunState::kNoRun:
case AbstractDebugger::RunState::kPreparing:
{
LanguageService *service = dpfGetService(LanguageService);
if (service) {
auto generator = service->create<LanguageGenerator>(activeProjectKitName);
if (generator) {
QString debugger = generator->debugger();
if (debuggers.contains(debugger) && currentDebugger != debuggers[debugger]) {
disconnect(currentDebugger, &AbstractDebugger::runStateChanged, this, &DebugManager::handleRunStateChanged);
currentDebugger = debuggers[debugger];
connect(currentDebugger, &AbstractDebugger::runStateChanged, this, &DebugManager::handleRunStateChanged);
}
} else {
auto windowService = dpfGetService(WindowService);
windowService->notify(1, tr("Warning"), tr("The project does not have an associated build kit. Please reopen the project and select the corresponding build tool."), {});
}
}
AsynInvoke(currentDebugger->startDebug());
break;
}
case AbstractDebugger::RunState::kRunning:
// TODO(mozart):stop debug
break;
case AbstractDebugger::RunState::kStopped:
continueDebug();
break;
default:
;// do nothing.
}
}
void DebugManager::remoteDebug(RemoteInfo info)
{
if (!currentDebugger) {
LanguageService *service = dpfGetService(LanguageService);
if (service) {
auto generator = service->create<LanguageGenerator>(activeProjectKitName);
if (generator) {
QString debugger = generator->debugger();
if (debuggers.contains(debugger) && currentDebugger != debuggers[debugger]) {
disconnect(currentDebugger, &AbstractDebugger::runStateChanged, this, &DebugManager::handleRunStateChanged);
currentDebugger = debuggers[debugger];
connect(currentDebugger, &AbstractDebugger::runStateChanged, this, &DebugManager::handleRunStateChanged);
}
}
}
}
AsynInvokeWithParam(currentDebugger->startDebugRemote, info);
}
void DebugManager::attachDebug()
{
AttachInfoDialog dialog;
connect(&dialog, &AttachInfoDialog::attachToProcessId, this, [=](const QString &processId){
AsynInvokeWithParam(currentDebugger->attachDebug, processId);
});
dialog.exec();
}
void DebugManager::detachDebug()
{
AsynInvoke(currentDebugger->detachDebug());
}
void DebugManager::interruptDebug()
{
AsynInvoke(currentDebugger->interruptDebug());
}
void DebugManager::continueDebug()
{
AsynInvoke(currentDebugger->continueDebug());
}
void DebugManager::reverseContinue()
{
AsynInvoke(currentDebugger->reverseContinue());
}
void DebugManager::abortDebug()
{
AsynInvoke(currentDebugger->abortDebug());
}
void DebugManager::restartDebug()
{
// save all modified files before debugging.
dpfGetService(EditorService)->saveAll();
AsynInvoke(currentDebugger->restartDebug());
}
void DebugManager::stepOver()
{
AsynInvoke(currentDebugger->stepOver());
}
void DebugManager::stepIn()
{
AsynInvoke(currentDebugger->stepIn());
}
void DebugManager::stepOut()
{
AsynInvoke(currentDebugger->stepOut());
}
void DebugManager::stepBack()
{
AsynInvoke(currentDebugger->stepBack());
}
bool DebugManager::supportStepBack()
{
return currentDebugger->supportStepBack();
}
void DebugManager::handleRunStateChanged(AbstractDebugger::RunState state)
{
menuManager->handleRunStateChanged(state);
if(state == AbstractDebugger::kStart || state == AbstractDebugger::kRunning || state == AbstractDebugger::kCustomRunning) {
emit debugStarted();
} else if (state == AbstractDebugger::kNoRun) {
emit debugStopped();
}
}
void DebugManager::handleEvents(const dpf::Event &event)
{
QString topic = event.topic();
QString data = event.data().toString();
if (event.data() == debugger.prepareDebugProgress.name) {
// TODO(logan)
} else if (event.data() == project.activatedProject.name) {
auto projectInfo = qvariant_cast<ProjectInfo>(event.property(project.activatedProject.pKeys[0]));
activeProjectKitName = projectInfo.kitName();
} else if (event.data() == project.createdProject.name) {
auto projectInfo = qvariant_cast<ProjectInfo>(event.property(project.createdProject.pKeys[0]));
activeProjectKitName = projectInfo.kitName();
} else if (event.data() == project.deletedProject.name) {
activeProjectKitName.clear();
} else if (event.data() == editor.switchedFile.name) {
// TODO(logan)
} else if (event.data() == editor.fileOpened.name) {
// TODO(logan)
} else if (event.data() == editor.fileClosed.name) {
// TODO(logan)
}
}
bool DebugManager::runCoredump(const QString &target, const QString &core, const QString &kit)
{
// return QtConcurrent::run(currentDebugger, &AbstractDebugger::runCoredump, target, core, kit);
auto future = QtConcurrent::run([&, this](){
currentDebugger->runCoredump(target, core, kit);
});
return future.isRunning();
}
void DebugManager::rrReplay(const QString &target)
{
auto dapdbgger = qobject_cast<DAPDebugger *>(debuggers["dap"]);
dapdbgger->startRerverseDebug(target);
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。