From 4d64edde4616710ccaeb43dc390232b84796fb7e Mon Sep 17 00:00:00 2001 From: eidheim Date: Thu, 31 Dec 2015 12:22:04 +0100 Subject: [PATCH] Can now add/remove breakpoints when debug process is in stop state --- src/debug.cc | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/debug.h | 6 ++++++ src/window.cc | 30 ++++++++++++++++++----------- 3 files changed, 78 insertions(+), 11 deletions(-) diff --git a/src/debug.cc b/src/debug.cc index 739ab21..0d8c36a 100644 --- a/src/debug.cc +++ b/src/debug.cc @@ -12,6 +12,7 @@ #include #include #include +#include using namespace std; //TODO: remove @@ -223,6 +224,22 @@ std::string Debug::get_value(const std::string &variable, const boost::filesyste return variable_value; } +bool Debug::is_invalid() { + bool invalid; + event_mutex.lock(); + invalid=state==lldb::StateType::eStateInvalid; + event_mutex.unlock(); + return invalid; +} + +bool Debug::is_stopped() { + bool stopped; + event_mutex.lock(); + stopped=state==lldb::StateType::eStateStopped; + event_mutex.unlock(); + return stopped; +} + bool Debug::is_running() { bool running; event_mutex.lock(); @@ -231,6 +248,42 @@ bool Debug::is_running() { return running; } +void Debug::add_breakpoint(const boost::filesystem::path &file_path, int line_nr) { + event_mutex.lock(); + if(state==lldb::eStateStopped) { + if(!(process->GetTarget().BreakpointCreateByLocation(file_path.string().c_str(), line_nr)).IsValid()) + Terminal::get().async_print("Error (debug): Could not create breakpoint at: "+file_path.string()+":"+std::to_string(line_nr)+'\n', true); + } + event_mutex.unlock(); +} + +void Debug::remove_breakpoint(const boost::filesystem::path &file_path, int line_nr, int line_count) { + event_mutex.lock(); + if(state==lldb::eStateStopped) { + auto target=process->GetTarget(); + for(int line_nr_try=line_nr;line_nr_tryget_buffer()->get_insert()->get_iter().get_line()+1; - - if(view->get_source_buffer()->get_source_marks_at_line(line_nr-1, "debug_breakpoint").size()>0) { - auto start_iter=view->get_buffer()->get_iter_at_line(line_nr-1); - auto end_iter=start_iter; - while(!end_iter.ends_line() && end_iter.forward_char()) {} - view->get_source_buffer()->remove_source_marks(start_iter, end_iter, "debug_breakpoint"); + bool debug_is_stopped=Debug::get().is_stopped(); + if(Debug::get().is_invalid() || debug_is_stopped) { + if(notebook.get_current_page()!=-1) { + auto view=notebook.get_current_view(); + auto line_nr=view->get_buffer()->get_insert()->get_iter().get_line(); + + if(view->get_source_buffer()->get_source_marks_at_line(line_nr, "debug_breakpoint").size()>0) { + auto start_iter=view->get_buffer()->get_iter_at_line(line_nr); + auto end_iter=start_iter; + while(!end_iter.ends_line() && end_iter.forward_char()) {} + view->get_source_buffer()->remove_source_marks(start_iter, end_iter, "debug_breakpoint"); + if(debug_is_stopped) + Debug::get().remove_breakpoint(view->file_path, line_nr+1, view->get_buffer()->get_line_count()+1); + } + else { + view->get_source_buffer()->create_source_mark("debug_breakpoint", view->get_buffer()->get_insert()->get_iter()); + if(debug_is_stopped) + Debug::get().add_breakpoint(view->file_path, line_nr+1); + } } - else - view->get_source_buffer()->create_source_mark("debug_breakpoint", view->get_buffer()->get_insert()->get_iter()); } }); menu.add_action("debug_goto_stop", [this](){