status_t DebuggerInterface::_CreateDebugEvent(int32 messageCode, const debug_debugger_message_data& message, bool& _ignore, DebugEvent*& _event) { DebugEvent* event = NULL; switch (messageCode) { case B_DEBUGGER_MESSAGE_THREAD_DEBUGGED: event = new(std::nothrow) ThreadDebuggedEvent(message.origin.team, message.origin.thread); break; case B_DEBUGGER_MESSAGE_DEBUGGER_CALL: event = new(std::nothrow) DebuggerCallEvent(message.origin.team, message.origin.thread, (target_addr_t)message.debugger_call.message); break; case B_DEBUGGER_MESSAGE_BREAKPOINT_HIT: { CpuState* state = NULL; status_t error = fArchitecture->CreateCpuState( &message.breakpoint_hit.cpu_state, sizeof(debug_cpu_state), state); if (error != B_OK) return error; event = new(std::nothrow) BreakpointHitEvent(message.origin.team, message.origin.thread, state); state->RemoveReference(); break; } case B_DEBUGGER_MESSAGE_WATCHPOINT_HIT: { CpuState* state = NULL; status_t error = fArchitecture->CreateCpuState( &message.watchpoint_hit.cpu_state, sizeof(debug_cpu_state), state); if (error != B_OK) return error; event = new(std::nothrow) WatchpointHitEvent(message.origin.team, message.origin.thread, state); state->RemoveReference(); break; } case B_DEBUGGER_MESSAGE_SINGLE_STEP: { CpuState* state = NULL; status_t error = fArchitecture->CreateCpuState( &message.single_step.cpu_state, sizeof(debug_cpu_state), state); if (error != B_OK) return error; event = new(std::nothrow) SingleStepEvent(message.origin.team, message.origin.thread, state); state->RemoveReference(); break; } case B_DEBUGGER_MESSAGE_EXCEPTION_OCCURRED: event = new(std::nothrow) ExceptionOccurredEvent( message.origin.team, message.origin.thread, message.exception_occurred.exception); break; case B_DEBUGGER_MESSAGE_TEAM_DELETED: if (message.origin.team != fTeamID) { _ignore = true; return B_OK; } event = new(std::nothrow) TeamDeletedEvent(message.origin.team, message.origin.thread); break; case B_DEBUGGER_MESSAGE_TEAM_EXEC: if (message.origin.team != fTeamID) { _ignore = true; return B_OK; } event = new(std::nothrow) TeamExecEvent(message.origin.team, message.origin.thread); break; case B_DEBUGGER_MESSAGE_THREAD_CREATED: event = new(std::nothrow) ThreadCreatedEvent(message.origin.team, message.origin.thread, message.thread_created.new_thread); break; case B_DEBUGGER_MESSAGE_THREAD_DELETED: event = new(std::nothrow) ThreadDeletedEvent(message.origin.team, message.origin.thread); break; case B_DEBUGGER_MESSAGE_IMAGE_CREATED: { const image_info& info = message.image_created.info; event = new(std::nothrow) ImageCreatedEvent(message.origin.team, message.origin.thread, ImageInfo(fTeamID, info.id, info.name, info.type, (addr_t)info.text, info.text_size, (addr_t)info.data, info.data_size)); break; } case B_DEBUGGER_MESSAGE_IMAGE_DELETED: { const image_info& info = message.image_deleted.info; event = new(std::nothrow) ImageDeletedEvent(message.origin.team, message.origin.thread, ImageInfo(fTeamID, info.id, info.name, info.type, (addr_t)info.text, info.text_size, (addr_t)info.data, info.data_size)); break; } default: printf("DebuggerInterface for team %ld: unknown message from " "kernel: %ld\n", fTeamID, messageCode); // fall through... case B_DEBUGGER_MESSAGE_TEAM_CREATED: case B_DEBUGGER_MESSAGE_PRE_SYSCALL: case B_DEBUGGER_MESSAGE_POST_SYSCALL: case B_DEBUGGER_MESSAGE_SIGNAL_RECEIVED: case B_DEBUGGER_MESSAGE_PROFILER_UPDATE: case B_DEBUGGER_MESSAGE_HANDED_OVER: _ignore = true; return B_OK; } if (event == NULL) return B_NO_MEMORY; if (message.origin.thread >= 0 && message.origin.nub_port >= 0) event->SetThreadStopped(true); _ignore = false; _event = event; return B_OK; }