hrev45831 adds 4 changesets to branch 'master' old head: 9cb70c69b648edb33b207373ef856424b96949b2 new head: 9a14c8a25d0830ca07334ad3339d3f3b1bb588e3 overview: http://cgit.haiku-os.org/haiku/log/?qt=range&q=9a14c8a+%5E9cb70c6 ---------------------------------------------------------------------------- ef2d649: ExceptionConfigWindow -> BreakConditionConfigWindow. Stop on image load removed from BreakpointsView, pending adding it to BreakConditionConfigWindow with some additional options. adc742c: Rework layout of BreakConditionConfigWindow. - Place exception-related settings into their own BBox. - Add another box for image load-related settings. This will eventually allow one to constrain the stop on image load option to limit itself to specific image names. Not yet functional. cae8421: Implement debugger infrastructure for stop on... ...image load with name matching. - Move the stop on image load setting to Team, along with a new setting governing the use of the (also newly added) name list. - Add accessors for maintaining the name list, and events/notifications for listeners with regards to changes to all stop on image load settings. - Adjust user interface listener hooks for additional functionality. 9a14c8a: Implement configuration for stop on image load with names. - BreakConditionConfigWindow is now a team listener so it can watch for the appropriate events. - Implement reading/maintaining state in response to the various notifications. - Implement adding/removing names and enabling/disabling the use of the name list. [ Rene Gollent <anevilyak@xxxxxxxxx> ] ---------------------------------------------------------------------------- 15 files changed, 828 insertions(+), 292 deletions(-) src/apps/debugger/Jamfile | 2 +- src/apps/debugger/MessageCodes.h | 9 +- src/apps/debugger/controllers/TeamDebugger.cpp | 76 +++- src/apps/debugger/controllers/TeamDebugger.h | 11 +- src/apps/debugger/model/Team.cpp | 123 ++++- src/apps/debugger/model/Team.h | 65 +++ src/apps/debugger/user_interface/UserInterface.h | 7 +- .../team_window/BreakConditionConfigWindow.cpp | 455 +++++++++++++++++++ .../gui/team_window/BreakConditionConfigWindow.h | 81 ++++ .../gui/team_window/BreakpointsView.cpp | 19 +- .../gui/team_window/BreakpointsView.h | 3 - .../gui/team_window/ExceptionConfigWindow.cpp | 180 -------- .../gui/team_window/ExceptionConfigWindow.h | 55 --- .../gui/team_window/TeamWindow.cpp | 28 +- .../user_interface/gui/team_window/TeamWindow.h | 6 +- ############################################################################ Commit: ef2d649d76723c303957b2d5da5abde668753741 URL: http://cgit.haiku-os.org/haiku/commit/?id=ef2d649 Author: Rene Gollent <anevilyak@xxxxxxxxx> Date: Sat Jul 6 16:53:37 2013 UTC ExceptionConfigWindow -> BreakConditionConfigWindow. Stop on image load removed from BreakpointsView, pending adding it to BreakConditionConfigWindow with some additional options. ---------------------------------------------------------------------------- diff --git a/src/apps/debugger/Jamfile b/src/apps/debugger/Jamfile index ed049c8..aaf52c5 100644 --- a/src/apps/debugger/Jamfile +++ b/src/apps/debugger/Jamfile @@ -242,10 +242,10 @@ Application Debugger : TeamsListView.cpp # user_interface/gui/team_window + BreakConditionConfigWindow.cpp BreakpointListView.cpp BreakpointsView.cpp ConsoleOutputView.cpp - ExceptionConfigWindow.cpp ImageFunctionsView.cpp ImageListView.cpp RegistersView.cpp diff --git a/src/apps/debugger/MessageCodes.h b/src/apps/debugger/MessageCodes.h index bf5284c..288eea8 100644 --- a/src/apps/debugger/MessageCodes.h +++ b/src/apps/debugger/MessageCodes.h @@ -54,8 +54,8 @@ enum { MSG_TEAM_RESTART_REQUESTED = 'trrq', MSG_SHOW_TEAMS_WINDOW = 'stsw', MSG_TEAMS_WINDOW_CLOSED = 'tswc', - MSG_SHOW_EXCEPTION_CONFIG_WINDOW = 'secw', - MSG_EXCEPTION_CONFIG_WINDOW_CLOSED = 'ecwc', + MSG_SHOW_BREAK_CONDITION_CONFIG_WINDOW = 'sbcc', + MSG_BREAK_CONDITION_CONFIG_WINDOW_CLOSED = 'bccw', MSG_START_NEW_TEAM = 'sttt', MSG_DEBUG_THIS_TEAM = 'dbtt', MSG_SHOW_INSPECTOR_WINDOW = 'sirw', diff --git a/src/apps/debugger/user_interface/gui/team_window/ExceptionConfigWindow.cpp b/src/apps/debugger/user_interface/gui/team_window/BreakConditionConfigWindow.cpp similarity index 80% rename from src/apps/debugger/user_interface/gui/team_window/ExceptionConfigWindow.cpp rename to src/apps/debugger/user_interface/gui/team_window/BreakConditionConfigWindow.cpp index d0a01a1..1406d10 100644 --- a/src/apps/debugger/user_interface/gui/team_window/ExceptionConfigWindow.cpp +++ b/src/apps/debugger/user_interface/gui/team_window/BreakConditionConfigWindow.cpp @@ -2,7 +2,7 @@ * Copyright 2013, Rene Gollent, rene@xxxxxxxxxxx. * Distributed under the terms of the MIT License. */ -#include "ExceptionConfigWindow.h" +#include "BreakConditionConfigWindow.h" #include <Button.h> #include <CheckBox.h> @@ -24,10 +24,10 @@ enum { }; -ExceptionConfigWindow::ExceptionConfigWindow(::Team* team, +BreakConditionConfigWindow::BreakConditionConfigWindow(::Team* team, UserInterfaceListener* listener, BHandler* target) : - BWindow(BRect(), "Configure Exceptions", B_FLOATING_WINDOW, + BWindow(BRect(), "Configure break conditions", B_FLOATING_WINDOW, B_AUTO_UPDATE_SIZE_LIMITS | B_CLOSE_ON_ESCAPE), fTeam(team), fListener(listener), @@ -39,18 +39,18 @@ ExceptionConfigWindow::ExceptionConfigWindow(::Team* team, } -ExceptionConfigWindow::~ExceptionConfigWindow() +BreakConditionConfigWindow::~BreakConditionConfigWindow() { - BMessenger(fTarget).SendMessage(MSG_EXCEPTION_CONFIG_WINDOW_CLOSED); + BMessenger(fTarget).SendMessage(MSG_BREAK_CONDITION_CONFIG_WINDOW_CLOSED); } -ExceptionConfigWindow* -ExceptionConfigWindow::Create(::Team* team, +BreakConditionConfigWindow* +BreakConditionConfigWindow::Create(::Team* team, UserInterfaceListener* listener, BHandler* target) { - ExceptionConfigWindow* self = new ExceptionConfigWindow(team, listener, - target); + BreakConditionConfigWindow* self = new BreakConditionConfigWindow( + team, listener, target); try { self->_Init(); @@ -64,7 +64,7 @@ ExceptionConfigWindow::Create(::Team* team, } void -ExceptionConfigWindow::MessageReceived(BMessage* message) +BreakConditionConfigWindow::MessageReceived(BMessage* message) { switch (message->what) { case MSG_STOP_ON_THROWN_EXCEPTION_CHANGED: @@ -87,7 +87,7 @@ ExceptionConfigWindow::MessageReceived(BMessage* message) void -ExceptionConfigWindow::Show() +BreakConditionConfigWindow::Show() { CenterOnScreen(); BWindow::Show(); @@ -95,7 +95,7 @@ ExceptionConfigWindow::Show() void -ExceptionConfigWindow::_Init() +BreakConditionConfigWindow::_Init() { BLayoutBuilder::Group<>(this, B_VERTICAL) .SetInsets(B_USE_DEFAULT_SPACING) @@ -140,7 +140,7 @@ ExceptionConfigWindow::_Init() void -ExceptionConfigWindow::_UpdateThrownBreakpoints(bool enable) +BreakConditionConfigWindow::_UpdateThrownBreakpoints(bool enable) { AutoLocker< ::Team> teamLocker(fTeam); for (ImageList::ConstIterator it = fTeam->Images().GetIterator(); @@ -161,7 +161,7 @@ ExceptionConfigWindow::_UpdateThrownBreakpoints(bool enable) status_t -ExceptionConfigWindow::_FindExceptionFunction(ImageDebugInfo* info, +BreakConditionConfigWindow::_FindExceptionFunction(ImageDebugInfo* info, target_addr_t& _foundAddress) const { if (info != NULL) { diff --git a/src/apps/debugger/user_interface/gui/team_window/ExceptionConfigWindow.h b/src/apps/debugger/user_interface/gui/team_window/BreakConditionConfigWindow.h similarity index 73% rename from src/apps/debugger/user_interface/gui/team_window/ExceptionConfigWindow.h rename to src/apps/debugger/user_interface/gui/team_window/BreakConditionConfigWindow.h index 2fc15ab..fc9eccd 100644 --- a/src/apps/debugger/user_interface/gui/team_window/ExceptionConfigWindow.h +++ b/src/apps/debugger/user_interface/gui/team_window/BreakConditionConfigWindow.h @@ -2,8 +2,8 @@ * Copyright 2013, Rene Gollent, rene@xxxxxxxxxxx. * Distributed under the terms of the MIT License. */ -#ifndef EXCEPTION_CONFIG_WINDOW_H -#define EXCEPTION_CONFIG_WINDOW_H +#ifndef BREAK_CONDITION_CONFIG_WINDOW_H +#define BREAK_CONDITION_CONFIG_WINDOW_H #include <Window.h> @@ -18,15 +18,15 @@ class Team; class UserInterfaceListener; -class ExceptionConfigWindow : public BWindow { +class BreakConditionConfigWindow : public BWindow { public: - ExceptionConfigWindow(::Team* team, + BreakConditionConfigWindow(::Team* team, UserInterfaceListener* listener, BHandler* target); - ~ExceptionConfigWindow(); + ~BreakConditionConfigWindow(); - static ExceptionConfigWindow* Create(::Team* team, + static BreakConditionConfigWindow* Create(::Team* team, UserInterfaceListener* listener, BHandler* target); // throws @@ -52,4 +52,4 @@ private: }; -#endif // EXCEPTION_CONFIG_WINDOW_H +#endif // BREAK_CONDITION_CONFIG_WINDOW_H diff --git a/src/apps/debugger/user_interface/gui/team_window/BreakpointsView.cpp b/src/apps/debugger/user_interface/gui/team_window/BreakpointsView.cpp index 1f047cf..f1eaacb 100644 --- a/src/apps/debugger/user_interface/gui/team_window/BreakpointsView.cpp +++ b/src/apps/debugger/user_interface/gui/team_window/BreakpointsView.cpp @@ -32,7 +32,6 @@ BreakpointsView::BreakpointsView(Team* team, Listener* listener) fConfigureExceptionsButton(NULL), fToggleBreakpointButton(NULL), fRemoveBreakpointButton(NULL), - fStopOnImageLoadCheckBox(NULL), fListener(listener) { SetName("Breakpoints"); @@ -97,13 +96,6 @@ BreakpointsView::MessageReceived(BMessage* message) _HandleBreakpointAction(message->what); break; - case MSG_STOP_ON_IMAGE_LOAD: - { - fListener->SetStopOnImageLoadRequested( - fStopOnImageLoadCheckBox->Value() == B_CONTROL_ON); - break; - } - default: BGroupView::MessageReceived(message); break; } @@ -116,7 +108,6 @@ BreakpointsView::AttachedToWindow() fConfigureExceptionsButton->SetTarget(Window()); fToggleBreakpointButton->SetTarget(this); fRemoveBreakpointButton->SetTarget(this); - fStopOnImageLoadCheckBox->SetTarget(this); } @@ -162,22 +153,16 @@ BreakpointsView::_Init() .AddGroup(B_HORIZONTAL, B_USE_SMALL_SPACING) .SetInsets(B_USE_SMALL_SPACING) .AddGlue() - .Add(fStopOnImageLoadCheckBox = new BCheckBox( - "Stop on image load")) - .AddStrut(5) .Add(fConfigureExceptionsButton = new BButton( - "Configure exceptions" B_UTF8_ELLIPSIS)) + "Configure break conditions" B_UTF8_ELLIPSIS)) .Add(fRemoveBreakpointButton = new BButton("Remove")) .Add(fToggleBreakpointButton = new BButton("Toggle")) .End(); fConfigureExceptionsButton->SetMessage( - new BMessage(MSG_SHOW_EXCEPTION_CONFIG_WINDOW)); + new BMessage(MSG_SHOW_BREAK_CONDITION_CONFIG_WINDOW)); fToggleBreakpointButton->SetMessage(new BMessage(MSG_ENABLE_BREAKPOINT)); fRemoveBreakpointButton->SetMessage(new BMessage(MSG_CLEAR_BREAKPOINT)); - fStopOnImageLoadCheckBox->SetMessage(new BMessage(MSG_STOP_ON_IMAGE_LOAD)); - fStopOnImageLoadCheckBox->SetExplicitAlignment( - BAlignment(B_ALIGN_HORIZONTAL_UNSET, B_ALIGN_VERTICAL_CENTER)); _UpdateButtons(); } diff --git a/src/apps/debugger/user_interface/gui/team_window/BreakpointsView.h b/src/apps/debugger/user_interface/gui/team_window/BreakpointsView.h index 45504df..ea10f93 100644 --- a/src/apps/debugger/user_interface/gui/team_window/BreakpointsView.h +++ b/src/apps/debugger/user_interface/gui/team_window/BreakpointsView.h @@ -58,7 +58,6 @@ private: BButton* fConfigureExceptionsButton; BButton* fToggleBreakpointButton; BButton* fRemoveBreakpointButton; - BCheckBox* fStopOnImageLoadCheckBox; Listener* fListener; }; @@ -81,8 +80,6 @@ public: bool enabled) = 0; virtual void ClearWatchpointRequested( Watchpoint* watchpoint) = 0; - - virtual void SetStopOnImageLoadRequested(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 99088fd..de8cda1 100644 --- a/src/apps/debugger/user_interface/gui/team_window/TeamWindow.cpp +++ b/src/apps/debugger/user_interface/gui/team_window/TeamWindow.cpp @@ -33,7 +33,7 @@ #include "ConsoleOutputView.h" #include "CpuState.h" #include "DisassembledCode.h" -#include "ExceptionConfigWindow.h" +#include "BreakConditionConfigWindow.h" #include "FileSourceCode.h" #include "GuiSettingsUtils.h" #include "GuiTeamUiSettings.h" @@ -128,7 +128,7 @@ TeamWindow::TeamWindow(::Team* team, UserInterfaceListener* listener) fImageSplitView(NULL), fThreadSplitView(NULL), fConsoleSplitView(NULL), - fExceptionConfigWindow(NULL), + fBreakConditionConfigWindow(NULL), fInspectorWindow(NULL), fFilePanel(NULL) { @@ -318,25 +318,26 @@ TeamWindow::MessageReceived(BMessage* message) break; } - case MSG_SHOW_EXCEPTION_CONFIG_WINDOW: + case MSG_SHOW_BREAK_CONDITION_CONFIG_WINDOW: { - if (fExceptionConfigWindow) { - fExceptionConfigWindow->Activate(true); + if (fBreakConditionConfigWindow) { + fBreakConditionConfigWindow->Activate(true); } else { try { - fExceptionConfigWindow = ExceptionConfigWindow::Create( + fBreakConditionConfigWindow + = BreakConditionConfigWindow::Create( fTeam, fListener, this); - if (fExceptionConfigWindow != NULL) - fExceptionConfigWindow->Show(); + if (fBreakConditionConfigWindow != NULL) + fBreakConditionConfigWindow->Show(); } catch (...) { // TODO: notify user } } break; } - case MSG_EXCEPTION_CONFIG_WINDOW_CLOSED: + case MSG_BREAK_CONDITION_CONFIG_WINDOW_CLOSED: { - fExceptionConfigWindow = NULL; + fBreakConditionConfigWindow = NULL; break; } case MSG_SHOW_WATCH_VARIABLE_PROMPT: @@ -769,13 +770,6 @@ TeamWindow::ClearWatchpointRequested(Watchpoint* watchpoint) void -TeamWindow::SetStopOnImageLoadRequested(bool enabled) -{ - fListener->SetStopOnImageLoadRequested(enabled); -} - - -void TeamWindow::ValueNodeValueRequested(CpuState* cpuState, ValueNodeContainer* container, ValueNode* valueNode) { diff --git a/src/apps/debugger/user_interface/gui/team_window/TeamWindow.h b/src/apps/debugger/user_interface/gui/team_window/TeamWindow.h index 9db8453..3ce6736 100644 --- a/src/apps/debugger/user_interface/gui/team_window/TeamWindow.h +++ b/src/apps/debugger/user_interface/gui/team_window/TeamWindow.h @@ -31,7 +31,7 @@ class BSplitView; class BStringView; class BTabView; class ConsoleOutputView; -class ExceptionConfigWindow; +class BreakConditionConfigWindow; class Image; class InspectorWindow; class RegistersView; @@ -104,8 +104,6 @@ private: virtual void ClearWatchpointRequested( Watchpoint* watchpoint); - virtual void SetStopOnImageLoadRequested(bool enabled); - // SourceView::Listener virtual void SetBreakpointRequested(target_addr_t address, @@ -208,7 +206,7 @@ private: BSplitView* fImageSplitView; BSplitView* fThreadSplitView; BSplitView* fConsoleSplitView; - ExceptionConfigWindow* fExceptionConfigWindow; + BreakConditionConfigWindow* fBreakConditionConfigWindow; InspectorWindow* fInspectorWindow; GuiTeamUiSettings fUiSettings; BFilePanel* fFilePanel; ############################################################################ Commit: adc742c508ecf09a80a1060b93d053b4edad3b4f URL: http://cgit.haiku-os.org/haiku/commit/?id=adc742c Author: Rene Gollent <anevilyak@xxxxxxxxx> Date: Sat Jul 6 17:34:51 2013 UTC Rework layout of BreakConditionConfigWindow. - Place exception-related settings into their own BBox. - Add another box for image load-related settings. This will eventually allow one to constrain the stop on image load option to limit itself to specific image names. Not yet functional. ---------------------------------------------------------------------------- diff --git a/src/apps/debugger/user_interface/gui/team_window/BreakConditionConfigWindow.cpp b/src/apps/debugger/user_interface/gui/team_window/BreakConditionConfigWindow.cpp index 1406d10..5a9afbb 100644 --- a/src/apps/debugger/user_interface/gui/team_window/BreakConditionConfigWindow.cpp +++ b/src/apps/debugger/user_interface/gui/team_window/BreakConditionConfigWindow.cpp @@ -4,9 +4,13 @@ */ #include "BreakConditionConfigWindow.h" +#include <Box.h> #include <Button.h> #include <CheckBox.h> #include <LayoutBuilder.h> +#include <ListView.h> +#include <MenuField.h> +#include <ScrollView.h> #include <AutoLocker.h> @@ -20,7 +24,12 @@ enum { MSG_STOP_ON_THROWN_EXCEPTION_CHANGED = 'stec', - MSG_STOP_ON_CAUGHT_EXCEPTION_CHANGED = 'scec' + MSG_STOP_ON_CAUGHT_EXCEPTION_CHANGED = 'scec', + MSG_SET_STOP_FOR_ALL_IMAGES = 'sfai', + MSG_SET_STOP_FOR_CUSTOM_IMAGES = 'sfci', + MSG_IMAGE_NAME_SELECTION_CHANGED = 'insc', + MSG_ADD_IMAGE_NAME = 'anin', + MSG_REMOVE_IMAGE_NAME = 'arin' }; @@ -33,6 +42,12 @@ BreakConditionConfigWindow::BreakConditionConfigWindow(::Team* team, fListener(listener), fExceptionThrown(NULL), fExceptionCaught(NULL), + fStopOnImageLoad(NULL), + fStopImageConstraints(NULL), + fStopImageNames(NULL), + fStopImageNameInput(NULL), + fAddImageNameButton(NULL), + fRemoveImageNameButton(NULL), fCloseButton(NULL), fTarget(target) { @@ -78,6 +93,43 @@ BreakConditionConfigWindow::MessageReceived(BMessage* message) { break; } + + case MSG_SET_STOP_FOR_ALL_IMAGES: + { + for (int32 i = 0; i < fStopImageNames->CountItems(); i++) + fStopImageNames->ItemAt(i)->SetEnabled(false); + fStopImageNameInput->SetEnabled(false); + fAddImageNameButton->SetEnabled(false); + fRemoveImageNameButton->SetEnabled(false); + break; + } + + case MSG_SET_STOP_FOR_CUSTOM_IMAGES: + { + for (int32 i = 0; i < fStopImageNames->CountItems(); i++) + fStopImageNames->ItemAt(i)->SetEnabled(true); + fStopImageNameInput->SetEnabled(true); + fAddImageNameButton->SetEnabled( + fStopImageNameInput->TextView()->TextLength() > 0); + fRemoveImageNameButton->SetEnabled( + fStopImageNames->CurrentSelection() >= 0); + break; + } + + case MSG_IMAGE_NAME_SELECTION_CHANGED: + { + fRemoveImageNameButton->SetEnabled( + fStopImageNames->CurrentSelection() >= 0); + break; + } + + case MSG_STOP_ON_IMAGE_LOAD: + { + fListener->SetStopOnImageLoadRequested( + fStopOnImageLoad->Value() == B_CONTROL_ON); + break; + } + default: BWindow::MessageReceived(message); break; @@ -97,28 +149,84 @@ BreakConditionConfigWindow::Show() void BreakConditionConfigWindow::_Init() { + BBox* exceptionSettingsBox = new BBox("exceptionBox"); + exceptionSettingsBox->SetLabel("Exceptions"); + exceptionSettingsBox->AddChild(BLayoutBuilder::Group<>() + .AddGroup(B_VERTICAL) + .SetInsets(B_USE_DEFAULT_SPACING) + .Add(fExceptionThrown = new BCheckBox("exceptionThrown", + "Stop when an exception is thrown", + new BMessage(MSG_STOP_ON_THROWN_EXCEPTION_CHANGED))) + .Add(fExceptionCaught = new BCheckBox("exceptionCaught", + "Stop when an exception is caught", + new BMessage(MSG_STOP_ON_CAUGHT_EXCEPTION_CHANGED))) + .End() + .View()); + + fExceptionThrown->SetTarget(this); + fExceptionCaught->SetTarget(this); + + // TODO: enable once implemented + fExceptionCaught->SetEnabled(false); + + + BBox* imageSettingsBox = new BBox("imageBox"); + imageSettingsBox->SetLabel("Images"); + BMenu* stopImageMenu = new BMenu("stopImageTypesMenu"); + + stopImageMenu->AddItem(new BMenuItem("All", + new BMessage(MSG_SET_STOP_FOR_ALL_IMAGES))); + stopImageMenu->AddItem(new BMenuItem("Custom", + new BMessage(MSG_SET_STOP_FOR_CUSTOM_IMAGES))); + + BListView* fStopImageNames = new BListView("customImageList", + B_MULTIPLE_SELECTION_LIST); + fStopImageNames->SetSelectionMessage( + new BMessage(MSG_IMAGE_NAME_SELECTION_CHANGED)); + + imageSettingsBox->AddChild(BLayoutBuilder::Group<>() + .AddGroup(B_VERTICAL) + .SetInsets(B_USE_DEFAULT_SPACING) + .Add(fStopOnImageLoad = new BCheckBox("stopOnImage", + "Stop when an image is loaded", + new BMessage(MSG_STOP_ON_IMAGE_LOAD))) + .Add(fStopImageConstraints = new BMenuField( + "stopTypes", "Types:", stopImageMenu)) + .Add(new BScrollView("stopImageScroll", fStopImageNames, + 0, false, true)) + .Add(fStopImageNameInput = new BTextControl("stopImageName", + "Image:", NULL, NULL)) + .AddGroup(B_HORIZONTAL) + .AddGlue() + .Add(fAddImageNameButton = new BButton("Add", + new BMessage(MSG_ADD_IMAGE_NAME))) + .Add(fRemoveImageNameButton = new BButton("Remove", + new BMessage(MSG_REMOVE_IMAGE_NAME))) + .End() + .End() + .View()); + + font_height fontHeight; + be_plain_font->GetHeight(&fontHeight); + float minListHeight = 5 * (fontHeight.ascent + fontHeight.descent + + fontHeight.leading); + fStopImageNames->SetExplicitMinSize(BSize(B_SIZE_UNSET, minListHeight)); + BLayoutBuilder::Group<>(this, B_VERTICAL) .SetInsets(B_USE_DEFAULT_SPACING) - .Add(fExceptionThrown = new BCheckBox("exceptionThrown", - "Stop when an exception is thrown", new BMessage( - MSG_STOP_ON_THROWN_EXCEPTION_CHANGED))) - .Add(fExceptionCaught = new BCheckBox("exceptionCaught", - "Stop when an exception is caught", new BMessage( - MSG_STOP_ON_CAUGHT_EXCEPTION_CHANGED))) - .AddGroup(B_HORIZONTAL, 4.0f) + .Add(exceptionSettingsBox) + .Add(imageSettingsBox) + .AddGroup(B_HORIZONTAL) .AddGlue() .Add(fCloseButton = new BButton("Close", new BMessage( B_QUIT_REQUESTED))) .End(); - fExceptionThrown->SetTarget(this); - fExceptionCaught->SetTarget(this); - - // TODO: enable once implemented - fExceptionCaught->SetEnabled(false); fCloseButton->SetTarget(this); - + stopImageMenu->SetTargetForItems(this); + stopImageMenu->SetLabelFromMarked(true); + stopImageMenu->ItemAt(0L)->SetMarked(true); // check if the exception breakpoints are already installed AutoLocker< ::Team> teamLocker(fTeam); diff --git a/src/apps/debugger/user_interface/gui/team_window/BreakConditionConfigWindow.h b/src/apps/debugger/user_interface/gui/team_window/BreakConditionConfigWindow.h index fc9eccd..3c51bc8 100644 --- a/src/apps/debugger/user_interface/gui/team_window/BreakConditionConfigWindow.h +++ b/src/apps/debugger/user_interface/gui/team_window/BreakConditionConfigWindow.h @@ -13,6 +13,9 @@ class BButton; class BCheckBox; +class BListView; +class BMenuField; +class BTextControl; class ImageDebugInfo; class Team; class UserInterfaceListener; @@ -47,6 +50,12 @@ private: UserInterfaceListener* fListener; BCheckBox* fExceptionThrown; BCheckBox* fExceptionCaught; + BCheckBox* fStopOnImageLoad; + BMenuField* fStopImageConstraints; + BListView* fStopImageNames; + BTextControl* fStopImageNameInput; + BButton* fAddImageNameButton; + BButton* fRemoveImageNameButton; BButton* fCloseButton; BHandler* fTarget; }; ############################################################################ Commit: cae8421db8b96d66de93ee65fa7872bbf85e689e URL: http://cgit.haiku-os.org/haiku/commit/?id=cae8421 Author: Rene Gollent <anevilyak@xxxxxxxxx> Date: Sun Jul 7 04:31:22 2013 UTC Implement debugger infrastructure for stop on... ...image load with name matching. - Move the stop on image load setting to Team, along with a new setting governing the use of the (also newly added) name list. - Add accessors for maintaining the name list, and events/notifications for listeners with regards to changes to all stop on image load settings. - Adjust user interface listener hooks for additional functionality. ---------------------------------------------------------------------------- diff --git a/src/apps/debugger/MessageCodes.h b/src/apps/debugger/MessageCodes.h index 288eea8..e0efd00 100644 --- a/src/apps/debugger/MessageCodes.h +++ b/src/apps/debugger/MessageCodes.h @@ -23,12 +23,17 @@ enum { MSG_ENABLE_WATCHPOINT = 'ewpt', MSG_DISABLE_WATCHPOINT = 'dwpt', MSG_STOP_ON_IMAGE_LOAD = 'tsil', + MSG_ADD_STOP_IMAGE_NAME = 'asin', + MSG_REMOVE_STOP_IMAGE_NAME = 'rsin', MSG_THREAD_STATE_CHANGED = 'tsch', MSG_THREAD_CPU_STATE_CHANGED = 'tcsc', MSG_THREAD_STACK_TRACE_CHANGED = 'tstc', MSG_STACK_FRAME_VALUE_RETRIEVED = 'sfvr', MSG_IMAGE_DEBUG_INFO_CHANGED = 'idic', + MSG_STOP_IMAGE_SETTINGS_CHANGED = 'sisc', + MSG_STOP_IMAGE_NAME_ADDED = 'sina', + MSG_STOP_IMAGE_NAME_REMOVED = 'sinr', MSG_CONSOLE_OUTPUT_RECEIVED = 'core', MSG_IMAGE_FILE_CHANGED = 'ifch', MSG_FUNCTION_SOURCE_CODE_CHANGED = 'fnsc', diff --git a/src/apps/debugger/controllers/TeamDebugger.cpp b/src/apps/debugger/controllers/TeamDebugger.cpp index 449eb874..4e7b62b 100644 --- a/src/apps/debugger/controllers/TeamDebugger.cpp +++ b/src/apps/debugger/controllers/TeamDebugger.cpp @@ -14,6 +14,7 @@ #include <Entry.h> #include <Message.h> +#include <StringList.h> #include <AutoDeleter.h> #include <AutoLocker.h> @@ -223,8 +224,7 @@ TeamDebugger::TeamDebugger(Listener* listener, UserInterface* userInterface, fTerminating(false), fKillTeamOnQuit(false), fCommandLineArgc(0), - fCommandLineArgv(NULL), - fStopOnImageLoad(false) + fCommandLineArgv(NULL) { fUserInterface->AcquireReference(); } @@ -608,13 +608,39 @@ TeamDebugger::MessageReceived(BMessage* message) case MSG_STOP_ON_IMAGE_LOAD: { bool enabled; + bool useNames; if (message->FindBool("enabled", &enabled) != B_OK) break; - fStopOnImageLoad = enabled; + if (message->FindBool("useNames", &useNames) != B_OK) + break; + + AutoLocker< ::Team> teamLocker(fTeam); + fTeam->SetStopOnImageLoad(enabled, useNames); break; } + case MSG_ADD_STOP_IMAGE_NAME: + { + BString imageName; + if (message->FindString("name", &imageName) != B_OK) + break; + + AutoLocker< ::Team> teamLocker(fTeam); + fTeam->AddStopImageName(imageName); + break; + } + + case MSG_REMOVE_STOP_IMAGE_NAME: + { + BString imageName; + if (message->FindString("name", &imageName) != B_OK) + break; + + AutoLocker< ::Team> teamLocker(fTeam); + fTeam->RemoveStopImageName(imageName); + } + case MSG_SET_WATCHPOINT: case MSG_CLEAR_WATCHPOINT: { @@ -899,10 +925,29 @@ TeamDebugger::ClearBreakpointRequested(target_addr_t address) void -TeamDebugger::SetStopOnImageLoadRequested(bool enabled) +TeamDebugger::SetStopOnImageLoadRequested(bool enabled, bool useImageNames) { BMessage message(MSG_STOP_ON_IMAGE_LOAD); message.AddBool("enabled", enabled); + message.AddBool("useNames", useImageNames); + PostMessage(&message); +} + + +void +TeamDebugger::AddStopImageNameRequested(const char* name) +{ + BMessage message(MSG_ADD_STOP_IMAGE_NAME); + message.AddString("name", name); + PostMessage(&message); +} + + +void +TeamDebugger::RemoveStopImageNameRequested(const char* name) +{ + BMessage message(MSG_REMOVE_STOP_IMAGE_NAME); + message.AddString("name", name); PostMessage(&message); } @@ -1525,13 +1570,30 @@ TeamDebugger::_HandleImageDebugInfoChanged(image_id imageID) if (thread != NULL) { fImageInfoPendingThreads->Remove(thread); ObjectDeleter<ImageInfoPendingThread> threadDeleter(thread); - if (fStopOnImageLoad) { + locker.Lock(); + if (fTeam->StopOnImageLoad()) { ThreadHandler* handler = _GetThreadHandler(thread->ThreadID()); BReference<ThreadHandler> handlerReference(handler); - if (handler != NULL && handler->HandleThreadDebugged(NULL)) + bool stop = true; + if (fTeam->StopImageNameListEnabled()) { + const BStringList& nameList = fTeam->StopImageNames(); + const BString& imageName = image->Name(); + // only match on the image filename itself + const char* rawImageName = imageName.String() + + imageName.FindLast('/') + 1; + stop = nameList.HasString(rawImageName); + } + + locker.Unlock(); + + if (stop && handler != NULL + && handler->HandleThreadDebugged(NULL)) { return; - } + } + } else + locker.Unlock(); + fDebuggerInterface->ContinueThread(thread->ThreadID()); } } diff --git a/src/apps/debugger/controllers/TeamDebugger.h b/src/apps/debugger/controllers/TeamDebugger.h index b869ece..c91fc58 100644 --- a/src/apps/debugger/controllers/TeamDebugger.h +++ b/src/apps/debugger/controllers/TeamDebugger.h @@ -70,6 +70,7 @@ private: ValueNode* valueNode); virtual void ThreadActionRequested(thread_id threadID, uint32 action, target_addr_t address); + virtual void SetBreakpointRequested(target_addr_t address, bool enabled, bool hidden = false); virtual void SetBreakpointEnabledRequested( @@ -78,7 +79,14 @@ private: virtual void ClearBreakpointRequested(target_addr_t address); virtual void ClearBreakpointRequested( UserBreakpoint* breakpoint); - virtual void SetStopOnImageLoadRequested(bool enabled); + + virtual void SetStopOnImageLoadRequested(bool enabled, + bool useImageNames); + virtual void AddStopImageNameRequested( + const char* name); + virtual void RemoveStopImageNameRequested( + const char* name); + virtual void SetWatchpointRequested(target_addr_t address, uint32 type, int32 length, bool enabled); virtual void SetWatchpointEnabledRequested( @@ -207,7 +215,6 @@ private: TeamSettings fTeamSettings; int fCommandLineArgc; const char** fCommandLineArgv; - bool fStopOnImageLoad; }; diff --git a/src/apps/debugger/model/Team.cpp b/src/apps/debugger/model/Team.cpp index 016da1c..47ca84d 100644 --- a/src/apps/debugger/model/Team.cpp +++ b/src/apps/debugger/model/Team.cpp @@ -7,8 +7,6 @@ #include "Team.h" -#include <stdio.h> - #include <new> #include <AutoLocker.h> @@ -79,7 +77,9 @@ Team::Team(team_id teamID, TeamMemory* teamMemory, Architecture* architecture, fTeamMemory(teamMemory), fTypeInformation(typeInformation), fArchitecture(architecture), - fDebugInfo(debugInfo) + fDebugInfo(debugInfo), + fStopOnImageLoad(false), + fStopImageNameListEnabled(false) { fDebugInfo->AcquireReference(); } @@ -275,6 +275,43 @@ Team::Images() const bool +Team::AddStopImageName(const BString& name) +{ + if (!fStopImageNames.Add(name)) + return false; + + fStopImageNames.Sort(); + + NotifyStopImageNameAdded(name); + return true; +} + + +void +Team::RemoveStopImageName(const BString& name) +{ + fStopImageNames.Remove(name); + NotifyStopImageNameRemoved(name); +} + + +void +Team::SetStopOnImageLoad(bool enabled, bool useImageNameList) +{ + fStopOnImageLoad = enabled; + fStopImageNameListEnabled = useImageNameList; + NotifyStopOnImageLoadChanged(enabled, useImageNameList); +} + + +const BStringList& +Team::StopImageNames() const +{ + return fStopImageNames; +} + + +bool Team::AddBreakpoint(Breakpoint* breakpoint) { if (fBreakpoints.BinaryInsert(breakpoint, &Breakpoint::CompareBreakpoints)) @@ -615,6 +652,41 @@ Team::NotifyImageDebugInfoChanged(Image* image) void +Team::NotifyStopOnImageLoadChanged(bool enabled, bool useImageNameList) +{ + for (ListenerList::Iterator it = fListeners.GetIterator(); + Listener* listener = it.Next();) { + listener->StopOnImageLoadSettingsChanged( + ImageLoadEvent(TEAM_EVENT_IMAGE_LOAD_SETTINGS_CHANGED, this, + enabled, useImageNameList)); + } +} + + +void +Team::NotifyStopImageNameAdded(const BString& name) +{ + for (ListenerList::Iterator it = fListeners.GetIterator(); + Listener* listener = it.Next();) { + listener->StopOnImageLoadNameAdded( + ImageLoadNameEvent(TEAM_EVENT_IMAGE_LOAD_NAME_ADDED, this, name)); + } +} + + +void +Team::NotifyStopImageNameRemoved(const BString& name) +{ + for (ListenerList::Iterator it = fListeners.GetIterator(); + Listener* listener = it.Next();) { + listener->StopOnImageLoadNameRemoved( + ImageLoadNameEvent(TEAM_EVENT_IMAGE_LOAD_NAME_REMOVED, this, + name)); + } +} + + +void Team::NotifyConsoleOutputReceived(int32 fd, const BString& output) { for (ListenerList::Iterator it = fListeners.GetIterator(); @@ -732,6 +804,31 @@ Team::ImageEvent::ImageEvent(uint32 type, Image* image) } +// #pragma mark - ImageLoadEvent + + +Team::ImageLoadEvent::ImageLoadEvent(uint32 type, Team* team, + bool stopOnImageLoad, bool stopImageNameListEnabled) + : + Event(type, team), + fStopOnImageLoad(stopOnImageLoad), + fStopImageNameListEnabled(stopImageNameListEnabled) +{ +} + + +// #pragma mark - ImageLoadNameEvent + + +Team::ImageLoadNameEvent::ImageLoadNameEvent(uint32 type, Team* team, + const BString& name) + : + Event(type, team), + fImageName(name) +{ +} + + // #pragma mark - BreakpointEvent @@ -850,6 +947,26 @@ Team::Listener::ImageDebugInfoChanged(const Team::ImageEvent& event) void +Team::Listener::StopOnImageLoadSettingsChanged( + const Team::ImageLoadEvent& event) +{ +} + + +void +Team::Listener::StopOnImageLoadNameAdded(const Team::ImageLoadNameEvent& event) +{ +} + + +void +Team::Listener::StopOnImageLoadNameRemoved( + const Team::ImageLoadNameEvent& event) +{ +} + + +void Team::Listener::ConsoleOutputReceived(const Team::ConsoleOutputEvent& event) { } diff --git a/src/apps/debugger/model/Team.h b/src/apps/debugger/model/Team.h index 98a2fb2..5428084 100644 --- a/src/apps/debugger/model/Team.h +++ b/src/apps/debugger/model/Team.h @@ -8,6 +8,7 @@ #include <Locker.h> +#include <StringList.h> #include <ObjectList.h> @@ -33,6 +34,10 @@ enum { TEAM_EVENT_IMAGE_DEBUG_INFO_CHANGED, + TEAM_EVENT_IMAGE_LOAD_SETTINGS_CHANGED, + TEAM_EVENT_IMAGE_LOAD_NAME_ADDED, + TEAM_EVENT_IMAGE_LOAD_NAME_REMOVED, + TEAM_EVENT_CONSOLE_OUTPUT_RECEIVED, TEAM_EVENT_BREAKPOINT_ADDED, @@ -50,6 +55,7 @@ enum { class Architecture; class Breakpoint; +class BStringList; class Function; class FunctionID; class FunctionInstance; @@ -70,6 +76,8 @@ public: class ConsoleOutputEvent; class DebugReportEvent; class ImageEvent; + class ImageLoadEvent; + class ImageLoadNameEvent; class ThreadEvent; class UserBreakpointEvent; class WatchpointEvent; @@ -117,6 +125,17 @@ public: Image* ImageByAddress(target_addr_t address) const; const ImageList& Images() const; + bool AddStopImageName(const BString& name); + void RemoveStopImageName(const BString& name); + const BStringList& StopImageNames() const; + + void SetStopOnImageLoad(bool enabled, + bool useImageNameList); + bool StopOnImageLoad() const + { return fStopOnImageLoad; } + bool StopImageNameListEnabled() const + { return fStopImageNameListEnabled; } + bool AddBreakpoint(Breakpoint* breakpoint); // takes over reference (also on error) void RemoveBreakpoint(Breakpoint* breakpoint); @@ -183,6 +202,13 @@ public: // service methods for Image void NotifyImageDebugInfoChanged(Image* image); + // service methods for Image load settings + void NotifyStopOnImageLoadChanged(bool enabled, + bool useImageNameList); + void NotifyStopImageNameAdded(const BString& name); + void NotifyStopImageNameRemoved( + const BString& name); + // service methods for console output void NotifyConsoleOutputReceived( int32 fd, const BString& output); @@ -223,6 +249,9 @@ private: BString fName; ThreadList fThreads; ImageList fImages; + bool fStopOnImageLoad; + bool fStopImageNameListEnabled; + BStringList fStopImageNames; BreakpointList fBreakpoints; WatchpointList fWatchpoints; UserBreakpointList fUserBreakpoints; @@ -265,6 +294,35 @@ protected: }; +class Team::ImageLoadEvent : public Event { +public: + ImageLoadEvent(uint32 type, Team* team, + bool stopOnImageLoad, + bool stopImageNameListEnabled); + + bool StopOnImageLoad() const + { return fStopOnImageLoad; } + bool StopImageNameListEnabled() const + { return fStopImageNameListEnabled; } + +private: + bool fStopOnImageLoad; + bool fStopImageNameListEnabled; +}; + + +class Team::ImageLoadNameEvent : public Event { +public: + ImageLoadNameEvent(uint32 type, Team* team, + const BString& name); + + const BString& ImageName() const { return fImageName; } + +private: + BString fImageName; +}; + + class Team::BreakpointEvent : public Event { public: BreakpointEvent(uint32 type, Team* team, @@ -346,6 +404,13 @@ public: virtual void ImageDebugInfoChanged( const Team::ImageEvent& event); + virtual void StopOnImageLoadSettingsChanged( + const Team::ImageLoadEvent& event); + virtual void StopOnImageLoadNameAdded( + const Team::ImageLoadNameEvent& event); + virtual void StopOnImageLoadNameRemoved( + const Team::ImageLoadNameEvent& event); + virtual void ConsoleOutputReceived( const Team::ConsoleOutputEvent& event); diff --git a/src/apps/debugger/user_interface/UserInterface.h b/src/apps/debugger/user_interface/UserInterface.h index 5473156..cb00459 100644 --- a/src/apps/debugger/user_interface/UserInterface.h +++ b/src/apps/debugger/user_interface/UserInterface.h @@ -106,7 +106,12 @@ public: UserBreakpoint* breakpoint) = 0; // TODO: Consolidate those! - virtual void SetStopOnImageLoadRequested(bool enabled) = 0; + virtual void SetStopOnImageLoadRequested(bool enabled, + bool useImageNames) = 0; + virtual void AddStopImageNameRequested( + const char* name) = 0; + virtual void RemoveStopImageNameRequested( + const char* name) = 0; virtual void SetWatchpointRequested(target_addr_t address, uint32 type, int32 length, ############################################################################ Revision: hrev45831 Commit: 9a14c8a25d0830ca07334ad3339d3f3b1bb588e3 URL: http://cgit.haiku-os.org/haiku/commit/?id=9a14c8a Author: Rene Gollent <anevilyak@xxxxxxxxx> Date: Sun Jul 7 04:34:12 2013 UTC Implement configuration for stop on image load with names. - BreakConditionConfigWindow is now a team listener so it can watch for the appropriate events. - Implement reading/maintaining state in response to the various notifications. - Implement adding/removing names and enabling/disabling the use of the name list. ---------------------------------------------------------------------------- diff --git a/src/apps/debugger/user_interface/gui/team_window/BreakConditionConfigWindow.cpp b/src/apps/debugger/user_interface/gui/team_window/BreakConditionConfigWindow.cpp index 5a9afbb..a6428f2 100644 --- a/src/apps/debugger/user_interface/gui/team_window/BreakConditionConfigWindow.cpp +++ b/src/apps/debugger/user_interface/gui/team_window/BreakConditionConfigWindow.cpp @@ -12,6 +12,7 @@ #include <MenuField.h> #include <ScrollView.h> +#include <AutoDeleter.h> #include <AutoLocker.h> #include "FunctionInstance.h" @@ -33,6 +34,22 @@ enum { }; +static int SortStringItems(const void* a, const void* b) +{ + BStringItem* item1 = *(BStringItem**)a; + BStringItem* item2 = *(BStringItem**)b; + + return strcmp(item1->Text(), item2->Text()); +} + + +static bool UpdateItemState(BListItem* item, void* enabled) +{ + item->SetEnabled((bool)enabled); + return false; +} + + BreakConditionConfigWindow::BreakConditionConfigWindow(::Team* team, UserInterfaceListener* listener, BHandler* target) : @@ -48,14 +65,17 @@ BreakConditionConfigWindow::BreakConditionConfigWindow(::Team* team, fStopImageNameInput(NULL), fAddImageNameButton(NULL), fRemoveImageNameButton(NULL), + fUseCustomImages(false), fCloseButton(NULL), fTarget(target) { + fTeam->AddListener(this); } BreakConditionConfigWindow::~BreakConditionConfigWindow() { + fTeam->RemoveListener(this); BMessenger(fTarget).SendMessage(MSG_BREAK_CONDITION_CONFIG_WINDOW_CLOSED); } @@ -96,28 +116,27 @@ BreakConditionConfigWindow::MessageReceived(BMessage* message) case MSG_SET_STOP_FOR_ALL_IMAGES: { - for (int32 i = 0; i < fStopImageNames->CountItems(); i++) - fStopImageNames->ItemAt(i)->SetEnabled(false); - fStopImageNameInput->SetEnabled(false); - fAddImageNameButton->SetEnabled(false); - fRemoveImageNameButton->SetEnabled(false); + fUseCustomImages = false; + fListener->SetStopOnImageLoadRequested( + fStopOnImageLoad->Value() == B_CONTROL_ON, + fUseCustomImages); break; } case MSG_SET_STOP_FOR_CUSTOM_IMAGES: { - for (int32 i = 0; i < fStopImageNames->CountItems(); i++) - fStopImageNames->ItemAt(i)->SetEnabled(true); - fStopImageNameInput->SetEnabled(true); - fAddImageNameButton->SetEnabled( - fStopImageNameInput->TextView()->TextLength() > 0); - fRemoveImageNameButton->SetEnabled( - fStopImageNames->CurrentSelection() >= 0); + fUseCustomImages = true; + fListener->SetStopOnImageLoadRequested( + fStopOnImageLoad->Value() == B_CONTROL_ON, + fUseCustomImages); break; } case MSG_IMAGE_NAME_SELECTION_CHANGED: { + if (!fUseCustomImages) + break; + fRemoveImageNameButton->SetEnabled( fStopImageNames->CurrentSelection() >= 0); break; @@ -126,10 +145,79 @@ BreakConditionConfigWindow::MessageReceived(BMessage* message) case MSG_STOP_ON_IMAGE_LOAD: { fListener->SetStopOnImageLoadRequested( - fStopOnImageLoad->Value() == B_CONTROL_ON); + fStopOnImageLoad->Value() == B_CONTROL_ON, + fUseCustomImages); + break; + } + + case MSG_STOP_IMAGE_SETTINGS_CHANGED: + { + _UpdateStopImageButtons(); + break; + } + + case MSG_ADD_IMAGE_NAME: + { + BString imageName(fStopImageNameInput->Text()); + AutoLocker< ::Team> teamLocker(fTeam); + if (fTeam->StopImageNames().HasString(imageName)) + break; + + fStopImageNameInput->SetText(""); + fListener->AddStopImageNameRequested(imageName.String()); break; } + case MSG_STOP_IMAGE_NAME_ADDED: + { + const char* imageName; + if (message->FindString("name", &imageName) != B_OK) + break; + + BStringItem* item = new(std::nothrow) BStringItem(imageName); + if (item == NULL) + break; + + ObjectDeleter<BStringItem> itemDeleter(item); + if (!fStopImageNames->AddItem(item)) { + break; + } + itemDeleter.Detach(); + fStopImageNames->SortItems(SortStringItems); + break; + } + + case MSG_REMOVE_IMAGE_NAME: + { + BStringItem* item; + int32 selectedIndex; + AutoLocker< ::Team> teamLocker(fTeam); + int32 i = 0; + while ((selectedIndex = fStopImageNames->CurrentSelection(i++)) + >= 0) { + item = (BStringItem*)fStopImageNames->ItemAt(selectedIndex); + fListener->RemoveStopImageNameRequested(item->Text()); + } + break; + } + + case MSG_STOP_IMAGE_NAME_REMOVED: + { + const char* imageName; + if (message->FindString("name", &imageName) != B_OK) + break; + + for (int32 i = 0; i < fStopImageNames->CountItems(); i++) { + BStringItem* item = (BStringItem*)fStopImageNames->ItemAt(i); + if (strcmp(item->Text(), imageName) == 0) { + fStopImageNames->RemoveItem(i); + delete item; + } + } + break; + } + + default: BWindow::MessageReceived(message); break; @@ -147,6 +235,37 @@ BreakConditionConfigWindow::Show() void +BreakConditionConfigWindow::StopOnImageLoadSettingsChanged( + const Team::ImageLoadEvent& event) +{ + BMessage message(MSG_STOP_IMAGE_SETTINGS_CHANGED); + message.AddBool("enabled", event.StopOnImageLoad()); + message.AddBool("useNameList", event.StopImageNameListEnabled()); + PostMessage(&message); +} + + +void +BreakConditionConfigWindow::StopOnImageLoadNameAdded( + const Team::ImageLoadNameEvent& event) +{ + BMessage message(MSG_STOP_IMAGE_NAME_ADDED); + message.AddString("name", event.ImageName()); + PostMessage(&message); +} + + +void +BreakConditionConfigWindow::StopOnImageLoadNameRemoved( + const Team::ImageLoadNameEvent& event) +{ + BMessage message(MSG_STOP_IMAGE_NAME_REMOVED); + message.AddString("name", event.ImageName()); + PostMessage(&message); +} + + +void BreakConditionConfigWindow::_Init() { BBox* exceptionSettingsBox = new BBox("exceptionBox"); @@ -179,7 +298,7 @@ BreakConditionConfigWindow::_Init() stopImageMenu->AddItem(new BMenuItem("Custom", new BMessage(MSG_SET_STOP_FOR_CUSTOM_IMAGES))); - BListView* fStopImageNames = new BListView("customImageList", + fStopImageNames = new BListView("customImageList", B_MULTIPLE_SELECTION_LIST); fStopImageNames->SetSelectionMessage( new BMessage(MSG_IMAGE_NAME_SELECTION_CHANGED)); @@ -226,24 +345,11 @@ BreakConditionConfigWindow::_Init() fCloseButton->SetTarget(this); stopImageMenu->SetTargetForItems(this); stopImageMenu->SetLabelFromMarked(true); - stopImageMenu->ItemAt(0L)->SetMarked(true); - // check if the exception breakpoints are already installed AutoLocker< ::Team> teamLocker(fTeam); - for (ImageList::ConstIterator it = fTeam->Images().GetIterator(); - it.HasNext();) { - Image* image = it.Next(); + _UpdateStopImageState(); + _UpdateExceptionState(); - ImageDebugInfo* info = image->GetImageDebugInfo(); - target_addr_t address; - if (_FindExceptionFunction(info, address) != B_OK) - continue; - - if (fTeam->BreakpointAtAddress(address) != NULL) { - fExceptionThrown->SetValue(B_CONTROL_ON); - break; - } - } } @@ -286,3 +392,64 @@ BreakConditionConfigWindow::_FindExceptionFunction(ImageDebugInfo* info, return B_NAME_NOT_FOUND; } + + +void +BreakConditionConfigWindow::_UpdateExceptionState() +{ + // check if the exception breakpoints are already installed + for (ImageList::ConstIterator it = fTeam->Images().GetIterator(); + it.HasNext();) { + Image* image = it.Next(); + + ImageDebugInfo* info = image->GetImageDebugInfo(); + target_addr_t address; + if (_FindExceptionFunction(info, address) != B_OK) + continue; + + if (fTeam->BreakpointAtAddress(address) != NULL) { + fExceptionThrown->SetValue(B_CONTROL_ON); + break; + } + } +} + + +void +BreakConditionConfigWindow::_UpdateStopImageState() +{ + fUseCustomImages = fTeam->StopImageNameListEnabled(); + fStopImageConstraints->Menu()->ItemAt(0)->SetMarked(!fUseCustomImages); + fStopImageConstraints->Menu()->ItemAt(1)->SetMarked(fUseCustomImages); + + fStopImageNames->MakeEmpty(); + const BStringList& imageNames = fTeam->StopImageNames(); + for (int32 i = 0; i < imageNames.CountStrings(); i++) { + BStringItem* item = new(std::nothrow) BStringItem( + imageNames.StringAt(i)); + if (item == NULL) + return; + item->SetEnabled(fUseCustomImages); + ObjectDeleter<BStringItem> itemDeleter(item); + if (!fStopImageNames->AddItem(item)) + return; + itemDeleter.Detach(); + } + + _UpdateStopImageButtons(); +} + + +void +BreakConditionConfigWindow::_UpdateStopImageButtons() +{ + bool stopOnImageLoad = fTeam->StopOnImageLoad(); + fStopOnImageLoad->SetValue(stopOnImageLoad ? B_CONTROL_ON : B_CONTROL_OFF); + bool enabled = stopOnImageLoad && fUseCustomImages; + fStopImageConstraints->SetEnabled(stopOnImageLoad); + fAddImageNameButton->SetEnabled(enabled); + fRemoveImageNameButton->SetEnabled(enabled + && fStopImageNames->CurrentSelection() >= 0); + fStopImageNames->DoForEach(UpdateItemState, (void*)enabled); + fStopImageNameInput->TextView()->MakeEditable(enabled); +} diff --git a/src/apps/debugger/user_interface/gui/team_window/BreakConditionConfigWindow.h b/src/apps/debugger/user_interface/gui/team_window/BreakConditionConfigWindow.h index 3c51bc8..e147893 100644 --- a/src/apps/debugger/user_interface/gui/team_window/BreakConditionConfigWindow.h +++ b/src/apps/debugger/user_interface/gui/team_window/BreakConditionConfigWindow.h @@ -8,6 +8,8 @@ #include <Window.h> +#include "Team.h" + #include "types/Types.h" @@ -17,11 +19,10 @@ class BListView; class BMenuField; class BTextControl; class ImageDebugInfo; -class Team; class UserInterfaceListener; -class BreakConditionConfigWindow : public BWindow { +class BreakConditionConfigWindow : public BWindow, private Team::Listener { public: BreakConditionConfigWindow(::Team* team, UserInterfaceListener* listener, @@ -38,12 +39,27 @@ public: virtual void Show(); + // Team::Listener + virtual void StopOnImageLoadSettingsChanged( + const Team::ImageLoadEvent& event); + virtual void StopOnImageLoadNameAdded( + const Team::ImageLoadNameEvent& event); + virtual void StopOnImageLoadNameRemoved( + const Team::ImageLoadNameEvent& event); + + private: void _Init(); void _UpdateThrownBreakpoints(bool enable); status_t _FindExceptionFunction(ImageDebugInfo* info, target_addr_t& _foundAddress) const; + void _UpdateExceptionState(); + void _UpdateStopImageState(); + void _UpdateStopImageButtons(); + // must be called with team lock held + + private: ::Team* fTeam; @@ -56,6 +72,7 @@ private: BTextControl* fStopImageNameInput; BButton* fAddImageNameButton; BButton* fRemoveImageNameButton; + bool fUseCustomImages; BButton* fCloseButton; BHandler* fTarget; };