The debugger interface has changed a bit.

git-svn-id: file:///srv/svn/repos/haiku/trunk/current@11716 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Ingo Weinhold 2005-03-13 23:59:20 +00:00
parent b24684af25
commit edc47dd584
2 changed files with 40 additions and 30 deletions

View File

@ -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;

View File

@ -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();