[nemiver/follow-fork-mode] Allow breaking on fork/exec syscalls



commit 0e5954acacde6a16e1c23287cbd0ed05fc7eccf9
Author: Dodji Seketeli <dodji redhat com>
Date:   Tue Jun 22 21:17:58 2010 +0200

    Allow breaking on fork/exec syscalls
    
    	* src/persp/dbgperspective/nmv-set-breakpoint-dialog.cc
    	(Priv::SetBreakpointDialog::Priv): Add combo box entries to break
    	on fork, vfork and exec syscalls.
    	* test/fork-child.cc: New test.
    	* test/fork-parent.cc: Likewise.
    	* tests/Makefile.am: Add the files to the build system.
    	* src/dbgengine/nmv-gdbmi-parser.cc
    	(GDBMIParser::parse_breakpoint): Don't require the addr attribute
    	to be present in breakpoint results.

 src/dbgengine/nmv-gdb-engine.cc                    |    3 +-
 src/dbgengine/nmv-gdbmi-parser.cc                  |    4 ++-
 .../dbgperspective/nmv-set-breakpoint-dialog.cc    |   13 ++++++++++
 tests/Makefile.am                                  |    9 ++++++-
 tests/fork-child.cc                                |    8 ++++++
 tests/fork-parent.cc                               |   24 ++++++++++++++++++++
 6 files changed, 57 insertions(+), 4 deletions(-)
---
diff --git a/src/dbgengine/nmv-gdb-engine.cc b/src/dbgengine/nmv-gdb-engine.cc
index be02992..96e4b9c 100644
--- a/src/dbgengine/nmv-gdb-engine.cc
+++ b/src/dbgengine/nmv-gdb-engine.cc
@@ -1,4 +1,3 @@
-// -*- c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 4; -*-'
 // Author: Dodji Seketeli
 /*
  *This file is part of the Nemiver project
@@ -3798,7 +3797,7 @@ GDBEngine::append_breakpoints_to_cache
 
 void
 GDBEngine::set_catch (const UString &a_event,
-					  const UString &a_cookie)
+		      const UString &a_cookie)
 {
     LOG_FUNCTION_SCOPE_NORMAL_DD;
 
diff --git a/src/dbgengine/nmv-gdbmi-parser.cc b/src/dbgengine/nmv-gdbmi-parser.cc
index 150770e..45d8465 100644
--- a/src/dbgengine/nmv-gdbmi-parser.cc
+++ b/src/dbgengine/nmv-gdbmi-parser.cc
@@ -2126,7 +2126,9 @@ GDBMIParser::parse_breakpoint (Glib::ustring::size_type a_from,
             || (iter = attrs.find ("type"))    == null_iter
             || (iter = attrs.find ("disp"))    == null_iter
             || (iter = attrs.find ("enabled")) == null_iter
-            || (iter = attrs.find ("addr"))    == null_iter
+	   // Non regular breakpoints like those set to catch fork
+	   // events can have an empty address when set.
+	   // || (iter = attrs.find ("addr"))    == null_iter
             || (iter = attrs.find ("times"))   == null_iter
        ) {
         LOG_PARSING_ERROR2 (cur);
diff --git a/src/persp/dbgperspective/nmv-set-breakpoint-dialog.cc b/src/persp/dbgperspective/nmv-set-breakpoint-dialog.cc
index b85a9d9..e6d9d56 100644
--- a/src/persp/dbgperspective/nmv-set-breakpoint-dialog.cc
+++ b/src/persp/dbgperspective/nmv-set-breakpoint-dialog.cc
@@ -101,10 +101,23 @@ public:
         row = *(combo_event_model->append());
         row[combo_event_col_model.m_label] = _("Throw Exception");
         row[combo_event_col_model.m_command] = "throw";
+
         row = *(combo_event_model->append());
         row[combo_event_col_model.m_label] = _("Catch Exception");
         row[combo_event_col_model.m_command] = "catch";
 
+        row = *(combo_event_model->append());
+        row[combo_event_col_model.m_label] = _("fork system call");
+        row[combo_event_col_model.m_command] = "fork";
+        
+        row = *(combo_event_model->append());
+        row[combo_event_col_model.m_label] = _("vfork system call");
+        row[combo_event_col_model.m_command] = "vfork";
+
+        row = *(combo_event_model->append());
+        row[combo_event_col_model.m_label] = _("exec system call");
+        row[combo_event_col_model.m_command] = "exec";
+
         combo_event->set_active (0);
 
         entry_filename =
diff --git a/tests/Makefile.am b/tests/Makefile.am
index a441e9c..f720cea 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -24,7 +24,8 @@ noinst_PROGRAMS= \
 $(TESTS) \
 runtestcore  runteststdout  docore inout \
 pointerderef fooprog templatedvar \
-gtkmmtest dostackoverflow bigvar threads
+gtkmmtest dostackoverflow bigvar threads \
+forkparent forkchild
 
 runtestgdbmi_SOURCES=test-gdbmi.cc
 runtestgdbmi_LDADD= @NEMIVERCOMMON_LIBS@ \
@@ -39,6 +40,12 @@ gtkmmtest_LDADD= @NEMIVERUICOMMON_LIBS@
 fooprog_SOURCES=fooprog.cc
 fooprog_LDADD=
 
+forkparent_SOURCES=fork-parent.cc
+forkparent_LDADD=
+
+forkchild_SOURCES=fork-child.cc
+forkchild_LDADD=
+
 runtestbreakpoint_SOURCES=test-breakpoint.cc
 runtestbreakpoint_LDADD= NEMIVERCOMMON_LIBS@ \
 $(top_builddir)/src/common/libnemivercommon.la
diff --git a/tests/fork-child.cc b/tests/fork-child.cc
new file mode 100644
index 0000000..36112d3
--- /dev/null
+++ b/tests/fork-child.cc
@@ -0,0 +1,8 @@
+#include <iostream>
+
+int
+main ()
+{
+    std::cout << "in the exec-ed child" << std::endl;
+    return 0;
+}
diff --git a/tests/fork-parent.cc b/tests/fork-parent.cc
new file mode 100644
index 0000000..c693e65
--- /dev/null
+++ b/tests/fork-parent.cc
@@ -0,0 +1,24 @@
+#include <unistd.h>
+#include <iostream>
+
+int
+main ()
+{
+    pid_t child_pid = 0;
+
+    child_pid = fork ();
+    if (child_pid == -1) {
+        // There was an error
+        std::cerr << "Got an error\n";
+        return -1;
+    } else if (child_pid != 0) {
+        // we are in the parent
+        std::cout << "I forked a child OK\n";
+        return 0;
+    } else {
+        // we are in the child
+        std::cout << "I was forked by my parent. About to exec now" << std::endl;
+        execve ("./forkchild", NULL, NULL);
+    }
+    return 0;
+}



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]