X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fcommandinterpreter.cpp;h=d3db5a49412ad8b19f01b55702b9fbf19f0cd898;hb=a832996c884a0e0acc9a38ba4dd258edb75ec7af;hp=2a28f69acd6e06a2dc8c523ef2e58a388a62124d;hpb=7bd7fc784a6f6cff69f79914a445bc2115a7e768;p=gldbg.git diff --git a/source/commandinterpreter.cpp b/source/commandinterpreter.cpp index 2a28f69..d3db5a4 100644 --- a/source/commandinterpreter.cpp +++ b/source/commandinterpreter.cpp @@ -1,23 +1,15 @@ -/* $Id$ - -This file is part of gldbg -Copyright © 2009-2010 Mikko Rasa, Mikkosoft Productions -Distributed under the GPL -*/ - +#include +#include #include #include -#include -#include -#include -#include +#include "breakpoint.h" #include "commandinterpreter.h" #include "enums.h" +#include "functions.h" #include "gldbg.h" #include "tracer.h" using namespace std; -using namespace Msp; CommandInterpreter::CommandInterpreter(GlDbg &d): gldbg(d) @@ -34,6 +26,19 @@ CommandInterpreter::CommandInterpreter(GlDbg &d): register_command("run", this, &CommandInterpreter::cmd_run) .set_help("Starts the program"); + register_command("break", this, &CommandInterpreter::cmd_break) + .set_help("Sets a breakpoint", + "break FUNC\n" + " Makes program execution stop at FUNC\n"); + register_command("unbreak", this, &CommandInterpreter::cmd_unbreak) + .set_help("Removes a breakpoint", + "unbreak FUNC\n" + " Makes program execution no longer stop at FUNC\n"); + register_command("next", this, &CommandInterpreter::cmd_next) + .set_help("Resumes program execution until the next function call"); + commands["step"] = new CommandAlias(commands["next"]); + register_command("finish", this, &CommandInterpreter::cmd_finish) + .set_help("Resumes program execution until the next function return"); register_command("continue", this, &CommandInterpreter::cmd_continue) .set_help("Resumes program execution"); register_command("kill", this, &CommandInterpreter::cmd_kill) @@ -54,12 +59,12 @@ void CommandInterpreter::execute(const string &cmd) string name = cmd.substr(0, space); CommandMap::const_iterator i = commands.lower_bound(name); if(i==commands.end() || i->first.compare(0, name.size(), name)) - throw KeyError("Unknown command", name); + throw runtime_error("Unknown command "+name); if(i->first!=name) { CommandMap::const_iterator j = i; if((++j)!=commands.end() && !j->first.compare(0, name.size(), name)) - throw KeyError("Ambiguous command", name); + throw runtime_error("Ambiguous command "+name); } string args; @@ -75,21 +80,21 @@ void CommandInterpreter::cmd_help(const string &args) { for(CommandMap::const_iterator i=commands.begin(); i!=commands.end(); ++i) if(!dynamic_cast(i->second)) - IO::print("%-10s : %s\n", i->first, i->second->get_description()); + printf("%-10s : %s\n", i->first.c_str(), i->second->get_description().c_str()); } else { CommandMap::const_iterator i = commands.find(args); if(i==commands.end()) - throw KeyError("Unknown command", args); + throw runtime_error("Unknown command "+args); const Command *cmd = i->second; while(const CommandAlias *alias = dynamic_cast(cmd)) cmd = alias->get_target(); - IO::print("%s : %s\n", i->first, cmd->get_description()); + printf("%s : %s\n", i->first.c_str(), cmd->get_description().c_str()); if(!cmd->get_help().empty()) - IO::print("\n%s", cmd->get_help()); + printf("\n%s", cmd->get_help().c_str()); } } @@ -98,9 +103,39 @@ void CommandInterpreter::cmd_run(const string &) gldbg.launch(); } +void CommandInterpreter::cmd_break(const string &args) +{ + unsigned short func = get_function(args.c_str()); + if(!func) + throw runtime_error("Unknown function"); + + gldbg.set_breakpoint(func, BREAK_CALL, 0); +} + +void CommandInterpreter::cmd_unbreak(const string &args) +{ + unsigned short func = get_function(args.c_str()); + if(!func) + throw runtime_error("Unknown function"); + + gldbg.clear_breakpoint(func, BREAK_CALL, 0); +} + +void CommandInterpreter::cmd_next(const string &) +{ + gldbg.set_breakpoint(0, BREAK_CALL, 0); + gldbg.get_process().resume(); +} + +void CommandInterpreter::cmd_finish(const string &) +{ + gldbg.set_breakpoint(0, BREAK_RETURN, 0); + gldbg.get_process().resume(); +} + void CommandInterpreter::cmd_continue(const string &) { - IO::print("Continuing.\n"); + printf("Continuing.\n"); gldbg.get_process().resume(); } @@ -117,10 +152,13 @@ void CommandInterpreter::cmd_signal(const string &args) sig = SIGSEGV; else if(args=="TERM" || args=="SIGTERM") sig = SIGTERM; - else if(isnumrc(args)) - sig = lexical_cast(args); else - throw InvalidParameterValue("Invalid signal specification"); + { + char *end; + sig = strtoul(args.c_str(), &end, 0); + if(end && *end) + throw runtime_error("Invalid signal specification"); + } gldbg.get_process().resume(sig); } @@ -133,7 +171,7 @@ void CommandInterpreter::cmd_exit(const string &) { if(gldbg.get_process().get_state()!=Process::INACTIVE) { - IO::print("Program is still running. Kill it?\n"); + printf("Program is still running. Kill it?\n"); char *answer = readline("[y/n] "); if(answer[0]=='y') { @@ -141,7 +179,7 @@ void CommandInterpreter::cmd_exit(const string &) gldbg.quit(true); } else - IO::print("Not confirmed.\n"); + printf("Not confirmed.\n"); } else gldbg.quit(false);