diff --git a/src/apps/debugger/MessageCodes.h b/src/apps/debugger/MessageCodes.h index 093e729cd0..bf5284c58c 100644 --- a/src/apps/debugger/MessageCodes.h +++ b/src/apps/debugger/MessageCodes.h @@ -22,6 +22,7 @@ enum { MSG_CLEAR_WATCHPOINT = 'cwpt', MSG_ENABLE_WATCHPOINT = 'ewpt', MSG_DISABLE_WATCHPOINT = 'dwpt', + MSG_STOP_ON_IMAGE_LOAD = 'tsil', MSG_THREAD_STATE_CHANGED = 'tsch', MSG_THREAD_CPU_STATE_CHANGED = 'tcsc', diff --git a/src/apps/debugger/controllers/TeamDebugger.cpp b/src/apps/debugger/controllers/TeamDebugger.cpp index 2174d882dd..449eb87484 100644 --- a/src/apps/debugger/controllers/TeamDebugger.cpp +++ b/src/apps/debugger/controllers/TeamDebugger.cpp @@ -15,6 +15,7 @@ #include #include +#include #include #include "debug_utils.h" @@ -222,7 +223,8 @@ TeamDebugger::TeamDebugger(Listener* listener, UserInterface* userInterface, fTerminating(false), fKillTeamOnQuit(false), fCommandLineArgc(0), - fCommandLineArgv(NULL) + fCommandLineArgv(NULL), + fStopOnImageLoad(false) { fUserInterface->AcquireReference(); } @@ -603,6 +605,16 @@ TeamDebugger::MessageReceived(BMessage* message) break; } + case MSG_STOP_ON_IMAGE_LOAD: + { + bool enabled; + if (message->FindBool("enabled", &enabled) != B_OK) + break; + + fStopOnImageLoad = enabled; + break; + } + case MSG_SET_WATCHPOINT: case MSG_CLEAR_WATCHPOINT: { @@ -886,6 +898,15 @@ TeamDebugger::ClearBreakpointRequested(target_addr_t address) } +void +TeamDebugger::SetStopOnImageLoadRequested(bool enabled) +{ + BMessage message(MSG_STOP_ON_IMAGE_LOAD); + message.AddBool("enabled", enabled); + PostMessage(&message); +} + + void TeamDebugger::ClearBreakpointRequested(UserBreakpoint* breakpoint) { @@ -1502,9 +1523,16 @@ TeamDebugger::_HandleImageDebugInfoChanged(image_id imageID) ImageInfoPendingThread* thread = fImageInfoPendingThreads ->Lookup(imageID); if (thread != NULL) { - fDebuggerInterface->ContinueThread(thread->ThreadID()); fImageInfoPendingThreads->Remove(thread); - delete thread; + ObjectDeleter threadDeleter(thread); + if (fStopOnImageLoad) { + ThreadHandler* handler = _GetThreadHandler(thread->ThreadID()); + BReference handlerReference(handler); + + if (handler != NULL && handler->HandleThreadDebugged(NULL)) + return; + } + fDebuggerInterface->ContinueThread(thread->ThreadID()); } } } diff --git a/src/apps/debugger/controllers/TeamDebugger.h b/src/apps/debugger/controllers/TeamDebugger.h index bfdfc452de..b869ece4f7 100644 --- a/src/apps/debugger/controllers/TeamDebugger.h +++ b/src/apps/debugger/controllers/TeamDebugger.h @@ -78,6 +78,7 @@ private: virtual void ClearBreakpointRequested(target_addr_t address); virtual void ClearBreakpointRequested( UserBreakpoint* breakpoint); + virtual void SetStopOnImageLoadRequested(bool enabled); virtual void SetWatchpointRequested(target_addr_t address, uint32 type, int32 length, bool enabled); virtual void SetWatchpointEnabledRequested( @@ -206,6 +207,7 @@ private: TeamSettings fTeamSettings; int fCommandLineArgc; const char** fCommandLineArgv; + bool fStopOnImageLoad; }; diff --git a/src/apps/debugger/user_interface/UserInterface.h b/src/apps/debugger/user_interface/UserInterface.h index 20d9db09be..54731566f5 100644 --- a/src/apps/debugger/user_interface/UserInterface.h +++ b/src/apps/debugger/user_interface/UserInterface.h @@ -106,6 +106,8 @@ public: UserBreakpoint* breakpoint) = 0; // TODO: Consolidate those! + virtual void SetStopOnImageLoadRequested(bool enabled) = 0; + virtual void SetWatchpointRequested(target_addr_t address, uint32 type, int32 length, bool enabled) = 0; diff --git a/src/apps/debugger/user_interface/gui/team_window/TeamWindow.cpp b/src/apps/debugger/user_interface/gui/team_window/TeamWindow.cpp index 697680149b..c414097708 100644 --- a/src/apps/debugger/user_interface/gui/team_window/TeamWindow.cpp +++ b/src/apps/debugger/user_interface/gui/team_window/TeamWindow.cpp @@ -60,10 +60,10 @@ enum { enum { - MSG_CHOOSE_DEBUG_REPORT_LOCATION = 'ccrl', - MSG_DEBUG_REPORT_SAVED = 'drsa', - MSG_LOCATE_SOURCE_IF_NEEDED = 'lsin', - MSG_CLEAR_STACK_TRACE = 'clst' + MSG_CHOOSE_DEBUG_REPORT_LOCATION = 'ccrl', + MSG_DEBUG_REPORT_SAVED = 'drsa', + MSG_LOCATE_SOURCE_IF_NEEDED = 'lsin', + MSG_CLEAR_STACK_TRACE = 'clst' }; @@ -234,6 +234,16 @@ void TeamWindow::MessageReceived(BMessage* message) { switch (message->what) { + case MSG_STOP_ON_IMAGE_LOAD: + { + BMenuItem* item; + if (message->FindPointer("source", (void **)&item) != B_OK) + break; + bool enable = !item->IsMarked(); + fListener->SetStopOnImageLoadRequested(enable); + item->SetMarked(enable); + break; + } case MSG_TEAM_RESTART_REQUESTED: { fListener->TeamRestartRequested(); @@ -965,6 +975,10 @@ TeamWindow::_Init() MSG_TEAM_RESTART_REQUESTED), 'R', B_SHIFT_KEY); menu->AddItem(item); item->SetTarget(this); + item = new BMenuItem("Stop on image load", new BMessage( + MSG_STOP_ON_IMAGE_LOAD)); + item->SetTarget(this); + menu->AddItem(item); item = new BMenuItem("Close", new BMessage(B_QUIT_REQUESTED), 'W'); menu->AddItem(item);