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:
@@ -239,17 +239,18 @@ set_thread_debugging_flags(port_id nubPort, thread_id thread, int32 flags)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// run_thread
|
// continue_thread
|
||||||
static
|
static
|
||||||
void
|
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.thread = thread;
|
||||||
message.handle_event = B_THREAD_DEBUG_HANDLE_EVENT;
|
message.handle_event = B_THREAD_DEBUG_HANDLE_EVENT;
|
||||||
|
message.single_step = false;
|
||||||
|
|
||||||
while (true) {
|
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));
|
&message, sizeof(message));
|
||||||
if (error == B_OK)
|
if (error == B_OK)
|
||||||
return;
|
return;
|
||||||
@@ -517,20 +518,21 @@ main(int argc, const char *const *argv)
|
|||||||
break;
|
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_PRE_SYSCALL:
|
||||||
case B_DEBUGGER_MESSAGE_SIGNAL_RECEIVED:
|
case B_DEBUGGER_MESSAGE_SIGNAL_RECEIVED:
|
||||||
case B_DEBUGGER_MESSAGE_EXCEPTION_OCCURRED:
|
case B_DEBUGGER_MESSAGE_EXCEPTION_OCCURRED:
|
||||||
case B_DEBUGGER_MESSAGE_TEAM_CREATED:
|
case B_DEBUGGER_MESSAGE_TEAM_CREATED:
|
||||||
case B_DEBUGGER_MESSAGE_THREAD_CREATED:
|
case B_DEBUGGER_MESSAGE_THREAD_CREATED:
|
||||||
|
case B_DEBUGGER_MESSAGE_THREAD_DELETED:
|
||||||
case B_DEBUGGER_MESSAGE_IMAGE_CREATED:
|
case B_DEBUGGER_MESSAGE_IMAGE_CREATED:
|
||||||
case B_DEBUGGER_MESSAGE_IMAGE_DELETED:
|
case B_DEBUGGER_MESSAGE_IMAGE_DELETED:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case B_DEBUGGER_MESSAGE_THREAD_DELETED:
|
|
||||||
// nothing to do: a thread was deleted
|
|
||||||
break;
|
|
||||||
|
|
||||||
case B_DEBUGGER_MESSAGE_TEAM_DELETED:
|
case B_DEBUGGER_MESSAGE_TEAM_DELETED:
|
||||||
// the debugged team is gone
|
// the debugged team is gone
|
||||||
exit(0);
|
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
|
// tell the thread to continue (only when there is a thread and the
|
||||||
// message was synchronous)
|
// message was synchronous)
|
||||||
if (message.origin.thread >= 0 && message.origin.nub_port >= 0)
|
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;
|
return 0;
|
||||||
|
|||||||
@@ -35,14 +35,14 @@ public:
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetCode(int32 code) { fCode = code; }
|
void SetCode(debug_debugger_message code) { fCode = code; }
|
||||||
int32 Code() const { return fCode; }
|
debug_debugger_message Code() const { return fCode; }
|
||||||
|
|
||||||
debug_debugger_message_data &Data() { return fData; }
|
debug_debugger_message_data &Data() { return fData; }
|
||||||
const debug_debugger_message_data &Data() const { return fData; }
|
const debug_debugger_message_data &Data() const { return fData; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int32 fCode;
|
debug_debugger_message fCode;
|
||||||
debug_debugger_message_data fData;
|
debug_debugger_message_data fData;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -156,15 +156,21 @@ ThreadDebugHandler::HandleMessage(DebugMessage *message)
|
|||||||
|
|
||||||
// get some user-readable message
|
// get some user-readable message
|
||||||
char buffer[512];
|
char buffer[512];
|
||||||
if (message->Code() == B_DEBUGGER_MESSAGE_THREAD_STOPPED) {
|
switch (message->Code()) {
|
||||||
get_debug_why_stopped_string(message->Data().thread_stopped.why, buffer,
|
case B_DEBUGGER_MESSAGE_EXCEPTION_OCCURRED:
|
||||||
sizeof(buffer));
|
get_debug_exception_string(
|
||||||
} else if (message->Code() == B_DEBUGGER_MESSAGE_EXCEPTION_OCCURRED) {
|
message->Data().exception_occurred.exception, buffer,
|
||||||
get_debug_exception_string(message->Data().exception_occurred.exception,
|
sizeof(buffer));
|
||||||
buffer, sizeof(buffer));
|
break;
|
||||||
} else {
|
case B_DEBUGGER_MESSAGE_DEBUGGER_CALL:
|
||||||
// We shouldn't be here.
|
// TODO: Display the debugger message!
|
||||||
sprintf(buffer, "Debug messages %ld", (int32)message->Code());
|
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.
|
// 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;
|
thread_id thread = message->Data().origin.thread;
|
||||||
|
|
||||||
switch (message->Code()) {
|
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_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;
|
fNubPort = message->Data().origin.nub_port;
|
||||||
|
|
||||||
@@ -253,10 +263,6 @@ TeamDebugHandler::HandleMessage(DebugMessage *message)
|
|||||||
case B_DEBUGGER_MESSAGE_TEAM_DELETED:
|
case B_DEBUGGER_MESSAGE_TEAM_DELETED:
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
case B_DEBUGGER_MESSAGE_THREAD_DELETED:
|
|
||||||
// a thread is gone: nothing to do
|
|
||||||
break;
|
|
||||||
|
|
||||||
case B_DEBUGGER_MESSAGE_SIGNAL_RECEIVED:
|
case B_DEBUGGER_MESSAGE_SIGNAL_RECEIVED:
|
||||||
// A signal doesn't usually trigger the debugger.
|
// A signal doesn't usually trigger the debugger.
|
||||||
// Just let the thread continue and see what happens next.
|
// 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_POST_SYSCALL:
|
||||||
case B_DEBUGGER_MESSAGE_TEAM_CREATED:
|
case B_DEBUGGER_MESSAGE_TEAM_CREATED:
|
||||||
case B_DEBUGGER_MESSAGE_THREAD_CREATED:
|
case B_DEBUGGER_MESSAGE_THREAD_CREATED:
|
||||||
|
case B_DEBUGGER_MESSAGE_THREAD_DELETED:
|
||||||
case B_DEBUGGER_MESSAGE_IMAGE_CREATED:
|
case B_DEBUGGER_MESSAGE_IMAGE_CREATED:
|
||||||
case B_DEBUGGER_MESSAGE_IMAGE_DELETED:
|
case B_DEBUGGER_MESSAGE_IMAGE_DELETED:
|
||||||
fNubPort = message->Data().origin.nub_port;
|
fNubPort = message->Data().origin.nub_port;
|
||||||
@@ -292,12 +299,13 @@ TeamDebugHandler::KillTeam()
|
|||||||
void
|
void
|
||||||
TeamDebugHandler::_ContinueThread(thread_id thread)
|
TeamDebugHandler::_ContinueThread(thread_id thread)
|
||||||
{
|
{
|
||||||
debug_nub_run_thread message;
|
debug_nub_continue_thread message;
|
||||||
message.thread = thread;
|
message.thread = thread;
|
||||||
message.handle_event = B_THREAD_DEBUG_HANDLE_EVENT;
|
message.handle_event = B_THREAD_DEBUG_HANDLE_EVENT;
|
||||||
|
message.single_step = false;
|
||||||
|
|
||||||
while (true) {
|
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));
|
&message, sizeof(message));
|
||||||
if (error == B_OK)
|
if (error == B_OK)
|
||||||
return;
|
return;
|
||||||
@@ -452,7 +460,7 @@ DebugServer::_Listener()
|
|||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
message->SetCode(code);
|
message->SetCode((debug_debugger_message)code);
|
||||||
|
|
||||||
// queue the message and send notify the app
|
// queue the message and send notify the app
|
||||||
Lock();
|
Lock();
|
||||||
|
|||||||
Reference in New Issue
Block a user