[haiku-commits] haiku: hrev45764 - in src/apps/debugger: user_interface/gui/team_window settings controllers model

  • From: anevilyak@xxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Sat, 15 Jun 2013 20:53:57 +0200 (CEST)

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:


Other related posts: