History

Change debugger options to enumeration. Alter how the debugger displays the registers. Adding a breakpoint that is already set is a no-op and simply returns the current cookie value. Fix bug in print for the Sys module - don't ignore format modifiers.

arr committed 10 years ago

Commit db76c0c1 parent f29cf0d6 files · +45 −41Browse files

Showing the changes to src/exec/debugger.cpp (1 of 6 files). Show all

Unified · Split

src/exec/debugger.cpp+16−23
@@ -139,7 +139,7 @@ namespace · 138 unmodified lines
139139
140140 register_string
141141 << " Thread ID: " << r.thread.get_thread_id() << "\n"
142− << " Module: " << r.module_ref->module->module_name->str() << " PC: " << r.pc << "\n"
142+ << " PC: " << r.pc << " Module: " << r.module_ref->module->module_name->str() << "\n"
143143 << " Opcode: " << r.module_ref->code_section[r.pc].op << "\n";
144144
145145 return register_string.str();
@@ -389,14 +389,7 @@ namespace · 243 unmodified lines
389389 if (pc < 0 || module->code_section.size() <= static_cast<std::size_t>(pc))
390390 throw debug_cmd_error_t{ "Invalid IP for module" };
391391
392− try
393− {
394− cxt.dbg.breakpoint_cookies.push_back(cxt.dbg.controller->set_breakpoint(module, pc));
395− }
396− catch (const vm_system_exception& e)
397− {
398− throw debug_cmd_error_t{ e.what() };
399− }
392+ cxt.dbg.breakpoint_cookies.emplace(cxt.dbg.controller->set_breakpoint(module, pc));
400393 }
401394
402395 void cmd_breakpoint_clear(const std::vector<std::string> &a, dbg_cmd_cxt_t &cxt)
@@ -880,14 +873,14 @@ namespace · 477 unmodified lines
880873
881874 std::ostream& operator<<(std::ostream &ss, const debugger_options o)
882875 {
883− ss << "Break on enter: " << std::boolalpha << o.break_on_enter << "\n"
884− << "Break on module load: " << std::boolalpha << o.break_on_module_load << "\n"
885− << "Break on exception: " << std::boolalpha << o.break_on_exception << "\n";
876+ ss << "Break on enter: " << std::boolalpha << util::has_flag(o, debugger_options::break_on_enter) << "\n"
877+ << "Break on module load: " << std::boolalpha << util::has_flag(o, debugger_options::break_on_module_load) << "\n"
878+ << "Break on exception: " << std::boolalpha << util::has_flag(o, debugger_options::break_on_exception) << "\n";
886879
887880 return ss;
888881 }
889882
890−debugger::debugger(const debugger_options &opt)
883+debugger::debugger(const debugger_options opt)
891884 : _options{ opt }
892885 , _tool_id{ 0 }
893886 , controller{ nullptr }
@@ -898,7 +891,7 @@ void debugger::on_load(vm_tool_controller_t &controller_, std::size_t tool_id) · 4 unmodified lines
898891 _tool_id = tool_id;
899892 controller = &controller_;
900893
901− _event_cookies.push_back(controller->subscribe_event(vm_event_t::thread_begin, [](vm_event_t, vm_event_context_t &cxt)
894+ _event_cookies.emplace(controller->subscribe_event(vm_event_t::thread_begin, [](vm_event_t, vm_event_context_t &cxt)
902895 {
903896 auto t = cxt.value1.thread;
904897 auto ss = std::stringstream{};
@@ -912,7 +905,7 @@ void debugger::on_load(vm_tool_controller_t &controller_, std::size_t tool_id) · 7 unmodified lines
912905 debug_print_info(ss.str());
913906 }));
914907
915− _event_cookies.push_back(controller->subscribe_event(vm_event_t::thread_end, [](vm_event_t, vm_event_context_t &cxt)
908+ _event_cookies.emplace(controller->subscribe_event(vm_event_t::thread_end, [](vm_event_t, vm_event_context_t &cxt)
916909 {
917910 auto ss = std::stringstream{};
918911 ss << "Thread "
@@ -922,7 +915,7 @@ void debugger::on_load(vm_tool_controller_t &controller_, std::size_t tool_id) · 3 unmodified lines
922915 debug_print_info(ss.str());
923916 }));
924917
925− _event_cookies.push_back(controller->subscribe_event(vm_event_t::exception_raised, [&](vm_event_t, vm_event_context_t &cxt)
918+ _event_cookies.emplace(controller->subscribe_event(vm_event_t::exception_raised, [&](vm_event_t, vm_event_context_t &cxt)
926919 {
927920 auto ss = std::stringstream{};
928921 ss << "Exception '"
@@ -931,11 +924,11 @@ void debugger::on_load(vm_tool_controller_t &controller_, std::size_t tool_id) · 2 unmodified lines
931924
932925 debug_print_info(ss.str());
933926
934− if (_options.break_on_exception)
927+ if (util::has_flag(_options, debugger_options::break_on_exception))
935928 prompt(*this, *cxt.value1.registers);
936929 }));
937930
938− _event_cookies.push_back(controller->subscribe_event(vm_event_t::exception_unhandled, [&](vm_event_t, vm_event_context_t &cxt)
931+ _event_cookies.emplace(controller->subscribe_event(vm_event_t::exception_unhandled, [&](vm_event_t, vm_event_context_t &cxt)
939932 {
940933 auto ss = std::stringstream{};
941934 ss << "Unhandled exception '"
@@ -946,7 +939,7 @@ void debugger::on_load(vm_tool_controller_t &controller_, std::size_t tool_id) · 4 unmodified lines
946939 prompt(*this, *cxt.value1.registers);
947940 }));
948941
949− _event_cookies.push_back(controller->subscribe_event(vm_event_t::module_thread_load, [&](vm_event_t, vm_event_context_t &cxt)
942+ _event_cookies.emplace(controller->subscribe_event(vm_event_t::module_thread_load, [&](vm_event_t, vm_event_context_t &cxt)
950943 {
951944 auto m = (*cxt.value2.module);
952945 auto ss = std::stringstream{};
@@ -961,19 +954,19 @@ void debugger::on_load(vm_tool_controller_t &controller_, std::size_t tool_id) · 8 unmodified lines
961954
962955 // If the break on enter flag was set, it will be true
963956 // and the first module load will be the user entry module.
964− if (_options.break_on_enter)
957+ if (util::has_flag(_options, debugger_options::break_on_enter))
965958 {
966959 // Reset the break on enter flag and set a breakpoint
967960 // on the entry PC for the module - 'break on enter'
968− _options.break_on_enter = false;
961+ _options ^= debugger_options::break_on_enter;
969962 controller->set_breakpoint(m, m->header.entry_pc);
970963 }
971964
972− if (_options.break_on_module_load)
965+ if (util::has_flag(_options, debugger_options::break_on_module_load))
973966 prompt(*this, *cxt.value1.registers);
974967 }));
975968
976− _event_cookies.push_back(controller->subscribe_event(vm_event_t::breakpoint, [&](vm_event_t, vm_event_context_t &cxt)
969+ _event_cookies.emplace(controller->subscribe_event(vm_event_t::breakpoint, [&](vm_event_t, vm_event_context_t &cxt)
977970 {
978971 auto ss = std::stringstream{};
979972 ss << "Breakpoint hit";