hrev45764 adds 8 changesets to branch 'master' old head: 6121ae660c7e10d5101d8b67143b7be290433ed9 new head: 607d59a103e5213815b468024b198a94b7d4554c overview: http://cgit.haiku-os.org/haiku/log/?qt=range&q=607d59a+%5E6121ae6 ---------------------------------------------------------------------------- 55fc8da: Initial implementation of exception configuration window. Doesn't actually take any actions yet, just presents a UI. f4d95e0: Slightly rearrange BreakpointsView. Line up the buttons along the bottom rather than the side. Add button to invoke exception configuration window. 944297b: Add hooks for actually showing/managing exception config window. 41bf990: Implement throw exception breakpoints. The exception thrown checkbox now tries to set/clear breakpoints for gcc2/4's respective exception throwing functions. Some tweaking still needs to be done in order that these aren't visible in the breakpoints list like normal user set breakpoints. b9461dc: Add hidden attribute to UserBreakpoint. Marks a breakpoint as one that should not be exposed in the UI's normal breakpoint management interface. Adjust settings management to preserve/restore appropriately. 468c8df: Extend UserInterfaceListener to allow marking... ...breakpoints as hidden. Adjust TeamDebugger accordingly. 7287380: BreakpointListView/SourceView: ignore hidden breakpoints. 607d59a: ExceptionConfigWindow: detect current exception status... ...on startup by seeing if the breakpoints for the exception functions are already installed or not. [ Rene Gollent <anevilyak@xxxxxxxxx> ] ---------------------------------------------------------------------------- 18 files changed, 335 insertions(+), 19 deletions(-) src/apps/debugger/Jamfile | 1 + src/apps/debugger/MessageCodes.h | 2 + src/apps/debugger/controllers/TeamDebugger.cpp | 19 +- src/apps/debugger/controllers/TeamDebugger.h | 4 +- src/apps/debugger/model/UserBreakpoint.cpp | 11 +- src/apps/debugger/model/UserBreakpoint.h | 5 + src/apps/debugger/settings/BreakpointSetting.cpp | 18 +- src/apps/debugger/settings/BreakpointSetting.h | 5 +- src/apps/debugger/settings/TeamSettings.cpp | 3 +- src/apps/debugger/user_interface/UserInterface.h | 2 +- .../gui/team_window/BreakpointListView.cpp | 3 + .../gui/team_window/BreakpointsView.cpp | 15 +- .../gui/team_window/BreakpointsView.h | 1 + .../gui/team_window/ExceptionConfigWindow.cpp | 180 +++++++++++++++++++ .../gui/team_window/ExceptionConfigWindow.h | 56 ++++++ .../gui/team_window/SourceView.cpp | 2 + .../gui/team_window/TeamWindow.cpp | 25 ++- .../user_interface/gui/team_window/TeamWindow.h | 2 + ############################################################################ Commit: 55fc8da14328ae333d03079f092948f29411e8b3 URL: http://cgit.haiku-os.org/haiku/commit/?id=55fc8da Author: Rene Gollent <anevilyak@xxxxxxxxx> Date: Fri Jun 14 00:39:06 2013 UTC Initial implementation of exception configuration window. Doesn't actually take any actions yet, just presents a UI. ---------------------------------------------------------------------------- diff --git a/src/apps/debugger/Jamfile b/src/apps/debugger/Jamfile index 39a1c4f..f6300ed 100644 --- a/src/apps/debugger/Jamfile +++ b/src/apps/debugger/Jamfile @@ -234,6 +234,7 @@ Application Debugger : # user_interface/gui/team_window BreakpointListView.cpp BreakpointsView.cpp + ExceptionConfigWindow.cpp ImageFunctionsView.cpp ImageListView.cpp RegistersView.cpp diff --git a/src/apps/debugger/MessageCodes.h b/src/apps/debugger/MessageCodes.h index ccf5e65..560ec53 100644 --- a/src/apps/debugger/MessageCodes.h +++ b/src/apps/debugger/MessageCodes.h @@ -52,6 +52,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_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/ExceptionConfigWindow.cpp new file mode 100644 index 0000000..8da82d1 --- /dev/null +++ b/src/apps/debugger/user_interface/gui/team_window/ExceptionConfigWindow.cpp @@ -0,0 +1,112 @@ +/* + * Copyright 2013, Rene Gollent, rene@xxxxxxxxxxx. + * Distributed under the terms of the MIT License. + */ +#include "ExceptionConfigWindow.h" + +#include <Button.h> +#include <CheckBox.h> +#include <LayoutBuilder.h> + +#include "MessageCodes.h" +#include "UserInterface.h" +#include "Team.h" + + +enum { + MSG_STOP_ON_THROWN_EXCEPTION_CHANGED = 'stec', + MSG_STOP_ON_CAUGHT_EXCEPTION_CHANGED = 'scec' +}; + + +ExceptionConfigWindow::ExceptionConfigWindow(::Team* team, + UserInterfaceListener* listener, BHandler* target) + : + BWindow(BRect(), "Configure Exceptions", B_FLOATING_WINDOW, + B_AUTO_UPDATE_SIZE_LIMITS | B_CLOSE_ON_ESCAPE), + fTeam(team), + fListener(listener), + fExceptionThrown(NULL), + fExceptionCaught(NULL), + fCloseButton(NULL), + fTarget(target) +{ +} + + +ExceptionConfigWindow::~ExceptionConfigWindow() +{ + BMessenger(fTarget).SendMessage(MSG_EXCEPTION_CONFIG_WINDOW_CLOSED); +} + + +ExceptionConfigWindow* +ExceptionConfigWindow::Create(::Team* team, + UserInterfaceListener* listener, BHandler* target) +{ + ExceptionConfigWindow* self = new ExceptionConfigWindow(team, listener, + target); + + try { + self->_Init(); + } catch (...) { + delete self; + throw; + } + + return self; + +} + +void +ExceptionConfigWindow::_Init() +{ + 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) + .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); +} + +void +ExceptionConfigWindow::Show() +{ + CenterOnScreen(); + BWindow::Show(); +} + +void +ExceptionConfigWindow::MessageReceived(BMessage* message) +{ + switch (message->what) { + case MSG_STOP_ON_THROWN_EXCEPTION_CHANGED: + { + break; + } + + case MSG_STOP_ON_CAUGHT_EXCEPTION_CHANGED: + { + break; + } + default: + BWindow::MessageReceived(message); + break; + } + +} diff --git a/src/apps/debugger/user_interface/gui/team_window/ExceptionConfigWindow.h b/src/apps/debugger/user_interface/gui/team_window/ExceptionConfigWindow.h new file mode 100644 index 0000000..bae865b --- /dev/null +++ b/src/apps/debugger/user_interface/gui/team_window/ExceptionConfigWindow.h @@ -0,0 +1,50 @@ +/* + * Copyright 2013, Rene Gollent, rene@xxxxxxxxxxx. + * Distributed under the terms of the MIT License. + */ +#ifndef EXCEPTION_CONFIG_WINDOW_H +#define EXCEPTION_CONFIG_WINDOW_H + + +#include <Window.h> + + +class BButton; +class BCheckBox; +class Team; +class UserInterfaceListener; + + +class ExceptionConfigWindow : public BWindow +{ +public: + ExceptionConfigWindow(::Team* team, + UserInterfaceListener* listener, + BHandler* target); + + ~ExceptionConfigWindow(); + + static ExceptionConfigWindow* Create(::Team* team, + UserInterfaceListener* listener, + BHandler* target); + // throws + + virtual void MessageReceived(BMessage* message); + + virtual void Show(); + +private: + void _Init(); + + +private: + ::Team* fTeam; + UserInterfaceListener* fListener; + BCheckBox* fExceptionThrown; + BCheckBox* fExceptionCaught; + BButton* fCloseButton; + BHandler* fTarget; +}; + + +#endif // EXCEPTION_CONFIG_WINDOW_H ############################################################################ Commit: f4d95e0e1967395893a9dd2224555a7b02083dcc URL: http://cgit.haiku-os.org/haiku/commit/?id=f4d95e0 Author: Rene Gollent <anevilyak@xxxxxxxxx> Date: Fri Jun 14 00:39:51 2013 UTC Slightly rearrange BreakpointsView. Line up the buttons along the bottom rather than the side. Add button to invoke exception configuration window. ---------------------------------------------------------------------------- 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 e798b3a..e68632c 100644 --- a/src/apps/debugger/user_interface/gui/team_window/BreakpointsView.cpp +++ b/src/apps/debugger/user_interface/gui/team_window/BreakpointsView.cpp @@ -28,6 +28,7 @@ BreakpointsView::BreakpointsView(Team* team, Listener* listener) BGroupView(B_HORIZONTAL, 4.0f), fTeam(team), fListView(NULL), + fConfigureExceptionsButton(NULL), fToggleBreakpointButton(NULL), fRemoveBreakpointButton(NULL), fListener(listener) @@ -93,6 +94,7 @@ BreakpointsView::MessageReceived(BMessage* message) case MSG_CLEAR_BREAKPOINT: _HandleBreakpointAction(message->what); break; + default: BGroupView::MessageReceived(message); break; @@ -103,6 +105,7 @@ BreakpointsView::MessageReceived(BMessage* message) void BreakpointsView::AttachedToWindow() { + fConfigureExceptionsButton->SetTarget(Window()); fToggleBreakpointButton->SetTarget(this); fRemoveBreakpointButton->SetTarget(this); } @@ -145,15 +148,19 @@ BreakpointsView::BreakpointSelectionChanged(BreakpointProxyList& proxies) void BreakpointsView::_Init() { - BLayoutBuilder::Group<>(this, B_HORIZONTAL, 0.0f) + BLayoutBuilder::Group<>(this, B_VERTICAL, 0.0f) .Add(fListView = BreakpointListView::Create(fTeam, this, this)) - .AddGroup(B_VERTICAL, B_USE_SMALL_SPACING) + .AddGroup(B_HORIZONTAL, B_USE_SMALL_SPACING) .SetInsets(B_USE_SMALL_SPACING) - .Add(fToggleBreakpointButton = new BButton("Toggle")) - .Add(fRemoveBreakpointButton = new BButton("Remove")) .AddGlue() + .Add(fConfigureExceptionsButton = new BButton( + "Configure exceptions" B_UTF8_ELLIPSIS)) + .Add(fRemoveBreakpointButton = new BButton("Remove")) + .Add(fToggleBreakpointButton = new BButton("Toggle")) .End(); + fConfigureExceptionsButton->SetMessage(new BMessage( + MSG_SHOW_EXCEPTION_CONFIG_WINDOW)); fToggleBreakpointButton->SetMessage(new BMessage(MSG_ENABLE_BREAKPOINT)); fRemoveBreakpointButton->SetMessage(new BMessage(MSG_CLEAR_BREAKPOINT)); 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 374b896..6a42537 100644 --- a/src/apps/debugger/user_interface/gui/team_window/BreakpointsView.h +++ b/src/apps/debugger/user_interface/gui/team_window/BreakpointsView.h @@ -54,6 +54,7 @@ private: Team* fTeam; BreakpointListView* fListView; BreakpointProxyList fSelectedBreakpoints; + BButton* fConfigureExceptionsButton; BButton* fToggleBreakpointButton; BButton* fRemoveBreakpointButton; Listener* fListener; ############################################################################ Commit: 944297b82b37e8f24251b7a275db039467d7452e URL: http://cgit.haiku-os.org/haiku/commit/?id=944297b Author: Rene Gollent <anevilyak@xxxxxxxxx> Date: Fri Jun 14 00:41:04 2013 UTC Add hooks for actually showing/managing exception config window. ---------------------------------------------------------------------------- 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 bc00aae..563f061 100644 --- a/src/apps/debugger/user_interface/gui/team_window/TeamWindow.cpp +++ b/src/apps/debugger/user_interface/gui/team_window/TeamWindow.cpp @@ -1,6 +1,6 @@ /* * Copyright 2009-2012, Ingo Weinhold, ingo_weinhold@xxxxxx. - * Copyright 2010-2012, Rene Gollent, rene@xxxxxxxxxxx. + * Copyright 2010-2013, Rene Gollent, rene@xxxxxxxxxxx. * Distributed under the terms of the MIT License. */ @@ -31,6 +31,7 @@ #include "Breakpoint.h" #include "CpuState.h" #include "DisassembledCode.h" +#include "ExceptionConfigWindow.h" #include "FileSourceCode.h" #include "GuiSettingsUtils.h" #include "GuiTeamUiSettings.h" @@ -115,6 +116,7 @@ TeamWindow::TeamWindow(::Team* team, UserInterfaceListener* listener) fStepOverButton(NULL), fStepIntoButton(NULL), fStepOutButton(NULL), + fExceptionConfigWindow(NULL), fInspectorWindow(NULL), fFilePanel(NULL) { @@ -301,6 +303,27 @@ TeamWindow::MessageReceived(BMessage* message) break; } + case MSG_SHOW_EXCEPTION_CONFIG_WINDOW: + { + if (fExceptionConfigWindow) { + fExceptionConfigWindow->Activate(true); + } else { + try { + fExceptionConfigWindow = ExceptionConfigWindow::Create( + fTeam, fListener, this); + if (fExceptionConfigWindow != NULL) + fExceptionConfigWindow->Show(); + } catch (...) { + // TODO: notify user + } + } + break; + } + case MSG_EXCEPTION_CONFIG_WINDOW_CLOSED: + { + fExceptionConfigWindow = NULL; + break; + } case MSG_SHOW_WATCH_VARIABLE_PROMPT: { target_addr_t address; 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 810d975..7ccb5af 100644 --- a/src/apps/debugger/user_interface/gui/team_window/TeamWindow.h +++ b/src/apps/debugger/user_interface/gui/team_window/TeamWindow.h @@ -29,6 +29,7 @@ class BMenuBar; class BSplitView; class BStringView; class BTabView; +class ExceptionConfigWindow; class Image; class InspectorWindow; class RegistersView; @@ -195,6 +196,7 @@ private: BSplitView* fSourceSplitView; BSplitView* fImageSplitView; BSplitView* fThreadSplitView; + ExceptionConfigWindow* fExceptionConfigWindow; InspectorWindow* fInspectorWindow; GuiTeamUiSettings fUiSettings; BFilePanel* fFilePanel; ############################################################################ Commit: 41bf99064c2ad4dad46bfce9cbdc8a17d94aad87 URL: http://cgit.haiku-os.org/haiku/commit/?id=41bf990 Author: Rene Gollent <anevilyak@xxxxxxxxx> Date: Sat Jun 15 00:13:39 2013 UTC Implement throw exception breakpoints. The exception thrown checkbox now tries to set/clear breakpoints for gcc2/4's respective exception throwing functions. Some tweaking still needs to be done in order that these aren't visible in the breakpoints list like normal user set breakpoints. ---------------------------------------------------------------------------- diff --git a/src/apps/debugger/user_interface/gui/team_window/ExceptionConfigWindow.cpp b/src/apps/debugger/user_interface/gui/team_window/ExceptionConfigWindow.cpp index 8da82d1..6e13b62 100644 --- a/src/apps/debugger/user_interface/gui/team_window/ExceptionConfigWindow.cpp +++ b/src/apps/debugger/user_interface/gui/team_window/ExceptionConfigWindow.cpp @@ -8,6 +8,11 @@ #include <CheckBox.h> #include <LayoutBuilder.h> +#include <AutoLocker.h> + +#include "FunctionInstance.h" +#include "Image.h" +#include "ImageDebugInfo.h" #include "MessageCodes.h" #include "UserInterface.h" #include "Team.h" @@ -59,6 +64,37 @@ ExceptionConfigWindow::Create(::Team* team, } void +ExceptionConfigWindow::MessageReceived(BMessage* message) +{ + switch (message->what) { + case MSG_STOP_ON_THROWN_EXCEPTION_CHANGED: + { + _UpdateThrownBreakpoints(fExceptionThrown->Value() + == B_CONTROL_ON); + break; + } + + case MSG_STOP_ON_CAUGHT_EXCEPTION_CHANGED: + { + break; + } + default: + BWindow::MessageReceived(message); + break; + } + +} + + +void +ExceptionConfigWindow::Show() +{ + CenterOnScreen(); + BWindow::Show(); +} + + +void ExceptionConfigWindow::_Init() { BLayoutBuilder::Group<>(this, B_VERTICAL) @@ -84,29 +120,30 @@ ExceptionConfigWindow::_Init() fCloseButton->SetTarget(this); } -void -ExceptionConfigWindow::Show() -{ - CenterOnScreen(); - BWindow::Show(); -} void -ExceptionConfigWindow::MessageReceived(BMessage* message) +ExceptionConfigWindow::_UpdateThrownBreakpoints(bool enable) { - switch (message->what) { - case MSG_STOP_ON_THROWN_EXCEPTION_CHANGED: - { - break; - } - - case MSG_STOP_ON_CAUGHT_EXCEPTION_CHANGED: - { - break; + AutoLocker< ::Team> teamLocker(fTeam); + + for (ImageList::ConstIterator it = fTeam->Images().GetIterator(); + it.HasNext();) { + Image* image = it.Next(); + + ImageDebugInfo* info = image->GetImageDebugInfo(); + if (info != NULL) { + FunctionInstance* instance = info->FunctionByName( + "__cxa_allocate_exception"); + if (instance == NULL) + instance = info->FunctionByName("__throw(void)"); + + if (instance != NULL) { + target_addr_t address = instance->Address(); + if (enable) + fListener->SetBreakpointRequested(address, true); + else + fListener->ClearBreakpointRequested(address); + } } - default: - BWindow::MessageReceived(message); - break; } - } diff --git a/src/apps/debugger/user_interface/gui/team_window/ExceptionConfigWindow.h b/src/apps/debugger/user_interface/gui/team_window/ExceptionConfigWindow.h index bae865b..0a17d1d 100644 --- a/src/apps/debugger/user_interface/gui/team_window/ExceptionConfigWindow.h +++ b/src/apps/debugger/user_interface/gui/team_window/ExceptionConfigWindow.h @@ -35,6 +35,7 @@ public: private: void _Init(); + void _UpdateThrownBreakpoints(bool enable); private: ############################################################################ Commit: b9461dc8cdbc0402a29cade82863cc5fcf84a816 URL: http://cgit.haiku-os.org/haiku/commit/?id=b9461dc Author: Rene Gollent <anevilyak@xxxxxxxxx> Date: Sat Jun 15 18:45:16 2013 UTC Add hidden attribute to UserBreakpoint. Marks a breakpoint as one that should not be exposed in the UI's normal breakpoint management interface. Adjust settings management to preserve/restore appropriately. ---------------------------------------------------------------------------- diff --git a/src/apps/debugger/model/UserBreakpoint.cpp b/src/apps/debugger/model/UserBreakpoint.cpp index 0fa5779..996eb6e 100644 --- a/src/apps/debugger/model/UserBreakpoint.cpp +++ b/src/apps/debugger/model/UserBreakpoint.cpp @@ -1,5 +1,6 @@ /* * Copyright 2009, Ingo Weinhold, ingo_weinhold@xxxxxx. + * Copyright 2013, Rene Gollent, rene@xxxxxxxxxxx. * Distributed under the terms of the MIT License. */ @@ -99,7 +100,8 @@ UserBreakpoint::UserBreakpoint(const UserBreakpointLocation& location) : fLocation(location), fValid(false), - fEnabled(false) + fEnabled(false), + fHidden(false) { } @@ -160,3 +162,10 @@ UserBreakpoint::SetEnabled(bool enabled) { fEnabled = enabled; } + + +void +UserBreakpoint::SetHidden(bool hidden) +{ + fHidden = hidden; +} diff --git a/src/apps/debugger/model/UserBreakpoint.h b/src/apps/debugger/model/UserBreakpoint.h index 43f23fc..cf4cfe3 100644 --- a/src/apps/debugger/model/UserBreakpoint.h +++ b/src/apps/debugger/model/UserBreakpoint.h @@ -1,5 +1,6 @@ /* * Copyright 2009, Ingo Weinhold, ingo_weinhold@xxxxxx. + * Copyright 2013, Rene Gollent, rene@xxxxxxxxxxx. * Distributed under the terms of the MIT License. */ #ifndef USER_BREAKPOINT_H @@ -100,6 +101,9 @@ public: void SetEnabled(bool enabled); // BreakpointManager only + bool IsHidden() const { return fHidden; } + void SetHidden(bool hidden); + private: typedef BObjectList<UserBreakpointInstance> InstanceList; @@ -108,6 +112,7 @@ private: InstanceList fInstances; bool fValid; bool fEnabled; + bool fHidden; }; diff --git a/src/apps/debugger/settings/BreakpointSetting.cpp b/src/apps/debugger/settings/BreakpointSetting.cpp index ca960f3..03ade77 100644 --- a/src/apps/debugger/settings/BreakpointSetting.cpp +++ b/src/apps/debugger/settings/BreakpointSetting.cpp @@ -1,5 +1,6 @@ /* * Copyright 2009, Ingo Weinhold, ingo_weinhold@xxxxxx. + * Copyright 2013, Rene Gollent, rene@xxxxxxxxxxx. * Distributed under the terms of the MIT License. */ @@ -20,7 +21,8 @@ BreakpointSetting::BreakpointSetting() fSourceFile(), fSourceLocation(), fRelativeAddress(0), - fEnabled(false) + fEnabled(false), + fHidden(false) { } @@ -31,7 +33,8 @@ BreakpointSetting::BreakpointSetting(const BreakpointSetting& other) fSourceFile(other.fSourceFile), fSourceLocation(other.fSourceLocation), fRelativeAddress(other.fRelativeAddress), - fEnabled(other.fEnabled) + fEnabled(other.fEnabled), + fHidden(other.fHidden) { if (fFunctionID != NULL) fFunctionID->AcquireReference(); @@ -45,7 +48,8 @@ BreakpointSetting::~BreakpointSetting() status_t -BreakpointSetting::SetTo(const UserBreakpointLocation& location, bool enabled) +BreakpointSetting::SetTo(const UserBreakpointLocation& location, bool enabled, + bool hidden) { _Unset(); @@ -59,6 +63,7 @@ BreakpointSetting::SetTo(const UserBreakpointLocation& location, bool enabled) fSourceLocation = location.GetSourceLocation(); fRelativeAddress = location.RelativeAddress(); fEnabled = enabled; + fHidden = hidden; return B_OK; } @@ -92,6 +97,9 @@ BreakpointSetting::SetTo(const BMessage& archive) if (archive.FindBool("enabled", &fEnabled) != B_OK) fEnabled = false; + if (archive.FindBool("hidden", &fHidden) != B_OK) + fHidden = false; + return B_OK; } @@ -113,7 +121,8 @@ BreakpointSetting::WriteTo(BMessage& archive) const != B_OK || (error = archive.AddUInt64("relativeAddress", fRelativeAddress)) != B_OK - || (error = archive.AddBool("enabled", fEnabled)) != B_OK) { + || (error = archive.AddBool("enabled", fEnabled)) != B_OK + || (error = archive.AddBool("hidden", fHidden)) != B_OK) { return error; } @@ -137,6 +146,7 @@ BreakpointSetting::operator=(const BreakpointSetting& other) fSourceLocation = other.fSourceLocation; fRelativeAddress = other.fRelativeAddress; fEnabled = other.fEnabled; + fHidden = other.fHidden; return *this; } diff --git a/src/apps/debugger/settings/BreakpointSetting.h b/src/apps/debugger/settings/BreakpointSetting.h index 964a0e5..90d0a03 100644 --- a/src/apps/debugger/settings/BreakpointSetting.h +++ b/src/apps/debugger/settings/BreakpointSetting.h @@ -1,5 +1,6 @@ /* * Copyright 2009, Ingo Weinhold, ingo_weinhold@xxxxxx. + * Copyright 2013, Rene Gollent, rene@xxxxxxxxxxx. * Distributed under the terms of the MIT License. */ #ifndef BREAKPOINT_SETTING_H @@ -27,7 +28,7 @@ public: ~BreakpointSetting(); status_t SetTo(const UserBreakpointLocation& location, - bool enabled); + bool enabled, bool hidden); status_t SetTo(const BMessage& archive); status_t WriteTo(BMessage& archive) const; @@ -39,6 +40,7 @@ public: { return fRelativeAddress; } bool IsEnabled() const { return fEnabled; } + bool IsHidden() const { return fHidden; } BreakpointSetting& operator=(const BreakpointSetting& other); @@ -51,6 +53,7 @@ private: SourceLocation fSourceLocation; target_addr_t fRelativeAddress; bool fEnabled; + bool fHidden; }; diff --git a/src/apps/debugger/settings/TeamSettings.cpp b/src/apps/debugger/settings/TeamSettings.cpp index 605202d..cf31541 100644 --- a/src/apps/debugger/settings/TeamSettings.cpp +++ b/src/apps/debugger/settings/TeamSettings.cpp @@ -1,5 +1,6 @@ /* * Copyright 2009, Ingo Weinhold, ingo_weinhold@xxxxxx. + * Copyright 2013, Rene Gollent, rene@xxxxxxxxxxx. * Distributed under the terms of the MIT License. */ @@ -61,7 +62,7 @@ TeamSettings::SetTo(Team* team) return B_NO_MEMORY; status_t error = breakpointSetting->SetTo(breakpoint->Location(), - breakpoint->IsEnabled()); + breakpoint->IsEnabled(), breakpoint->IsHidden()); if (error == B_OK && !fBreakpoints.AddItem(breakpointSetting)) error = B_NO_MEMORY; if (error != B_OK) { ############################################################################ Commit: 468c8dfab7842fa754e905c611a443ccf950afa3 URL: http://cgit.haiku-os.org/haiku/commit/?id=468c8df Author: Rene Gollent <anevilyak@xxxxxxxxx> Date: Sat Jun 15 18:47:14 2013 UTC Extend UserInterfaceListener to allow marking... ...breakpoints as hidden. Adjust TeamDebugger accordingly. ---------------------------------------------------------------------------- diff --git a/src/apps/debugger/controllers/TeamDebugger.cpp b/src/apps/debugger/controllers/TeamDebugger.cpp index 9c334dc..25ab231 100644 --- a/src/apps/debugger/controllers/TeamDebugger.cpp +++ b/src/apps/debugger/controllers/TeamDebugger.cpp @@ -582,10 +582,14 @@ TeamDebugger::MessageReceived(BMessage* message) if (message->FindBool("enabled", &enabled) != B_OK) enabled = true; + bool hidden; + if (message->FindBool("hidden", &hidden) != B_OK) + hidden = false; + if (breakpoint != NULL) _HandleSetUserBreakpoint(breakpoint, enabled); else - _HandleSetUserBreakpoint(address, enabled); + _HandleSetUserBreakpoint(address, enabled, hidden); } else { if (breakpoint != NULL) _HandleClearUserBreakpoint(breakpoint); @@ -840,11 +844,13 @@ TeamDebugger::ThreadActionRequested(thread_id threadID, void -TeamDebugger::SetBreakpointRequested(target_addr_t address, bool enabled) +TeamDebugger::SetBreakpointRequested(target_addr_t address, bool enabled, + bool hidden) { BMessage message(MSG_SET_BREAKPOINT); message.AddUInt64("address", (uint64)address); message.AddBool("enabled", enabled); + message.AddBool("hidden", hidden); PostMessage(&message); } @@ -1431,10 +1437,11 @@ TeamDebugger::_HandleImageFileChanged(image_id imageID) void -TeamDebugger::_HandleSetUserBreakpoint(target_addr_t address, bool enabled) +TeamDebugger::_HandleSetUserBreakpoint(target_addr_t address, bool enabled, + bool hidden) { TRACE_CONTROL("TeamDebugger::_HandleSetUserBreakpoint(%#" B_PRIx64 - ", %d)\n", address, enabled); + ", %d, %d)\n", address, enabled, hidden); // check whether there already is a breakpoint AutoLocker< ::Team> locker(fTeam); @@ -1506,6 +1513,8 @@ TeamDebugger::_HandleSetUserBreakpoint(target_addr_t address, bool enabled) return; userBreakpointReference.SetTo(userBreakpoint, true); + userBreakpoint->SetHidden(hidden); + TRACE_CONTROL(" created user breakpoint: %p\n", userBreakpoint); // iterate through all function instances and create @@ -1795,6 +1804,8 @@ TeamDebugger::_LoadSettings() return; BReference<UserBreakpoint> breakpointReference(breakpoint, true); + breakpoint->SetHidden(breakpointSetting->IsHidden()); + // install it fBreakpointManager->InstallUserBreakpoint(breakpoint, breakpointSetting->IsEnabled()); diff --git a/src/apps/debugger/controllers/TeamDebugger.h b/src/apps/debugger/controllers/TeamDebugger.h index 0c85698..f236f42 100644 --- a/src/apps/debugger/controllers/TeamDebugger.h +++ b/src/apps/debugger/controllers/TeamDebugger.h @@ -70,7 +70,7 @@ private: virtual void ThreadActionRequested(thread_id threadID, uint32 action, target_addr_t address); virtual void SetBreakpointRequested(target_addr_t address, - bool enabled); + bool enabled, bool hidden = false); virtual void SetBreakpointEnabledRequested( UserBreakpoint* breakpoint, bool enabled); @@ -145,7 +145,7 @@ private: void _HandleImageFileChanged(image_id imageID); void _HandleSetUserBreakpoint(target_addr_t address, - bool enabled); + bool enabled, bool hidden); void _HandleSetUserBreakpoint( UserBreakpoint* breakpoint, bool enabled); void _HandleClearUserBreakpoint( diff --git a/src/apps/debugger/user_interface/UserInterface.h b/src/apps/debugger/user_interface/UserInterface.h index c115fed..fa95fe8 100644 --- a/src/apps/debugger/user_interface/UserInterface.h +++ b/src/apps/debugger/user_interface/UserInterface.h @@ -95,7 +95,7 @@ public: target_addr_t address = 0) = 0; virtual void SetBreakpointRequested(target_addr_t address, - bool enabled) = 0; + bool enabled, bool hidden = false) = 0; virtual void SetBreakpointEnabledRequested( UserBreakpoint* breakpoint, bool enabled) = 0; ############################################################################ Commit: 7287380095821b335c1eb3151f20594bf1fcb22e URL: http://cgit.haiku-os.org/haiku/commit/?id=7287380 Author: Rene Gollent <anevilyak@xxxxxxxxx> Date: Sat Jun 15 18:48:31 2013 UTC BreakpointListView/SourceView: ignore hidden breakpoints. ---------------------------------------------------------------------------- diff --git a/src/apps/debugger/user_interface/gui/team_window/BreakpointListView.cpp b/src/apps/debugger/user_interface/gui/team_window/BreakpointListView.cpp index ba4b031..6b88b63 100644 --- a/src/apps/debugger/user_interface/gui/team_window/BreakpointListView.cpp +++ b/src/apps/debugger/user_interface/gui/team_window/BreakpointListView.cpp @@ -380,6 +380,9 @@ BreakpointListView::UnsetListener() void BreakpointListView::UserBreakpointChanged(UserBreakpoint* breakpoint) { + if (breakpoint->IsHidden()) + return; + BreakpointProxy proxy(breakpoint, NULL); fBreakpointsTableModel->UpdateBreakpoint(&proxy); } diff --git a/src/apps/debugger/user_interface/gui/team_window/SourceView.cpp b/src/apps/debugger/user_interface/gui/team_window/SourceView.cpp index b6c6d9b..e88c9f8 100644 --- a/src/apps/debugger/user_interface/gui/team_window/SourceView.cpp +++ b/src/apps/debugger/user_interface/gui/team_window/SourceView.cpp @@ -686,6 +686,8 @@ SourceView::MarkerManager::_UpdateBreakpointMarkers() for (int32 i = 0; UserBreakpoint* breakpoint = breakpoints.ItemAt(i); i++) { + if (breakpoint->IsHidden()) + continue; UserBreakpointInstance* breakpointInstance = breakpoint->InstanceAt(0); FunctionInstance* functionInstance; ############################################################################ Revision: hrev45764 Commit: 607d59a103e5213815b468024b198a94b7d4554c URL: http://cgit.haiku-os.org/haiku/commit/?id=607d59a Author: Rene Gollent <anevilyak@xxxxxxxxx> Date: Sat Jun 15 18:49:25 2013 UTC ExceptionConfigWindow: detect current exception status... ...on startup by seeing if the breakpoints for the exception functions are already installed or not. ---------------------------------------------------------------------------- diff --git a/src/apps/debugger/user_interface/gui/team_window/ExceptionConfigWindow.cpp b/src/apps/debugger/user_interface/gui/team_window/ExceptionConfigWindow.cpp index 6e13b62..d0a01a1 100644 --- a/src/apps/debugger/user_interface/gui/team_window/ExceptionConfigWindow.cpp +++ b/src/apps/debugger/user_interface/gui/team_window/ExceptionConfigWindow.cpp @@ -118,6 +118,24 @@ ExceptionConfigWindow::_Init() fExceptionCaught->SetEnabled(false); fCloseButton->SetTarget(this); + + + // 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(); + + 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; + } + } } @@ -125,25 +143,38 @@ void ExceptionConfigWindow::_UpdateThrownBreakpoints(bool enable) { AutoLocker< ::Team> teamLocker(fTeam); - for (ImageList::ConstIterator it = fTeam->Images().GetIterator(); it.HasNext();) { Image* image = it.Next(); ImageDebugInfo* info = image->GetImageDebugInfo(); - if (info != NULL) { - FunctionInstance* instance = info->FunctionByName( - "__cxa_allocate_exception"); - if (instance == NULL) - instance = info->FunctionByName("__throw(void)"); - - if (instance != NULL) { - target_addr_t address = instance->Address(); - if (enable) - fListener->SetBreakpointRequested(address, true); - else - fListener->ClearBreakpointRequested(address); - } + target_addr_t address; + if (_FindExceptionFunction(info, address) != B_OK) + continue; + + if (enable) + fListener->SetBreakpointRequested(address, true, true); + else + fListener->ClearBreakpointRequested(address); + } +} + + +status_t +ExceptionConfigWindow::_FindExceptionFunction(ImageDebugInfo* info, + target_addr_t& _foundAddress) const +{ + if (info != NULL) { + FunctionInstance* instance = info->FunctionByName( + "__cxa_allocate_exception"); + if (instance == NULL) + instance = info->FunctionByName("__throw(void)"); + + if (instance != NULL) { + _foundAddress = instance->Address(); + return B_OK; } } + + return B_NAME_NOT_FOUND; } diff --git a/src/apps/debugger/user_interface/gui/team_window/ExceptionConfigWindow.h b/src/apps/debugger/user_interface/gui/team_window/ExceptionConfigWindow.h index 0a17d1d..e18dfc4 100644 --- a/src/apps/debugger/user_interface/gui/team_window/ExceptionConfigWindow.h +++ b/src/apps/debugger/user_interface/gui/team_window/ExceptionConfigWindow.h @@ -8,9 +8,12 @@ #include <Window.h> +#include "types/Types.h" + class BButton; class BCheckBox; +class ImageDebugInfo; class Team; class UserInterfaceListener; @@ -36,6 +39,8 @@ public: private: void _Init(); void _UpdateThrownBreakpoints(bool enable); + status_t _FindExceptionFunction(ImageDebugInfo* info, + target_addr_t& _foundAddress) const; private: