[nemiver] Allow breaking on fork/exec syscalls
- From: Dodji Seketeli <dodji src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [nemiver] Allow breaking on fork/exec syscalls
- Date: Sat, 17 Jul 2010 21:34:43 +0000 (UTC)
commit 01df00bc9144ace1471c02d1c12fe9dbbd7b9c55
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 6034c5b..d899de2 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
@@ -3799,7 +3798,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 0604626..b65181d 100644
--- a/src/dbgengine/nmv-gdbmi-parser.cc
+++ b/src/dbgengine/nmv-gdbmi-parser.cc
@@ -2166,7 +2166,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]