diff --git a/src/apps/bin/strace/strace.cpp b/src/apps/bin/strace/strace.cpp index 5ee0e22fce..7dd7f243cb 100644 --- a/src/apps/bin/strace/strace.cpp +++ b/src/apps/bin/strace/strace.cpp @@ -239,17 +239,18 @@ set_thread_debugging_flags(port_id nubPort, thread_id thread, int32 flags) } } -// run_thread +// continue_thread static void -run_thread(port_id nubPort, thread_id thread) +continue_thread(port_id nubPort, thread_id thread) { - debug_nub_run_thread message; + debug_nub_continue_thread message; message.thread = thread; message.handle_event = B_THREAD_DEBUG_HANDLE_EVENT; + message.single_step = false; while (true) { - status_t error = write_port(nubPort, B_DEBUG_MESSAGE_RUN_THREAD, + status_t error = write_port(nubPort, B_DEBUG_MESSAGE_CONTINUE_THREAD, &message, sizeof(message)); if (error == B_OK) return; @@ -517,20 +518,21 @@ main(int argc, const char *const *argv) break; } - case B_DEBUGGER_MESSAGE_THREAD_STOPPED: + case B_DEBUGGER_MESSAGE_THREAD_DEBUGGED: + case B_DEBUGGER_MESSAGE_DEBUGGER_CALL: + case B_DEBUGGER_MESSAGE_BREAKPOINT_HIT: + case B_DEBUGGER_MESSAGE_WATCHPOINT_HIT: + case B_DEBUGGER_MESSAGE_SINGLE_STEP: case B_DEBUGGER_MESSAGE_PRE_SYSCALL: case B_DEBUGGER_MESSAGE_SIGNAL_RECEIVED: case B_DEBUGGER_MESSAGE_EXCEPTION_OCCURRED: case B_DEBUGGER_MESSAGE_TEAM_CREATED: case B_DEBUGGER_MESSAGE_THREAD_CREATED: + case B_DEBUGGER_MESSAGE_THREAD_DELETED: case B_DEBUGGER_MESSAGE_IMAGE_CREATED: case B_DEBUGGER_MESSAGE_IMAGE_DELETED: break; - case B_DEBUGGER_MESSAGE_THREAD_DELETED: - // nothing to do: a thread was deleted - break; - case B_DEBUGGER_MESSAGE_TEAM_DELETED: // the debugged team is gone exit(0); @@ -539,7 +541,7 @@ main(int argc, const char *const *argv) // tell the thread to continue (only when there is a thread and the // message was synchronous) if (message.origin.thread >= 0 && message.origin.nub_port >= 0) - run_thread(message.origin.nub_port, message.origin.thread); + continue_thread(message.origin.nub_port, message.origin.thread); } return 0; diff --git a/src/servers/debug/DebugServer.cpp b/src/servers/debug/DebugServer.cpp index ea50249eb9..867527448f 100644 --- a/src/servers/debug/DebugServer.cpp +++ b/src/servers/debug/DebugServer.cpp @@ -35,14 +35,14 @@ public: { } - void SetCode(int32 code) { fCode = code; } - int32 Code() const { return fCode; } + void SetCode(debug_debugger_message code) { fCode = code; } + debug_debugger_message Code() const { return fCode; } debug_debugger_message_data &Data() { return fData; } const debug_debugger_message_data &Data() const { return fData; } private: - int32 fCode; + debug_debugger_message fCode; debug_debugger_message_data fData; }; @@ -156,15 +156,21 @@ ThreadDebugHandler::HandleMessage(DebugMessage *message) // get some user-readable message char buffer[512]; - if (message->Code() == B_DEBUGGER_MESSAGE_THREAD_STOPPED) { - get_debug_why_stopped_string(message->Data().thread_stopped.why, buffer, - sizeof(buffer)); - } else if (message->Code() == B_DEBUGGER_MESSAGE_EXCEPTION_OCCURRED) { - get_debug_exception_string(message->Data().exception_occurred.exception, - buffer, sizeof(buffer)); - } else { - // We shouldn't be here. - sprintf(buffer, "Debug messages %ld", (int32)message->Code()); + switch (message->Code()) { + case B_DEBUGGER_MESSAGE_EXCEPTION_OCCURRED: + get_debug_exception_string( + message->Data().exception_occurred.exception, buffer, + sizeof(buffer)); + break; + case B_DEBUGGER_MESSAGE_DEBUGGER_CALL: + // TODO: Display the debugger message! + case B_DEBUGGER_MESSAGE_THREAD_DEBUGGED: + case B_DEBUGGER_MESSAGE_BREAKPOINT_HIT: + case B_DEBUGGER_MESSAGE_WATCHPOINT_HIT: + case B_DEBUGGER_MESSAGE_SINGLE_STEP: + default: + get_debug_message_string(message->Code(), buffer, sizeof(buffer)); + break; } // TODO: This would be the point to pop up an asynchronous alert. @@ -232,8 +238,12 @@ TeamDebugHandler::HandleMessage(DebugMessage *message) thread_id thread = message->Data().origin.thread; switch (message->Code()) { - case B_DEBUGGER_MESSAGE_THREAD_STOPPED: + case B_DEBUGGER_MESSAGE_THREAD_DEBUGGED: + case B_DEBUGGER_MESSAGE_DEBUGGER_CALL: case B_DEBUGGER_MESSAGE_EXCEPTION_OCCURRED: + case B_DEBUGGER_MESSAGE_BREAKPOINT_HIT: + case B_DEBUGGER_MESSAGE_WATCHPOINT_HIT: + case B_DEBUGGER_MESSAGE_SINGLE_STEP: { fNubPort = message->Data().origin.nub_port; @@ -253,10 +263,6 @@ TeamDebugHandler::HandleMessage(DebugMessage *message) case B_DEBUGGER_MESSAGE_TEAM_DELETED: return true; - case B_DEBUGGER_MESSAGE_THREAD_DELETED: - // a thread is gone: nothing to do - break; - case B_DEBUGGER_MESSAGE_SIGNAL_RECEIVED: // A signal doesn't usually trigger the debugger. // Just let the thread continue and see what happens next. @@ -264,6 +270,7 @@ TeamDebugHandler::HandleMessage(DebugMessage *message) case B_DEBUGGER_MESSAGE_POST_SYSCALL: case B_DEBUGGER_MESSAGE_TEAM_CREATED: case B_DEBUGGER_MESSAGE_THREAD_CREATED: + case B_DEBUGGER_MESSAGE_THREAD_DELETED: case B_DEBUGGER_MESSAGE_IMAGE_CREATED: case B_DEBUGGER_MESSAGE_IMAGE_DELETED: fNubPort = message->Data().origin.nub_port; @@ -292,12 +299,13 @@ TeamDebugHandler::KillTeam() void TeamDebugHandler::_ContinueThread(thread_id thread) { - debug_nub_run_thread message; + debug_nub_continue_thread message; message.thread = thread; message.handle_event = B_THREAD_DEBUG_HANDLE_EVENT; + message.single_step = false; while (true) { - status_t error = write_port(fNubPort, B_DEBUG_MESSAGE_RUN_THREAD, + status_t error = write_port(fNubPort, B_DEBUG_MESSAGE_CONTINUE_THREAD, &message, sizeof(message)); if (error == B_OK) return; @@ -452,7 +460,7 @@ DebugServer::_Listener() exit(1); } - message->SetCode(code); + message->SetCode((debug_debugger_message)code); // queue the message and send notify the app Lock();