#include "gdbprocess.h" GDBProcess::GDBProcess(QObject *parent) : QObject(parent) { process=new QProcess(); } GDBProcess::~GDBProcess() { delete process; } //运行一条GDB命令并获取输出字符串 QString GDBProcess::runCmd(const QString &cmd) { process->readAllStandardOutput(); process->write(cmd.toStdString().c_str()); QString res=""; do{ process->waitForReadyRead(1); res+=process->readAllStandardOutput(); }while(!res.endsWith("(gdb) ")); return res; } //启动GDB进程 void GDBProcess::start() { process->setProgram(QCoreApplication::applicationDirPath()+"/gdb/gdb.exe");//设置程序路径 process->setWorkingDirectory(QCoreApplication::applicationDirPath()+"/gdb");//设置工作路径 process->setNativeArguments("-q");//设置gdb在安静模式下打开 process->start();//QProcess::Unbuffered|QProcess::ReadWrite); runCmd("set confirm off\r\n");//设置不要手动确认 runCmd("set print pretty on\r\n");//设置结构体规范打印 } //停止GDB进程 void GDBProcess::stop() { if(process->state()!=QProcess::NotRunning) process->kill(); } //命令GDB连接到远程目标,参数为"地址:端口号" void GDBProcess::connectToRemote(const QString &addr) { runCmd("target remote "+addr+"\r\n"); runCmd("monitor resume\r\n");//恢复目标程序运行 } //命令GDB从远处目标断开 void GDBProcess::disconnectFromRemote() { runCmd("disconnect\r\n"); } //设定临时符号文件名,文件位于GDB程序目录下 void GDBProcess::setTempSymbolFileName(const QString &name) { tempSymbolFileName=name; } //加载符号文件,将指定文件复制到临时文件中,并加载到GDB中 void GDBProcess::loadSymbolFile(const QString &path) { unloadSymbolFile();//确保卸载当前的临时文件 QString tempPath=QCoreApplication::applicationDirPath()+"/gdb/"+tempSymbolFileName;//拼接临时文件路径 QFile::copy(path,tempPath);//将所选符号文件复制为临时文件 runCmd("symbol-file "+tempSymbolFileName+"\r\n");//设置符号文件 } //卸载符号文件 void GDBProcess::unloadSymbolFile() { runCmd("symbol-file\r\n");//取消符号文件,解除文件占用 QString tempPath=QCoreApplication::applicationDirPath()+"/gdb/"+tempSymbolFileName;//拼接临时文件路径 QFile::remove(tempPath);//删除复制过来的临时文件 } //设置display列表 void GDBProcess::setDisplayList(QStringList &list) { runCmd("delete display\r\n");//删除之前发送的变量列表 foreach(QString name,list)//向display表中依次添加变量名 runCmd("display "+name+"\r\n"); } //截取display指令所返回字符串中指定变量名的变量值 QString GDBProcess::captureValueFromDisplay(const QString &rawDisplay, const QString &name) { QString regName=""; for(int i=0;i GDBProcess::getUintArrayFromDisplay(const QString &rawDisplay) { QRegExp rx("\\{(.*)\\}"); rx.indexIn(rawDisplay); QString raw=rx.cap(1); raw=raw.replace("\r\n ",""); QStringList rawList=raw.split(", "); QList numList; for(int index=0;index"); repeatRx.indexIn(rawList[index]); int num=repeatRx.cap(1).toUInt(); int times=repeatRx.cap(2).toUInt(); for(int i=0;i