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:
parent
5fd64045b1
commit
b931771d24
3 changed files with 25 additions and 11 deletions
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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";
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue