Files
seer/src/seergdb.cpp
T

311 lines
9.8 KiB
C++
Raw Normal View History

2021-09-01 13:58:59 -05:00
#include "SeerMainWindow.h"
2021-10-03 10:34:50 -05:00
#include "SeerUtl.h"
2021-09-01 13:58:59 -05:00
#include <QtWidgets/QApplication>
#include <QtGui/QIcon>
2021-09-01 13:58:59 -05:00
#include <QtCore/QCommandLineParser>
#include <QtCore/QCommandLineOption>
#include <QtCore/QStringList>
#include <QtCore/QString>
2023-04-17 17:53:28 -05:00
#include <QtCore/QTextStream>
#include <QtCore/QObject>
#include <QtCore/QDebug>
2023-04-17 17:53:28 -05:00
#include <iostream>
static void seerhelp() {
QString text;
QString fileName(":/seer/resources/help/seergdb.hlp");
QFile file(fileName);
if (file.open(QIODevice::ReadOnly) == false) {
text = "seer: no help available.\n";
}else{
text = file.readAll();
}
file.close();
QTextStream(stdout) << text;
exit(0);
}
2021-09-01 13:58:59 -05:00
int main (int argc, char* argv[]) {
2022-03-26 08:43:24 -05:00
//
// Set up logging and message formats.
//
QLoggingCategory::setFilterRules("*.debug=false\n"
"*.info=false\n"
"*.warning=false\n"
"*.critical=true");
2022-03-26 08:33:45 -05:00
qSetMessagePattern("[%{time hh:mm:ss}][%{function}:%{line}][%{category}] %{message}");
2022-03-26 08:43:24 -05:00
//
// Create the app.
//
2021-09-01 13:58:59 -05:00
QApplication app(argc, argv);
2022-08-25 17:56:18 -05:00
QCoreApplication::setApplicationName("seergdb");
QCoreApplication::setOrganizationName("seergdb");
QCoreApplication::setApplicationVersion(Seer::version() + " - Ernie Pasveer (c)2021 - 2023");
2021-09-01 13:58:59 -05:00
//
// Parse arguments.
//
QCommandLineParser parser;
parser.setApplicationDescription("\nSeer - A gui frontend for gdb.");
parser.setOptionsAfterPositionalArgumentsMode(QCommandLineParser::ParseAsPositionalArguments); // Treat all arguments after the executable name as positional arguments too.
parser.setSingleDashWordOptionMode(QCommandLineParser::ParseAsLongOptions); // Treat all arguments long options.
parser.addVersionOption();
// Run or start options.
2023-04-17 17:53:28 -05:00
QCommandLineOption runOption(QStringList() << "r" << "run");
2021-09-01 13:58:59 -05:00
parser.addOption(runOption);
2023-04-17 17:53:28 -05:00
QCommandLineOption startOption(QStringList() << "s" << "start");
2021-09-01 13:58:59 -05:00
parser.addOption(startOption);
QCommandLineOption attachOption(QStringList() << "attach", "", "pid");
2021-09-01 13:58:59 -05:00
parser.addOption(attachOption);
QCommandLineOption connectOption(QStringList() << "connect", "", "medium");
2021-09-01 13:58:59 -05:00
parser.addOption(connectOption);
QCommandLineOption rrOption(QStringList() << "rr", "", "hostport");
parser.addOption(rrOption);
QCommandLineOption corefileOption(QStringList() << "core", "", "corefile");
2021-09-01 13:58:59 -05:00
parser.addOption(corefileOption);
QCommandLineOption projectOption(QStringList() << "project", "", "project");
parser.addOption(projectOption);
2023-04-17 17:53:28 -05:00
QCommandLineOption configOption(QStringList() << "config");
2022-06-16 19:25:05 -05:00
parser.addOption(configOption);
QCommandLineOption symbolfileOption(QStringList() << "sym" << "symbol-file", "", "symbolfile");
2023-04-17 17:53:28 -05:00
parser.addOption(symbolfileOption);
QCommandLineOption breakfileOption(QStringList() << "bl" << "break-load", "", "breakpointfile");
2023-04-17 17:53:28 -05:00
parser.addOption(breakfileOption);
QCommandLineOption breakfunctionOption(QStringList() << "bf" << "break-function", "", "breakpointfunction");
2023-04-17 17:53:28 -05:00
parser.addOption(breakfunctionOption);
QCommandLineOption showAssemblyTabOption(QStringList() << "sat" << "show-assembly-tab");
parser.addOption(showAssemblyTabOption);
QCommandLineOption startAddressRandomizeOption(QStringList() << "sar" << "start-address-randomize");
parser.addOption(startAddressRandomizeOption);
QCommandLineOption nonStopModeOption(QStringList() << "nsm" << "non-stop-mode");
parser.addOption(nonStopModeOption);
QCommandLineOption xxdebugOption(QStringList() << "xxx");
parser.addOption(xxdebugOption);
2023-04-17 17:53:28 -05:00
QCommandLineOption helpOption(QStringList() << "h" << "help");
parser.addOption(helpOption);
2021-09-01 13:58:59 -05:00
// A positional argument for executable name.
// All other arguments after that are treated as positional arguments for the executable.
parser.addPositionalArgument("executableandarguments", "");
2021-09-01 13:58:59 -05:00
// Process the arguments.
parser.process(app);
2023-04-17 17:53:28 -05:00
if (parser.isSet(helpOption)) {
//parser.showHelp();
seerhelp();
}
if (parser.isSet(xxdebugOption)) {
QLoggingCategory::setFilterRules("*.debug=false\n"
"*.info=false\n"
"*.warning=false\n"
"*.critical=true\n"
"default.debug=true");
}
2021-09-01 13:58:59 -05:00
// Get the positional arguments. (The ones at the end of the line - executable name and its arguments.
QStringList positionalArguments = parser.positionalArguments();
// Get the executable name from the arguments;
QString executableName;
if (positionalArguments.size() > 0) {
executableName = positionalArguments.takeFirst();
}
// Get launch mode.
QString launchMode = "none";
2022-07-30 12:02:52 -05:00
QString breakMode = "none";
2021-09-01 13:58:59 -05:00
int executablePid = -1;
QString executableConnectHostPort;
QString executableRRHostPort;
QString executableSymbolFilename;
QString executableBreakpointsFilename;
2022-07-31 11:20:38 -05:00
QString executableBreakpointFunctionName;
QString executableShowAssemblyTab;
QString executableStartAddressRandomize;
QString executableNonStopMode;
2021-09-01 13:58:59 -05:00
QString executableCoreFilename;
QString projectFilename;
2021-09-01 13:58:59 -05:00
if (parser.isSet(runOption)) {
launchMode = "run";
2022-07-30 12:02:52 -05:00
breakMode = "none";
2021-09-01 13:58:59 -05:00
}
if (parser.isSet(startOption)) {
2022-07-30 12:02:52 -05:00
launchMode = "run";
breakMode = "inmain";
2021-09-01 13:58:59 -05:00
}
if (parser.isSet(symbolfileOption)) {
executableSymbolFilename = parser.value(symbolfileOption);
}
2022-07-31 11:20:38 -05:00
if (parser.isSet(breakfileOption)) {
executableBreakpointsFilename = parser.value(breakfileOption);
}
if (parser.isSet(breakfunctionOption)) {
executableBreakpointFunctionName = parser.value(breakfunctionOption);
breakMode = "infunction";
}
if (parser.isSet(showAssemblyTabOption)) {
executableShowAssemblyTab = parser.value(showAssemblyTabOption);
}
if (parser.isSet(startAddressRandomizeOption)) {
executableStartAddressRandomize = parser.value(startAddressRandomizeOption);
}
if (parser.isSet(nonStopModeOption)) {
executableNonStopMode = parser.value(nonStopModeOption);
}
2021-09-01 13:58:59 -05:00
if (parser.isSet(attachOption)) {
launchMode = "attach";
QString pid = parser.value(attachOption);
executablePid = pid.toInt();
}
2022-06-16 19:25:05 -05:00
if (parser.isSet(connectOption)) {
launchMode = "connect";
executableConnectHostPort = parser.value(connectOption);
}
if (parser.isSet(rrOption)) {
launchMode = "rr";
executableRRHostPort = parser.value(rrOption);
2022-06-16 19:25:05 -05:00
}
2021-09-01 13:58:59 -05:00
if (parser.isSet(corefileOption)) {
launchMode = "corefile";
executableCoreFilename = parser.value(corefileOption);
}
if (parser.isSet(projectOption)) {
launchMode = "project";
projectFilename = parser.value(projectOption);
}
2022-06-16 19:25:05 -05:00
if (parser.isSet(configOption)) {
launchMode = "configdialog";
2021-09-01 13:58:59 -05:00
}
2022-06-16 19:25:05 -05:00
2021-09-01 13:58:59 -05:00
//
// Start Seer
//
SeerMainWindow seer;
2022-08-24 17:44:24 -05:00
seer.setWindowIcon(QIcon(":/seer/resources/seergdb_64x64.png"));
2021-09-01 13:58:59 -05:00
seer.setExecutableName(executableName);
seer.setExecutableSymbolName(executableSymbolFilename);
2021-09-01 13:58:59 -05:00
seer.setExecutableArguments(positionalArguments);
2022-07-31 11:20:38 -05:00
if (executableBreakpointsFilename != "") {
seer.setExecutableBreakpointsFilename(executableBreakpointsFilename);
}
if (executableBreakpointFunctionName != "") {
seer.setExecutableBreakpointFunctionName(executableBreakpointFunctionName);
}
if (executableShowAssemblyTab != "") {
if (executableShowAssemblyTab == "yes") {
seer.setExecutableShowAssemblyTab(true);
}else if (executableShowAssemblyTab == "no") {
seer.setExecutableShowAssemblyTab(false);
}else{
printf("%s: Unknown --show-assembly-tab option '%s'\n", qPrintable(QCoreApplication::applicationName()), qPrintable(executableShowAssemblyTab));
return 1;
}
}
if (executableStartAddressRandomize != "") {
if (executableStartAddressRandomize == "yes") {
seer.setExecutableRandomizeStartAddress(true);
}else if (executableStartAddressRandomize == "no") {
seer.setExecutableRandomizeStartAddress(false);
}else{
printf("%s: Unknown --start-address-randomize option '%s'\n", qPrintable(QCoreApplication::applicationName()), qPrintable(executableStartAddressRandomize));
return 1;
}
}
if (executableNonStopMode != "") {
if (executableNonStopMode == "yes") {
seer.setExecutableNonStopMode(true);
}else if (executableNonStopMode == "no") {
seer.setExecutableNonStopMode(false);
}else{
printf("%s: Unknown --non-stop-mode option '%s'\n", qPrintable(QCoreApplication::applicationName()), qPrintable(executableNonStopMode));
return 1;
}
}
qDebug() << "EXECUTABLENAME" << executableName;
qDebug() << "SYMBOLNAME" << executableSymbolFilename;
qDebug() << "PID" << executablePid;
qDebug() << "CONNECTHOST" << executableConnectHostPort;
qDebug() << "RRHOSTPORT" << executableRRHostPort;
qDebug() << "COREFILENAME" << executableCoreFilename;
qDebug() << "PROJECTFILE" << projectFilename;
qDebug() << "ARGUMENTS" << positionalArguments;
2021-09-01 13:58:59 -05:00
seer.setExecutablePid(executablePid);
seer.setExecutableConnectHostPort(executableConnectHostPort);
seer.setExecutableRRHostPort(executableRRHostPort);
2021-09-01 13:58:59 -05:00
seer.setExecutableCoreFilename(executableCoreFilename);
seer.setProjectFilename(projectFilename);
2021-09-01 13:58:59 -05:00
2022-07-30 12:02:52 -05:00
seer.launchExecutable(launchMode, breakMode);
2021-09-01 13:58:59 -05:00
seer.move(800, 400);
seer.show();
seer.activateWindow();
2021-09-01 13:58:59 -05:00
return app.exec();
}