1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 10:38:11 +00:00

HackStudio: Gracefully handle unfound source files

This commit is contained in:
Itamar 2020-05-05 14:14:29 +03:00 committed by Andreas Kling
parent 5fd64045b1
commit b931771d24
3 changed files with 25 additions and 11 deletions

View file

@ -35,7 +35,7 @@ Debugger& Debugger::the()
} }
void Debugger::initialize( void Debugger::initialize(
Function<void(const PtraceRegisters&)> on_stop_callback, Function<HasControlPassedToUser(const PtraceRegisters&)> on_stop_callback,
Function<void()> on_continue_callback, Function<void()> on_continue_callback,
Function<void()> on_exit_callback) Function<void()> on_exit_callback)
{ {
@ -48,7 +48,7 @@ bool Debugger::is_initialized()
} }
Debugger::Debugger( Debugger::Debugger(
Function<void(const PtraceRegisters&)> on_stop_callback, Function<HasControlPassedToUser(const PtraceRegisters&)> on_stop_callback,
Function<void()> on_continue_callback, Function<void()> on_continue_callback,
Function<void()> on_exit_callback) Function<void()> on_exit_callback)
: m_on_stopped_callback(move(on_stop_callback)) : m_on_stopped_callback(move(on_stop_callback))
@ -138,13 +138,17 @@ int Debugger::debugger_loop()
in_single_step_mode = false; in_single_step_mode = false;
} }
m_on_stopped_callback(regs); auto control_passed_to_user = m_on_stopped_callback(regs);
pthread_mutex_lock(&m_continue_mutex); if (control_passed_to_user == HasControlPassedToUser::Yes) {
pthread_cond_wait(&m_continue_cond, &m_continue_mutex); pthread_mutex_lock(&m_continue_mutex);
pthread_mutex_unlock(&m_continue_mutex); pthread_cond_wait(&m_continue_cond, &m_continue_mutex);
pthread_mutex_unlock(&m_continue_mutex);
m_on_continue_callback(); m_on_continue_callback();
} else {
m_continue_type = ContinueType::Continue;
}
if (m_continue_type == ContinueType::Continue) { if (m_continue_type == ContinueType::Continue) {
return DebugSession::DebugDecision::Continue; return DebugSession::DebugDecision::Continue;

View file

@ -37,8 +37,14 @@
class Debugger { class Debugger {
public: public:
static Debugger& the(); static Debugger& the();
enum class HasControlPassedToUser {
No,
Yes,
};
static void initialize( static void initialize(
Function<void(const PtraceRegisters&)> on_stop_callback, Function<HasControlPassedToUser(const PtraceRegisters&)> on_stop_callback,
Function<void()> on_continue_callback, Function<void()> on_continue_callback,
Function<void()> on_exit_callback); Function<void()> on_exit_callback);
@ -66,7 +72,7 @@ public:
private: private:
explicit Debugger( explicit Debugger(
Function<void(const PtraceRegisters&)> on_stop_callback, Function<HasControlPassedToUser(const PtraceRegisters&)> on_stop_callback,
Function<void()> on_continue_callback, Function<void()> on_continue_callback,
Function<void()> on_exit_callback); Function<void()> on_exit_callback);
@ -83,7 +89,7 @@ private:
Vector<DebugInfo::SourcePosition> m_breakpoints; Vector<DebugInfo::SourcePosition> m_breakpoints;
String m_executable_path; String m_executable_path;
Function<void(const PtraceRegisters&)> m_on_stopped_callback; Function<HasControlPassedToUser(const PtraceRegisters&)> m_on_stopped_callback;
Function<void()> m_on_continue_callback; Function<void()> m_on_continue_callback;
Function<void()> m_on_exit_callback; Function<void()> m_on_exit_callback;

View file

@ -609,13 +609,17 @@ int main(int argc, char** argv)
dbg() << "Program stopped"; dbg() << "Program stopped";
auto source_position = Debugger::the().session()->debug_info().get_source_position(regs.eip); auto source_position = Debugger::the().session()->debug_info().get_source_position(regs.eip);
ASSERT(source_position.has_value()); if (!source_position.has_value()) {
dbg() << "Could not find source position for address: " << (void*)regs.eip;
return Debugger::HasControlPassedToUser::No;
}
current_editor_in_execution = get_editor_of_file(source_position.value().file_path); current_editor_in_execution = get_editor_of_file(source_position.value().file_path);
current_editor_in_execution->editor().set_execution_position(source_position.value().line_number - 1); current_editor_in_execution->editor().set_execution_position(source_position.value().line_number - 1);
debug_info_widget.update_variables(regs); debug_info_widget.update_variables(regs);
continue_action->set_enabled(true); continue_action->set_enabled(true);
single_step_action->set_enabled(true); single_step_action->set_enabled(true);
reveal_action_tab(debug_info_widget); reveal_action_tab(debug_info_widget);
return Debugger::HasControlPassedToUser::Yes;
}, },
[&]() { [&]() {
dbg() << "Program continued"; dbg() << "Program continued";