[PATCH] Support modified-breakpoint async output from GDB



Hello,

When you set a breakpoint in an inferior before running it and then
run the inferior, GDB first sets the breakpoint, and then when the
inferior starts running and all the libraries are fully loaded, GDB
possibly emits an asynchronous notification saying that the breakpoint
has been modified.

Right now Nemiver just ignores that breakpoint modification
notification.  After my last changes about the breakpoints with
multiple locations, it appears that the breakpoint modification can
actually change the number of locations of said breakpoint.  So it
looks like we really ought to support this breakpoint modification
notification thingy.

The patch below adds that support.

Tested and applied to master.

        * src/dbgengine/nmv-dbg-common.h
        (Output::OutOfBandRecord::{m_has_modified_breakpoint,
        m_modified_breakpoint): New members.
        (Output::OutOfBandRecord::{has_modified_breakpoint,
        modified_breakpoint}): New accessors.
        (Output::OutOfBandRecord::clear): Clear m_has_modified_breakpoint
        and m_modified_breakpoint.
        (Output::OutOfBandRecords): New typedef.
        * src/dbgengine/nmv-gdbmi-parser.h
        (GDBMIParser::parse_breakpoint_modified_async_output): New
        declaration.
        * src/dbgengine/nmv-gdbmi-parser.cc (CHECK_END): Re-use
        END_OF_INPUT for this macro.
        (PARSING_ERROR_IF_END): New macro.
        (PREFIX_*, NDELETED, NUMCHILD, CHANGELIST, PATH_EXPR): Make these
        global variables static.
        (PREFIX_BREAKPOINT_MODIFIED_ASYNC_OUTPUT): New static global
        variable.
        (GDBMIParser::parse_breakpoint_modified_async_output): New function.
        (GDBMIParser::parse_out_of_band_record):  New the new function
        above.
        * src/dbgengine/nmv-i-debugger.h (OverloadsChoiceEntry): New
        typedef.
        * src/dbgengine/nmv-gdb-engine.cc
        (OnBreakpointHandler::{has_modified_breakpoint,
        notify_breakpoint_deleted_signal,
        append_bp_to_cache_and_notify_bp_set): New helper functions.
        (OnBreakpointHandler::can_handle): If the output contains an
        out-of-band-record with the modified breakpoint async output then
        the OnBreakpointHandler can handle this output.
        (OnBreakpointHandler::do_handle): New the above. Detect if a
        breakpoint was modified.  If so, delete its previous version from
        the cache, notify listeners about the deletion, add the new
        version to the cache and notify listeners about the addition.
        Also, rename the has_breaks boolean into has_breaks_set.  Remove
        some trailing white space.  Use the new
        notify_breakpoint_deleted_signal to delete some old code, making
        this a bit more maintainable.
        * tests/test-gdbmi.cc (gv_breakpoint_modified_async_output0): New
        global with a modified-breakpoint async output from GDB.
        (test_breakpoint): Add testing about parsing the
        modified-breakpoint async output from GDB above.
---
 src/dbgengine/nmv-dbg-common.h    |  56 ++++++++++++----
 src/dbgengine/nmv-gdb-engine.cc   | 130 +++++++++++++++++++++++++++++++++-----
 src/dbgengine/nmv-gdbmi-parser.cc | 119 +++++++++++++++++++++++-----------
 src/dbgengine/nmv-gdbmi-parser.h  |   7 ++
 src/dbgengine/nmv-i-debugger.h    |   1 +
 tests/test-gdbmi.cc               |  12 ++++
 6 files changed, 256 insertions(+), 69 deletions(-)

diff --git a/src/dbgengine/nmv-dbg-common.h b/src/dbgengine/nmv-dbg-common.h
index 79a38fc..2645e84 100644
--- a/src/dbgengine/nmv-dbg-common.h
+++ b/src/dbgengine/nmv-dbg-common.h
@@ -277,6 +277,8 @@ public:
         long m_thread_id;
         UString m_signal_type;
         UString m_signal_meaning;
+        bool m_has_modified_breakpoint;
+        IDebugger::Breakpoint m_modified_breakpoint;
 
     public:
 
@@ -378,23 +380,49 @@ public:
 
         bool has_signal () const {return m_signal_type != "";}
 
-        /// @}
-
-        void clear ()
+        /// Getter of the "modified_breakpoint" flag.  This flag is
+        /// true if the underlying debugging engine reports that a
+        /// given breakpoint has been modified.
+        ///
+        /// @return the modified_breakpoint flag.
+        bool has_modified_breakpoint () const
+        {return m_has_modified_breakpoint;}
+
+        /// Getter of the modified breakpoint carried by this out of
+        /// band record.  What this returns is meaningful only if the
+        /// has_modified_breakpoint() member function above returns
+        /// true.
+        IDebugger::Breakpoint& modified_breakpoint ()
+        {return m_modified_breakpoint;}
+
+        /// Setter of the modified breakpoint carried by this out of
+        /// band record.
+        void modified_breakpoint (const IDebugger::Breakpoint& b)
         {
-            m_has_stream_record = false;
-            m_stream_record.clear ();
-            m_is_stopped = false;
-            m_is_running = false;
-            m_stop_reason = IDebugger::UNDEFINED_REASON;
-            m_has_frame = false;
-            m_thread_selected = false;
-            m_frame.clear ();
-            m_breakpoint_number = 0;
-            m_thread_id = -1;
-            m_signal_type.clear ();
+            m_modified_breakpoint = b;
+            m_has_modified_breakpoint = true;
         }
+
+        /// @}
+
+       void clear ()
+       {
+           m_has_stream_record = false;
+           m_stream_record.clear ();
+           m_is_stopped = false;
+           m_is_running = false;
+           m_stop_reason = IDebugger::UNDEFINED_REASON;
+           m_has_frame = false;
+           m_thread_selected = false;
+           m_frame.clear ();
+           m_breakpoint_number = 0;
+           m_thread_id = -1;
+           m_signal_type.clear ();
+           m_has_modified_breakpoint = 0;
+           m_modified_breakpoint.clear();
+       }
     };//end class OutOfBandRecord
+    typedef list<OutOfBandRecord> OutOfBandRecords;
 
     /// \debugger result record
     ///
diff --git a/src/dbgengine/nmv-gdb-engine.cc b/src/dbgengine/nmv-gdb-engine.cc
index 7dcf196..68e181f 100644
--- a/src/dbgengine/nmv-gdb-engine.cc
+++ b/src/dbgengine/nmv-gdb-engine.cc
@@ -1494,10 +1494,93 @@ struct OnBreakpointHandler: OutputHandler {
         return false;
     }
 
-    bool can_handle (CommandAndOutput &a_in)
+    /// \return true if the output has an out of band containing a
+    /// breakpoint-modified async output, and if so, set an iterator
+    /// over the out of band record that contains the first modified
+    /// breakpoint.
+    ///
+    /// \param a_in the debugging command sent and its output.
+    ///
+    /// \param b_ib out parameter.  Set to the out of band record that
+    /// contains the modified breakpoint, iff the function returned
+    /// true.
+    bool
+    has_modified_breakpoint (CommandAndOutput &a_in,
+                             Output::OutOfBandRecords::iterator &b_i) const
+    {
+        for (Output::OutOfBandRecords::iterator i =
+                 a_in.output ().out_of_band_records ().begin ();
+             i != a_in.output ().out_of_band_records ().end ();
+             ++i) {
+            if (i->has_modified_breakpoint ()) {
+                b_i = i;
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /// \param a_in command sent and its output.
+    ///
+    /// \return true if there is an out of band record that contains a
+    /// modified breakpoint.
+    bool
+    has_modified_breakpoint (CommandAndOutput &a_in) const
+    {
+        Output::OutOfBandRecords::iterator i;
+        return has_modified_breakpoint (a_in, i);
+    }
+
+    /// Look if we have a breakpoint of a given id in the cache.  If
+    /// so, notify listeners that the breakpoint has been deleted and
+    /// delete it from the cache and return true.
+    ///
+    /// \param bp_id the id of the breakpoint to consider.
+    ///
+    /// \return true if the breakpoint has been found in the cache,
+    /// the listeners were notified about its deletion and it was
+    /// deleted from the cache.
+    bool
+    notify_breakpoint_deleted_signal (const string &bp_id)
+    {
+        map<string, IDebugger::Breakpoint>::iterator iter;
+        map<string, IDebugger::Breakpoint> &breaks =
+            m_engine->get_cached_breakpoints ();
+        iter = breaks.find (bp_id);
+        if (iter != breaks.end ()) {
+            LOG_DD ("firing IDebugger::breakpoint_deleted_signal()");
+            m_engine->breakpoint_deleted_signal ().emit (iter->second,
+                                                         iter->first,
+                                                         "");
+            breaks.erase (iter);
+            return true;
+        }
+        return false;
+    }
+
+    /// Append a breakpoint to the cache and notify the listeners that
+    /// this new breakpoint was set.
+    ///
+    /// \param b the breakpoint to add to the cache and to notify the
+    /// listeners about.
+    void
+    append_bp_to_cache_and_notify_bp_set (IDebugger::Breakpoint &b)
+    {
+        LOG_DD ("Adding bp " << b.id () << "to cache");
+        m_engine->append_breakpoint_to_cache (b);
+
+        map<string, IDebugger::Breakpoint> bps;
+        bps[b.id ()] = b;
+        LOG_DD ("Firing bp " << b.id() << " set");
+        m_engine->breakpoints_set_signal ().emit (bps, "");
+    }
+
+    bool
+    can_handle (CommandAndOutput &a_in)
     {
         if (!a_in.output ().has_result_record ()
-            && !has_overloads_prompt (a_in)) {
+            && !has_overloads_prompt (a_in)
+            && !has_modified_breakpoint (a_in)) {
             return false;
         }
         LOG_DD ("handler selected");
@@ -1532,7 +1615,30 @@ struct OnBreakpointHandler: OutputHandler {
             return;
         }
 
-        bool has_breaks = false;
+        // If there is modified breakpoint, delete its previous
+        // version from the cache, notify the listeners about its
+        // deletion, add the new version to the cache and notify the
+        // listeners about its addition.
+        {
+            Output::OutOfBandRecords::iterator i, end;
+            if (has_modified_breakpoint (a_in, i)) {
+                LOG_DD ("has modified breakpoints!");
+                end = a_in.output ().out_of_band_records ().end ();
+                for (; i != end; ++i) {
+                    if (!i->has_modified_breakpoint ())
+                        continue;
+                    IDebugger::Breakpoint &b = i->modified_breakpoint ();
+                    LOG_DD ("bp " << b.id () << ": notify deleted");
+                    notify_breakpoint_deleted_signal (b.id ());
+                    LOG_DD ("bp "
+                            << b.id ()
+                            << ": add to cache and notify set");
+                    append_bp_to_cache_and_notify_bp_set (b);
+                }
+            }
+        }
+
+        bool has_breaks_set = false;
         //if breakpoint where set, put them in cache !
         if (has_breakpoints_set (a_in)) {
             LOG_DD ("adding BPs to cache");
@@ -1546,10 +1652,10 @@ struct OnBreakpointHandler: OutputHandler {
                      breakpoints ().begin ()->second.id (),
                      true);
             }
-            has_breaks = true;
+            has_breaks_set = true;
         }
 
-        if (has_breaks
+        if (has_breaks_set
             && (a_in.command ().name () == "set-breakpoint"
                 || a_in.command ().name () == "set-countpoint")) {
             // We are getting this reply b/c we did set a breakpoint;
@@ -1575,7 +1681,6 @@ struct OnBreakpointHandler: OutputHandler {
             == Output::ResultRecord::DONE
             && a_in.command ().value ().find ("-break-delete")
             != Glib::ustring::npos) {
-
             LOG_DD ("detected break-delete");
             UString tmp = a_in.command ().value ();
             tmp = tmp.erase (0, 13);
@@ -1583,23 +1688,14 @@ struct OnBreakpointHandler: OutputHandler {
             tmp.chomp ();
             string bkpt_number = tmp;
             if (!bkpt_number.empty ()) {
-                map<string, IDebugger::Breakpoint>::iterator iter;
-                map<string, IDebugger::Breakpoint> &breaks =
-                                        m_engine->get_cached_breakpoints ();
-                iter = breaks.find (bkpt_number);
-                if (iter != breaks.end ()) {
-                    LOG_DD ("firing IDebugger::breakpoint_deleted_signal()");
-                    m_engine->breakpoint_deleted_signal ().emit
-                    (iter->second, iter->first, a_in.command ().cookie ());
-                    breaks.erase (iter);
-                }
+                notify_breakpoint_deleted_signal (bkpt_number);
                 m_engine->set_state (IDebugger::READY);
             } else {
                 LOG_ERROR ("Got deleted breakpoint number '"
                            << tmp
                            << "', but that's not a well formed number, dude.");
             }
-        } else if (has_breaks) {
+        } else if (has_breaks_set) {
             LOG_DD ("firing IDebugger::breakpoints_list_signal(), after command: "
                     << a_in.command ().name ());
             m_engine->breakpoints_list_signal ().emit
diff --git a/src/dbgengine/nmv-gdbmi-parser.cc b/src/dbgengine/nmv-gdbmi-parser.cc
index 9f651e0..d414d5d 100644
--- a/src/dbgengine/nmv-gdbmi-parser.cc
+++ b/src/dbgengine/nmv-gdbmi-parser.cc
@@ -54,12 +54,20 @@ LOG_ERROR ("parsing failed for buf: >>>" \
              << ", reason: " << msg); \
 } while (0)
 
-#define CHECK_END(a_current) \
-if ((a_current) >= (m_priv->end)) {\
-LOG_ERROR ("hit end index " << (int) m_priv->end); \
-return false;\
+#define END_OF_INPUT(cur) m_priv->index_passed_end (cur)
+
+#define CHECK_END(a_current)                                \
+    if (END_OF_INPUT (a_current)) {                         \
+        LOG_ERROR ("hit end index " << (int) m_priv->end);  \
+        return false;                                       \
 }
 
+#define PARSING_ERROR_IF_END(cur)                           \
+    if (END_OF_INPUT (cur)) {                               \
+        LOG_PARSING_ERROR (cur);                            \
+        return false;                                       \
+    }
+
 #define SKIP_WS(a_from) \
 while (!m_priv->index_passed_end (a_from)  \
        && isspace (RAW_CHAR_AT (a_from))) {     \
@@ -74,8 +82,6 @@ while (!m_priv->index_passed_end (a_from)  \
 
 #define RAW_INPUT m_priv->input.raw ()
 
-#define END_OF_INPUT(cur) m_priv->index_passed_end (cur)
-
 using namespace std;
 using namespace nemiver::common;
 
@@ -120,38 +126,39 @@ GDBMITuple::clear ()
 // *******************************
 
 // prefixes of command output records.
-const char* PREFIX_DONE = "^done";
-const char* PREFIX_RUNNING = "^running";
-const char* PREFIX_EXIT = "^exit";
-const char* PREFIX_CONNECTED = "^connected";
-const char* PREFIX_ERROR = "^error";
-const char* PREFIX_BKPT = "bkpt={";
-const char* PREFIX_BREAKPOINT_TABLE = "BreakpointTable={";
-const char* PREFIX_THREAD_IDS = "thread-ids={";
-const char* PREFIX_NEW_THREAD_ID = "new-thread-id=\"";
-const char* PREFIX_FILES = "files=[";
-const char* PREFIX_STACK = "stack=[";
-const char* PREFIX_FRAME = "frame={";
-const char* PREFIX_DEPTH = "depth=\"";
-const char* PREFIX_STACK_ARGS = "stack-args=[";
-const char* PREFIX_LOCALS = "locals=[";
-const char* PREFIX_VALUE = "value=\"";
-const char* PREFIX_REGISTER_NAMES = "register-names=";
-const char* PREFIX_CHANGED_REGISTERS = "changed-registers=";
-const char* PREFIX_REGISTER_VALUES = "register-values=";
-const char* PREFIX_MEMORY_VALUES = "addr=";
-const char* PREFIX_RUNNING_ASYNC_OUTPUT = "*running,";
-const char* PREFIX_STOPPED_ASYNC_OUTPUT = "*stopped,";
-const char* PREFIX_THREAD_SELECTED_ASYNC_OUTPUT = "=thread-selected,";
-const char* PREFIX_NAME = "name=\"";
-const char* PREFIX_VARIABLE_DELETED = "ndeleted=\"";
-const char* NDELETED = "ndeleted";
-const char* PREFIX_NUMCHILD = "numchild=\"";
-const char* NUMCHILD = "numchild";
-const char* PREFIX_VARIABLES_CHANGED_LIST = "changelist=[";
-const char* CHANGELIST = "changelist";
-const char* PREFIX_PATH_EXPR = "path_expr=";
-const char* PATH_EXPR = "path_expr";
+static const char* PREFIX_DONE = "^done";
+static const char* PREFIX_RUNNING = "^running";
+static const char* PREFIX_EXIT = "^exit";
+static const char* PREFIX_CONNECTED = "^connected";
+static const char* PREFIX_ERROR = "^error";
+static const char* PREFIX_BKPT = "bkpt={";
+static const char* PREFIX_BREAKPOINT_TABLE = "BreakpointTable={";
+static const char* PREFIX_BREAKPOINT_MODIFIED_ASYNC_OUTPUT = "=breakpoint-modified,";
+static const char* PREFIX_THREAD_IDS = "thread-ids={";
+static const char* PREFIX_NEW_THREAD_ID = "new-thread-id=\"";
+static const char* PREFIX_FILES = "files=[";
+static const char* PREFIX_STACK = "stack=[";
+static const char* PREFIX_FRAME = "frame={";
+static const char* PREFIX_DEPTH = "depth=\"";
+static const char* PREFIX_STACK_ARGS = "stack-args=[";
+static const char* PREFIX_LOCALS = "locals=[";
+static const char* PREFIX_VALUE = "value=\"";
+static const char* PREFIX_REGISTER_NAMES = "register-names=";
+static const char* PREFIX_CHANGED_REGISTERS = "changed-registers=";
+static const char* PREFIX_REGISTER_VALUES = "register-values=";
+static const char* PREFIX_MEMORY_VALUES = "addr=";
+static const char* PREFIX_RUNNING_ASYNC_OUTPUT = "*running,";
+static const char* PREFIX_STOPPED_ASYNC_OUTPUT = "*stopped,";
+static const char* PREFIX_THREAD_SELECTED_ASYNC_OUTPUT = "=thread-selected,";
+static const char* PREFIX_NAME = "name=\"";
+static const char* PREFIX_VARIABLE_DELETED = "ndeleted=\"";
+static const char* NDELETED = "ndeleted";
+static const char* PREFIX_NUMCHILD = "numchild=\"";
+static const char* NUMCHILD = "numchild";
+static const char* PREFIX_VARIABLES_CHANGED_LIST = "changelist=[";
+static const char* CHANGELIST = "changelist";
+static const char* PREFIX_PATH_EXPR = "path_expr=";
+static const char* PATH_EXPR = "path_expr";
 static const char* PREFIX_ASM_INSTRUCTIONS= "asm_insns=";
 const char* PREFIX_VARIABLE_FORMAT = "format=";
 
@@ -1800,6 +1807,20 @@ GDBMIParser::parse_out_of_band_record (UString::size_type a_from,
         goto end;
     }
 
+    if (!RAW_INPUT.compare (cur,
+                            strlen (PREFIX_BREAKPOINT_MODIFIED_ASYNC_OUTPUT),
+                            PREFIX_BREAKPOINT_MODIFIED_ASYNC_OUTPUT)) {
+        IDebugger::Breakpoint bp;
+        if (!parse_breakpoint_modified_async_output (cur, cur, bp)) {
+            LOG_PARSING_ERROR_MSG (cur,
+                                   "could not parse the expected "
+                                   "breakpoint modifed async output");
+            return false;
+        }
+        record.modified_breakpoint (bp);
+        goto end;
+    }
+
     if (RAW_CHAR_AT (cur) == '=' || RAW_CHAR_AT (cur) == '*') {
        //this is an unknown async notification sent by gdb.
        //For now, the only one
@@ -2501,6 +2522,28 @@ GDBMIParser::parse_breakpoint_table (UString::size_type a_from,
 }
 
 bool
+GDBMIParser::parse_breakpoint_modified_async_output (UString::size_type a_from,
+                                                     UString::size_type &a_to,
+                                                     IDebugger::Breakpoint &a_b)
+{
+    LOG_FUNCTION_SCOPE_NORMAL_DD;
+
+    UString::size_type cur = a_from;
+
+    int prefix_len = strlen (PREFIX_BREAKPOINT_MODIFIED_ASYNC_OUTPUT);
+    if (RAW_INPUT.compare (cur, prefix_len,
+                           PREFIX_BREAKPOINT_MODIFIED_ASYNC_OUTPUT)) {
+        LOG_PARSING_ERROR (cur);
+        return false;
+    }
+
+    cur += prefix_len;
+    PARSING_ERROR_IF_END (cur);
+
+    return parse_breakpoint (cur, a_to, a_b);
+}
+
+bool
 GDBMIParser::parse_threads_list (UString::size_type a_from,
                                  UString::size_type &a_to,
                                  std::list<int> &a_thread_ids)
diff --git a/src/dbgengine/nmv-gdbmi-parser.h b/src/dbgengine/nmv-gdbmi-parser.h
index f0e6cc1..aea914d 100644
--- a/src/dbgengine/nmv-gdbmi-parser.h
+++ b/src/dbgengine/nmv-gdbmi-parser.h
@@ -533,6 +533,13 @@ public:
                                  UString::size_type &a_to,
                                  map<string, IDebugger::Breakpoint> &a_breakpoints);
 
+    /// Parse a GDB/MI async output that says that a breakpoint that
+    /// was set (e.g before the inferior is run) has changed (e.g
+    /// after the inferior started to run).
+    bool parse_breakpoint_modified_async_output (UString::size_type a_from,
+                                                 UString::size_type &a_to,
+                                                 IDebugger::Breakpoint &a_b);
+
     /// parses the result of the gdbmi command
     /// "-thread-list-ids".
     bool parse_threads_list (UString::size_type a_from,
diff --git a/src/dbgengine/nmv-i-debugger.h b/src/dbgengine/nmv-i-debugger.h
index 9e05e10..63e2639 100644
--- a/src/dbgengine/nmv-i-debugger.h
+++ b/src/dbgengine/nmv-i-debugger.h
@@ -362,6 +362,7 @@ public:
         int line_number () const {return m_line_number;}
         void line_number (int a_in) {m_line_number = a_in;}
     };//end class OverloadsChoiceEntry
+    typedef vector<OverloadsChoiceEntry> OverloadsChoiceEntries;
 
     class Variable;
     typedef SafePtr<Variable, ObjectRef, ObjectUnref> VariableSafePtr;
diff --git a/tests/test-gdbmi.cc b/tests/test-gdbmi.cc
index 2f48c44..6f5edc5 100644
--- a/tests/test-gdbmi.cc
+++ b/tests/test-gdbmi.cc
@@ -168,6 +168,9 @@ static const char* gv_breakpoint2 =
 static const char* gv_breakpoint3 =
     
"bkpt={number=\"2\",type=\"breakpoint\",disp=\"keep\",enabled=\"y\",addr=\"<MULTIPLE>\",times=\"0\",original-location=\"error\"},{number=\"2.1\",enabled=\"y\",addr=\"0x000000000132d2f7\",func=\"error(char
 
const*,...)\",file=\"/home/dodji/git/gcc/PR56782/gcc/diagnostic.c\",fullname=\"/home/dodji/git/gcc/PR56782/gcc/diagnostic.c\",line=\"1038\"},{number=\"2.2\",enabled=\"y\",addr=\"0x00000032026f1490\",at=\"<error>\"}";
 
+static const char* gv_breakpoint_modified_async_output0 =
+    
"=breakpoint-modified,bkpt={number=\"2\",type=\"breakpoint\",disp=\"keep\",enabled=\"y\",addr=\"<MULTIPLE>\",times=\"0\",original-location=\"/home/dodji/git/libabigail/abi-diff/include/abg-diff-utils.h:1322\"},{number=\"2.1\",enabled=\"y\",addr=\"0x00007ffff7d70922\",func=\"abigail::diff_utils::compute_diff<__gnu_cxx::__normal_iterator<std::tr1::shared_ptr<abigail::class_decl::base_spec>
 const*, std::vector<std::tr1::shared_ptr<abigail::class_decl::base_spec>, 
std::allocator<std::tr1::shared_ptr<abigail::class_decl::base_spec> > > > 
(__gnu_cxx::__normal_iterator<std::tr1::shared_ptr<abigail::class_decl::base_spec> const*, 
std::vector<std::tr1::shared_ptr<abigail::class_decl::base_spec>, 
std::allocator<std::tr1::shared_ptr<abigail::class_decl::base_spec> > > >, 
__gnu_cxx::__normal_iterator<std::tr1::shared_ptr<abigail::class_decl::base_spec> const*, 
std::vector<std::tr1::shared_ptr<abigail::class_decl::base_spec>, 
std::allocator<std::tr1::shared_ptr<abigail::class_decl::base_spec> > > >, 
__gnu_cxx::__normal_iterator<std::tr1::shared_ptr<abigail::class_decl::base_spec> const*, 
std::vector<std::tr1::shared_ptr<abigail::class_decl::base_spec>, 
std::allocator<std::tr1::shared_ptr<abigail::class_decl::base_spec> > > >, 
__gnu_cxx::__normal_iterator<std::tr1::shared_ptr<abigail::class_decl::base_spec> const*, 
std::vector<std::tr1::shared_ptr<abigail::class_decl::base_spec>, 
std::allocator<std::tr1::shared_ptr<abigail::class_decl::base_spec> > > >, 
__gnu_cxx::__normal_iterator<std::tr1::shared_ptr<abigail::class_decl::base_spec> const*, 
std::vector<std::tr1::shared_ptr<abigail::class_decl::base_spec>, 
std::allocator<std::tr1::shared_ptr<abigail::class_decl::base_spec> > > >, 
__gnu_cxx::__normal_iterator<std::tr1::shared_ptr<abigail::class_decl::base_spec> const*, 
std::vector<std::tr1::shared_ptr<abigail::class_decl::base_spec>, 
std::allocator<std::tr1::shared_ptr<abigail::class_decl::base_spec> > > >, 
std::vector<abigail::diff_utils::point, std::allocator<abigail::diff_utils::point> >&, 
abigail::diff_utils::edit_script&, 
int&)\",file=\"/home/dodji/git/libabigail/abi-diff/build/../include/abg-diff-utils.h\",fullname=\"/home/dodji/git/libabigail/abi-diff/include/abg-diff-utils.h\",line=\"1322\"},{number=\"2.2\",enabled=\"y\",addr=\"0x00007ffff7d71536\",func=\"abigail::diff_utils::compute_diff<__gnu_cxx::__normal_iterator<std::tr1::shared_ptr<abigail::class_decl::member_type>
 const*, std::vector<std::tr1::shared_ptr<abigail::class_decl::member_type>, 
std::allocator<std::tr1::shared_ptr<abigail::class_decl::member_type> > > > 
(__gnu_cxx::__normal_iterator<std::tr1::shared_ptr<abigail::class_decl::member_type> const*, 
std::vector<std::tr1::shared_ptr<abigail::class_decl::member_type>, 
std::allocator<std::tr1::shared_ptr<abigail::class_decl::member_type> > > >, 
__gnu_cxx::__normal_iterator<std::tr1::shared_ptr<abigail::class_decl::member_type> const*, 
std::vector<std::tr1::shared_ptr<abigail::class_decl::member_type>, 
std::allocator<std::tr1::shared_ptr<abigail::class_decl::member_type> > > >, 
__gnu_cxx::__normal_iterator<std::tr1::shared_ptr<abigail::class_decl::member_type> const*, 
std::vector<std::tr1::shared_ptr<abigail::class_decl::member_type>, 
std::allocator<std::tr1::shared_ptr<abigail::class_decl::member_type> > > >, 
__gnu_cxx::__normal_iterator<std::tr1::shared_ptr<abigail::class_decl::member_type> const*, 
std::vector<std::tr1::shared_ptr<abigail::class_decl::member_type>, 
std::allocator<std::tr1::shared_ptr<abigail::class_decl::member_type> > > >, 
__gnu_cxx::__normal_iterator<std::tr1::shared_ptr<abigail::class_decl::member_type> const*, 
std::vector<std::tr1::shared_ptr<abigail::class_decl::member_type>, 
std::allocator<std::tr1::shared_ptr<abigail::class_decl::member_type> > > >, 
__gnu_cxx::__normal_iterator<std::tr1::shared_ptr<abigail::class_decl::member_type> const*, 
std::vector<std::tr1::shared_ptr<abigail::class_decl::member_type>, 
std::allocator<std::tr1::shared_ptr<abigail::class_decl::member_type> > > >, 
std::vector<abigail::diff_utils::point, std::allocator<abigail::diff_utils::point> >&, 
abigail::diff_utils::edit_script&, 
int&)\",file=\"/home/dodji/git/libabigail/abi-diff/build/../include/abg-diff-utils.h\",fullname=\"/home/dodji/git/libabigail/abi-diff/include/abg-diff-utils.h\",line=\"1322\"},{number=\"2.3\",enabled=\"y\",addr=\"0x00007ffff7d7214a\",func=\"abigail::diff_utils::compute_diff<__gnu_cxx::__normal_iterator<std::tr1::shared_ptr<abigail::class_decl::data_member>
 const*, std::vector<std::tr1::shared_ptr<abigail::class_decl::data_member>, 
std::allocator<std::tr1::shared_ptr<abigail::class_decl::data_member> > > > 
(__gnu_cxx::__normal_iterator<std::tr1::shared_ptr<abigail::class_decl::data_member> const*, 
std::vector<std::tr1::shared_ptr<abigail::class_decl::data_member>, 
std::allocator<std::tr1::shared_ptr<abigail::class_decl::data_member> > > >, 
__gnu_cxx::__normal_iterator<std::tr1::shared_ptr<abigail::class_decl::data_member> const*, 
std::vector<std::tr1::shared_ptr<abigail::class_decl::data_member>, 
std::allocator<std::tr1::shared_ptr<abigail::class_decl::data_member> > > >, 
__gnu_cxx::__normal_iterator<std::tr1::shared_ptr<abigail::class_decl::data_member> const*, 
std::vector<std::tr1::shared_ptr<abigail::class_decl::data_member>, 
std::allocator<std::tr1::shared_ptr<abigail::class_decl::data_member> > > >, 
__gnu_cxx::__normal_iterator<std::tr1::shared_ptr<abigail::class_decl::data_member> const*, 
std::vector<std::tr1::shared_ptr<abigail::class_decl::data_member>, 
std::allocator<std::tr1::shared_ptr<abigail::class_decl::data_member> > > >, 
__gnu_cxx::__normal_iterator<std::tr1::shared_ptr<abigail::class_decl::data_member> const*, 
std::vector<std::tr1::shared_ptr<abigail::class_decl::data_member>, 
std::allocator<std::tr1::shared_ptr<abigail::class_decl::data_member> > > >, 
__gnu_cxx::__normal_iterator<std::tr1::shared_ptr<abigail::class_decl::data_member> const*, 
std::vector<std::tr1::shared_ptr<abigail::class_decl::data_member>, 
std::allocator<std::tr1::shared_ptr<abigail::class_decl::data_member> > > >, 
std::vector<abigail::diff_utils::point, std::allocator<abigail::diff_utils::point> >&, 
abigail::diff_utils::edit_script&, 
int&)\",file=\"/home/dodji/git/libabigail/abi-diff/build/../include/abg-diff-utils.h\",fullname=\"/home/dodji/git/libabigail/abi-diff/include/abg-diff-utils.h\",line=\"1322\"},{number=\"2.4\",enabled=\"y\",addr=\"0x00007ffff7d72d5e\",func=\"abigail::diff_utils::compute_diff<__gnu_cxx::__normal_iterator<std::tr1::shared_ptr<abigail::class_decl::member_function>
 const*, std::vector<std::tr1::shared_ptr<abigail::class_decl::member_function>, 
std::allocator<std::tr1::shared_ptr<abigail::class_decl::member_function> > > > 
(__gnu_cxx::__normal_iterator<std::tr1::shared_ptr<abigail::class_decl::member_function> const*, 
std::vector<std::tr1::shared_ptr<abigail::class_decl::member_function>, 
std::allocator<std::tr1::shared_ptr<abigail::class_decl::member_function> > > >, 
__gnu_cxx::__normal_iterator<std::tr1::shared_ptr<abigail::class_decl::member_function> const*, 
std::vector<std::tr1::shared_ptr<abigail::class_decl::member_function>, 
std::allocator<std::tr1::shared_ptr<abigail::class_decl::member_function> > > >, 
__gnu_cxx::__normal_iterator<std::tr1::shared_ptr<abigail::class_decl::member_function> const*, 
std::vector<std::tr1::shared_ptr<abigail::class_decl::member_function>, 
std::allocator<std::tr1::shared_ptr<abigail::class_decl::member_function> > > >, 
__gnu_cxx::__normal_iterator<std::tr1::shared_ptr<abigail::class_decl::member_function> const*, 
std::vector<std::tr1::shared_ptr<abigail::class_decl::member_function>, 
std::allocator<std::tr1::shared_ptr<abigail::class_decl::member_function> > > >, 
__gnu_cxx::__normal_iterator<std::tr1::shared_ptr<abigail::class_decl::member_function> const*, 
std::vector<std::tr1::shared_ptr<abigail::class_decl::member_function>, 
std::allocator<std::tr1::shared_ptr<abigail::class_decl::member_function> > > >, 
__gnu_cxx::__normal_iterator<std::tr1::shared_ptr<abigail::class_decl::member_function> const*, 
std::vector<std::tr1::shared_ptr<abigail::class_decl::member_function>, 
std::allocator<std::tr1::shared_ptr<abigail::class_decl::member_function> > > >, 
std::vector<abigail::diff_utils::point, std::allocator<abigail::diff_utils::point> >&, 
abigail::diff_utils::edit_script&, 
int&)\",file=\"/home/dodji/git/libabigail/abi-diff/build/../include/abg-diff-utils.h\",fullname=\"/home/dodji/git/libabigail/abi-diff/include/abg-diff-utils.h\",line=\"1322\"},{number=\"2.5\",enabled=\"y\",addr=\"0x00007ffff7d73972\",func=\"abigail::diff_utils::compute_diff<__gnu_cxx::__normal_iterator<std::tr1::shared_ptr<abigail::class_decl::member_function_template>
 const*, std::vector<std::tr1::shared_ptr<abigail::class_decl::member_function_template>, 
std::allocator<std::tr1::shared_ptr<abigail::class_decl::member_function_template> > > > 
(__gnu_cxx::__normal_iterator<std::tr1::shared_ptr<abigail::class_decl::member_function_template> const*, 
std::vector<std::tr1::shared_ptr<abigail::class_decl::member_function_template>, 
std::allocator<std::tr1::shared_ptr<abigail::class_decl::member_function_template> > > >, 
__gnu_cxx::__normal_iterator<std::tr1::shared_ptr<abigail::class_decl::member_function_template> const*, 
std::vector<std::tr1::shared_ptr<abigail::class_decl::member_function_template>, 
std::allocator<std::tr1::shared_ptr<abigail::class_decl::member_function_template> > > >, 
__gnu_cxx::__normal_iterator<std::tr1::shared_ptr<abigail::class_decl::member_function_template> const*, 
std::vector<std::tr1::shared_ptr<abigail::class_decl::member_function_template>, 
std::allocator<std::tr1::shared_ptr<abigail::class_decl::member_function_template> > > >, 
__gnu_cxx::__normal_iterator<std::tr1::shared_ptr<abigail::class_decl::member_function_template> const*, 
std::vector<std::tr1::shared_ptr<abigail::class_decl::member_function_template>, 
std::allocator<std::tr1::shared_ptr<abigail::class_decl::member_function_template> > > >, 
__gnu_cxx::__normal_iterator<std::tr1::shared_ptr<abigail::class_decl::member_function_template> const*, 
std::vector<std::tr1::shared_ptr<abigail::class_decl::member_function_template>, 
std::allocator<std::tr1::shared_ptr<abigail::class_decl::member_function_template> > > >, 
__gnu_cxx::__normal_iterator<std::tr1::shared_ptr<abigail::class_decl::member_function_template> const*, 
std::vector<std::tr1::shared_ptr<abigail::class_decl::member_function_template>, 
std::allocator<std::tr1::shared_ptr<abigail::class_decl::member_function_template> > > >, 
std::vector<abigail::diff_utils::point, std::allocator<abigail::diff_utils::point> >&, 
abigail::diff_utils::edit_script&, 
int&)\",file=\"/home/dodji/git/libabigail/abi-diff/build/../include/abg-diff-utils.h\",fullname=\"/home/dodji/git/libabigail/abi-diff/include/abg-diff-utils.h\",line=\"1322\"},{number=\"2.6\",enabled=\"y\",addr=\"0x00007ffff7d74586\",func=\"abigail::diff_utils::compute_diff<__gnu_cxx::__normal_iterator<std::tr1::shared_ptr<abigail::class_decl::member_class_template>
 const*, std::vector<std::tr1::shared_ptr<abigail::class_decl::member_class_template>, 
std::allocator<std::tr1::shared_ptr<abigail::class_decl::member_class_template> > > > 
(__gnu_cxx::__normal_iterator<std::tr1::shared_ptr<abigail::class_decl::member_class_template> const*, 
std::vector<std::tr1::shared_ptr<abigail::class_decl::member_class_template>, 
std::allocator<std::tr1::shared_ptr<abigail::class_decl::member_class_template> > > >, 
__gnu_cxx::__normal_iterator<std::tr1::shared_ptr<abigail::class_decl::member_class_template> const*, 
std::vector<std::tr1::shared_ptr<abigail::class_decl::member_class_template>, 
std::allocator<std::tr1::shared_ptr<abigail::class_decl::member_class_template> > > >, 
__gnu_cxx::__normal_iterator<std::tr1::shared_ptr<abigail::class_decl::member_class_template> const*, 
std::vector<std::tr1::shared_ptr<abigail::class_decl::member_class_template>, 
std::allocator<std::tr1::shared_ptr<abigail::class_decl::member_class_template> > > >, 
__gnu_cxx::__normal_iterator<std::tr1::shared_ptr<abigail::class_decl::member_class_template> const*, 
std::vector<std::tr1::shared_ptr<abigail::class_decl::member_class_template>, 
std::allocator<std::tr1::shared_ptr<abigail::class_decl::member_class_template> > > >, 
__gnu_cxx::__normal_iterator<std::tr1::shared_ptr<abigail::class_decl::member_class_template> const*, 
std::vector<std::tr1::shared_ptr<abigail::class_decl::member_class_template>, 
std::allocator<std::tr1::shared_ptr<abigail::class_decl::member_class_template> > > >, 
__gnu_cxx::__normal_iterator<std::tr1::shared_ptr<abigail::class_decl::member_class_template> const*, 
std::vector<std::tr1::shared_ptr<abigail::class_decl::member_class_template>, 
std::allocator<std::tr1::shared_ptr<abigail::class_decl::member_class_template> > > >, 
std::vector<abigail::diff_utils::point, std::allocator<abigail::diff_utils::point> >&, 
abigail::diff_utils::edit_script&, 
int&)\",file=\"/home/dodji/git/libabigail/abi-diff/build/../include/abg-diff-utils.h\",fullname=\"/home/dodji/git/libabigail/abi-diff/include/abg-diff-utils.h\",line=\"1322\"},{number=\"2.7\",enabled=\"y\",addr=\"0x00007ffff7d75928\",func=\"abigail::diff_utils::compute_diff<__gnu_cxx::__normal_iterator<std::tr1::shared_ptr<abigail::decl_base>
 const*, std::vector<std::tr1::shared_ptr<abigail::decl_base>, 
std::allocator<std::tr1::shared_ptr<abigail::decl_base> > > > 
(__gnu_cxx::__normal_iterator<std::tr1::shared_ptr<abigail::decl_base> const*, 
std::vector<std::tr1::shared_ptr<abigail::decl_base>, std::allocator<std::tr1::shared_ptr<abigail::decl_base> 
, __gnu_cxx::__normal_iterator<std::tr1::shared_ptr<abigail::decl_base> const*, 
std::vector<std::tr1::shared_ptr<abigail::decl_base>, std::allocator<std::tr1::shared_ptr<abigail::decl_base> 
, __gnu_cxx::__normal_iterator<std::tr1::shared_ptr<abigail::decl_base> const*, 
std::vector<std::tr1::shared_ptr<abigail::decl_base>, std::allocator<std::tr1::shared_ptr<abigail::decl_base> 
, __gnu_cxx::__normal_iterator<std::tr1::shared_ptr<abigail::decl_base> const*, 
std::vector<std::tr1::shared_ptr<abigail::decl_base>, std::allocator<std::tr1::shared_ptr<abigail::decl_base> 
, __gnu_cxx::__normal_iterator<std::tr1::shared_ptr<abigail::decl_base> const*, 
std::vector<std::tr1::shared_ptr<abigail::decl_base>, std::allocator<std::tr1::shared_ptr<abigail::decl_base> 
, __gnu_cxx::__normal_iterator<std::tr1::shared_ptr<abigail::decl_base> const*, 
std::vector<std::tr1::shared_ptr<abigail::decl_base>, std::allocator<std::tr1::shared_ptr<abigail::decl_base> 
, std::vector<abigail::diff_utils::point, std::allocator<abigail::diff_utils::point> >&, 
abigail::diff_utils::edit_script&, 
int&)\",file=\"/home/dodji/git/libabigail/abi-diff/build/../include/abg-diff-utils.h\",fullname=\"/home/dodji/git/libabigail/abi-diff/include/abg-diff-utils.h\",line=\"1322\"},{number=\"2.8\",enabled=\"y\",addr=\"0x00007ffff7d76f1a\",func=\"abigail::diff_utils::compute_diff<__gnu_cxx::__normal_iterator<std::tr1::shared_ptr<abigail::function_decl::parameter>
 const*, std::vector<std::tr1::shared_ptr<abigail::function_decl::parameter>, 
std::allocator<std::tr1::shared_ptr<abigail::function_decl::parameter> > > > 
(__gnu_cxx::__normal_iterator<std::tr1::shared_ptr<abigail::function_decl::parameter> const*, 
std::vector<std::tr1::shared_ptr<abigail::function_decl::parameter>, 
std::allocator<std::tr1::shared_ptr<abigail::function_decl::parameter> > > >, 
__gnu_cxx::__normal_iterator<std::tr1::shared_ptr<abigail::function_decl::parameter> const*, 
std::vector<std::tr1::shared_ptr<abigail::function_decl::parameter>, 
std::allocator<std::tr1::shared_ptr<abigail::function_decl::parameter> > > >, 
__gnu_cxx::__normal_iterator<std::tr1::shared_ptr<abigail::function_decl::parameter> const*, 
std::vector<std::tr1::shared_ptr<abigail::function_decl::parameter>, 
std::allocator<std::tr1::shared_ptr<abigail::function_decl::parameter> > > >, 
__gnu_cxx::__normal_iterator<std::tr1::shared_ptr<abigail::function_decl::parameter> const*, 
std::vector<std::tr1::shared_ptr<abigail::function_decl::parameter>, 
std::allocator<std::tr1::shared_ptr<abigail::function_decl::parameter> > > >, 
__gnu_cxx::__normal_iterator<std::tr1::shared_ptr<abigail::function_decl::parameter> const*, 
std::vector<std::tr1::shared_ptr<abigail::function_decl::parameter>, 
std::allocator<std::tr1::shared_ptr<abigail::function_decl::parameter> > > >, 
__gnu_cxx::__normal_iterator<std::tr1::shared_ptr<abigail::function_decl::parameter> const*, 
std::vector<std::tr1::shared_ptr<abigail::function_decl::parameter>, 
std::allocator<std::tr1::shared_ptr<abigail::function_decl::parameter> > > >, 
std::vector<abigail::diff_utils::point, std::allocator<abigail::diff_utils::point> >&, 
abigail::diff_utils::edit_script&, 
int&)\",file=\"/home/dodji/git/libabigail/abi-diff/build/../include/abg-diff-utils.h\",fullname=\"/home/dodji/git/libabigail/abi-diff/include/abg-diff-utils.h\",line=\"1322\"},{number=\"2.9\",enabled=\"y\",addr=\"0x00007ffff7d77b2e\",func=\"abigail::diff_utils::compute_diff<__gnu_cxx::__normal_iterator<char*,
 std::vector<char, std::allocator<char> > > >(__gnu_cxx::__normal_iterator<char*, std::vector<char, 
std::allocator<char> > >, __gnu_cxx::__normal_iterator<char*, std::vector<char, std::allocator<char> > >, 
__gnu_cxx::__normal_iterator<char*, std::vector<char, std::allocator<char> > >, 
__gnu_cxx::__normal_iterator<char*, std::vector<char, std::allocator<char> > >, 
__gnu_cxx::__normal_iterator<char*, std::vector<char, std::allocator<char> > >, 
__gnu_cxx::__normal_iterator<char*, std::vector<char, std::allocator<char> > >, 
std::vector<abigail::diff_utils::point, std::allocator<abigail::diff_utils::point> >&, 
abigail::diff_utils::edit_script&, 
int&)\",file=\"/home/dodji/git/libabigail/abi-diff/build/../include/abg-diff-utils.h\",fullname=\"/home/dodji/git/libabigail/abi-diff/include/abg-diff-utils.h\",line=\"1322\"},{number=\"2.10\",enabled=\"y\",addr=\"0x00007ffff7d573c8\",func=\"abigail::diff_utils::compute_diff<char
 const*>(char const*, char const*, char const*, char const*, char const*, char const*, 
std::vector<abigail::diff_utils::point, std::allocator<abigail::diff_utils::point> >&, 
abigail::diff_utils::edit_script&, 
int&)\",file=\"/home/dodji/git/libabigail/abi-diff/build/../include/abg-diff-utils.h\",fullname=\"/home/dodji/git/libabigail/abi-diff/include/abg-diff-utils.h\",line=\"1322\"}";
+
  const char *gv_disassemble0 =
  "asm_insns=[{address=\"0x08048dc3\",func-name=\"main\",offset=\"0\",inst=\"lea    
0x4(%esp),%ecx\"},{address=\"0x08048dc7\",func-name=\"main\",offset=\"4\",inst=\"and    
$0xfffffff0,%esp\"},{address=\"0x08048dca\",func-name=\"main\",offset=\"7\",inst=\"pushl  
-0x4(%ecx)\"},{address=\"0x08048dcd\",func-name=\"main\",offset=\"10\",inst=\"push   
%ebp\"},{address=\"0x08048dce\",func-name=\"main\",offset=\"11\",inst=\"mov    
%esp,%ebp\"},{address=\"0x08048dd0\",func-name=\"main\",offset=\"13\",inst=\"push   
%esi\"},{address=\"0x08048dd1\",func-name=\"main\",offset=\"14\",inst=\"push   
%ebx\"},{address=\"0x08048dd2\",func-name=\"main\",offset=\"15\",inst=\"push   
%ecx\"},{address=\"0x08048dd3\",func-name=\"main\",offset=\"16\",inst=\"sub    
$0x5c,%esp\"},{address=\"0x08048dd6\",func-name=\"main\",offset=\"19\",inst=\"lea    
-0x25(%ebp),%eax\"},{address=\"0x08048dd9\",func-name=\"main\",offset=\"22\",inst=\"mov    
%eax,(%esp)\"},{address=\"0x08048ddc\",func-name=\"main\",offset=\"25\",inst=\"call   0x8048be4 <_ZNSaIcEC1Ev 
plt>\"},{address=\"0x08048de1\",func-name=\"main\",offset=\"30\",inst=\"lea    
-0x25(%ebp),%eax\"},{address=\"0x08048de4\",func-name=\"main\",offset=\"33\",inst=\"mov    
%eax,0x8(%esp)\"},{address=\"0x08048de8\",func-name=\"main\",offset=\"37\",inst=\"movl   
$0x8049485,0x4(%esp)\"},{address=\"0x08048df0\",func-name=\"main\",offset=\"45\",inst=\"lea    
-0x2c(%ebp),%eax\"},{address=\"0x08048df3\",func-name=\"main\",offset=\"48\",inst=\"mov    
%eax,(%esp)\"},{address=\"0x08048df6\",func-name=\"main\",offset=\"51\",inst=\"call   0x8048b84 
<_ZNSsC1EPKcRKSaIcE plt>\"},{address=\"0x08048dfb\",func-name=\"main\",offset=\"56\",inst=\"lea    
-0x1d(%ebp),%eax\"},{address=\"0x08048dfe\",func-name=\"main\",offset=\"59\",inst=\"mov    
%eax,(%esp)\"},{address=\"0x08048e01\",func-name=\"main\",offset=\"62\",inst=\"call   0x8048be4 <_ZNSaIcEC1Ev 
plt>\"},{address=\"0x08048e06\",func-name=\"main\",offset=\"67\",inst=\"lea    
-0x1d(%ebp),%eax\"},{address=\"0x08048e09\",func-name=\"main\",offset=\"70\",inst=\"mov    
%eax,0x8(%esp)\"},{address=\"0x08048e0d\",func-name=\"main\",offset=\"74\",inst=\"movl   
$0x804948c,0x4(%esp)\"},{address=\"0x08048e15\",func-name=\"main\",offset=\"82\",inst=\"lea    
-0x24(%ebp),%eax\"},{address=\"0x08048e18\",func-name=\"main\",offset=\"85\",inst=\"mov    
%eax,(%esp)\"},{address=\"0x08048e1b\",func-name=\"main\",offset=\"88\",inst=\"call   0x8048b84 
<_ZNSsC1EPKcRKSaIcE plt>\"},{address=\"0x08048e20\",func-name=\"main\",offset=\"93\",inst=\"movl   
$0xf,0xc(%esp)\"},{address=\"0x08048e28\",func-name=\"main\",offset=\"101\",inst=\"lea    
-0x2c(%ebp),%eax\"},{address=\"0x08048e2b\",func-name=\"main\",offset=\"104\",inst=\"mov    
%eax,0x8(%esp)\"},{address=\"0x08048e2f\",func-name=\"main\",offset=\"108\",inst=\"lea    
-0x24(%ebp),%eax\"},{address=\"0x08048e32\",func-name=\"main\",offset=\"111\",inst=\"mov    
%eax,0x4(%esp)\"},{address=\"0x08048e36\",func-name=\"main\",offset=\"115\",inst=\"lea    
-0x38(%ebp),%eax\"},{address=\"0x08048e39\",func-name=\"main\",offset=\"118\",inst=\"mov    
%eax,(%esp)\"},{address=\"0x08048e3c\",func-name=\"main\",offset=\"121\",inst=\"call   0x8049178 
<Person>\"},{address=\"0x08048e41\",func-name=\"main\",offset=\"126\",inst=\"lea    
-0x24(%ebp),%eax\"},{address=\"0x08048e44\",func-name=\"main\",offset=\"129\",inst=\"mov    
%eax,-0x48(%ebp)\"},{address=\"0x08048e47\",func-name=\"main\",offset=\"132\",inst=\"mov    
-0x48(%ebp),%eax\"},{address=\"0x08048e4a\",func-name=\"main\",offset=\"135\",inst=\"mov    
%eax,(%esp)\"},{address=\"0x08048e4d\",func-name=\"main\",offset=\"138\",inst=\"call   0x8048bb4 <_ZNSsD1Ev 
plt>\"},{address=\"0x08048e52\",func-name=\"main\",offset=\"143\",inst=\"jmp    0x8048e79 
<main+182>\"},{address=\"0x08048e54\",func-name=\"main\",offset=\"145\",inst=\"mov    
%eax,-0x54(%ebp)\"},{address=\"0x08048e57\",func-name=\"main\",offset=\"148\",inst=\"mov    
%edx,-0x50(%ebp)\"},{address=\"0x08048e5a\",func-name=\"main\",offset=\"151\",inst=\"mov    
-0x50(%ebp),%esi\"},{address=\"0x08048e5d\",func-name=\"main\",offset=\"154\",inst=\"mov    
-0x54(%ebp),%ebx\"},{address=\"0x08048e60\",func-name=\"main\",offset=\"157\",inst=\"lea    
-0x24(%ebp),%eax\"},{address=\"0x08048e63\",func-name=\"main\",offset=\"160\",inst=\"mov    
%eax,-0x48(%ebp)\"},{address=\"0x08048e66\",func-name=\"main\",offset=\"163\",inst=\"mov    
-0x48(%ebp),%eax\"},{address=\"0x08048e69\",func-name=\"main\",offset=\"166\",inst=\"mov    
%eax,(%esp)\"},{address=\"0x08048e6c\",func-name=\"main\",offset=\"169\",inst=\"call   0x8048bb4 <_ZNSsD1Ev 
plt>\"},{address=\"0x08048e71\",func-name=\"main\",offset=\"174\",inst=\"mov    
%ebx,-0x54(%ebp)\"},{address=\"0x08048e74\",func-name=\"main\",offset=\"177\",inst=\"mov    
%esi,-0x50(%ebp)\"},{address=\"0x08048e77\",func-name=\"main\",offset=\"180\",inst=\"jmp    0x8048ebc 
<main+249>\"},{address=\"0x08048e79\",func-name=\"main\",offset=\"182\",inst=\"lea    
-0x1d(%ebp),%eax\"},{address=\"0x08048e7c\",func-name=\"main\",offset=\"185\",inst=\"mov    
%eax,(%esp)\"},{address=\"0x08048e7f\",func-name=\"main\",offset=\"188\",inst=\"call   0x8048b74 
<_ZNSaIcED1Ev plt>\"},{address=\"0x08048e84\",func-name=\"main\",offset=\"193\",inst=\"lea    
-0x2c(%ebp),%eax\"},{address=\"0x08048e87\",func-name=\"main\",offset=\"196\",inst=\"mov    
%eax,-0x4c(%ebp)\"},{address=\"0x08048e8a\",func-name=\"main\",offset=\"199\",inst=\"mov    
-0x4c(%ebp),%eax\"},{address=\"0x08048e8d\",func-name=\"main\",offset=\"202\",inst=\"mov    
%eax,(%esp)\"},{address=\"0x08048e90\",func-name=\"main\",offset=\"205\",inst=\"call   0x8048bb4 <_ZNSsD1Ev 
plt>\"},{address=\"0x08048e95\",func-name=\"main\",offset=\"210\",inst=\"jmp    0x8048ef2 
<main+303>\"},{address=\"0x08048e97\",func-name=\"main\",offset=\"212\",inst=\"mov    
%eax,-0x54(%ebp)\"},{address=\"0x08048e9a\",func-name=\"main\",offset=\"215\",inst=\"mov    
%edx,-0x50(%ebp)\"},{address=\"0x08048e9d\",func-name=\"main\",offset=\"218\",inst=\"mov    
-0x50(%ebp),%esi\"},{address=\"0x08048ea0\",func-name=\"main\",offset=\"221\",inst=\"mov    
-0x54(%ebp),%ebx\"},{address=\"0x08048ea3\",func-name=\"main\",offset=\"224\",inst=\"lea    
-0x38(%ebp),%eax\"},{address=\"0x08048ea6\",func-name=\"main\",offset=\"227\",inst=\"mov    
%eax,(%esp)\"},{address=\"0x08048ea9\",func-name=\"main\",offset=\"230\",inst=\"call   0x804921a 
<~Person>\"},{address=\"0x08048eae\",func-name=\"main\",offset=\"235\",inst=\"mov    
%ebx,-0x54(%ebp)\"},{address=\"0x08048eb1\",func-name=\"main\",offset=\"238\",inst=\"mov    
%esi,-0x50(%ebp)\"},{address=\"0x08048eb4\",func-name=\"main\",offset=\"241\",inst=\"jmp    0x8048ebc 
<main+249>\"},{address=\"0x08048eb6\",func-name=\"main\",offset=\"243\",inst=\"mov    
%eax,-0x54(%ebp)\"},{address=\"0x08048eb9\",func-name=\"main\",offset=\"246\",inst=\"mov    
%edx,-0x50(%ebp)\"},{address=\"0x08048ebc\",func-name=\"main\",offset=\"249\",inst=\"mov    
-0x50(%ebp),%esi\"},{address=\"0x08048ebf\",func-name=\"main\",offset=\"252\",inst=\"mov    
-0x54(%ebp),%ebx\"},{address=\"0x08048ec2\",func-name=\"main\",offset=\"255\",inst=\"lea    
-0x1d(%ebp),%eax\"},{address=\"0x08048ec5\",func-name=\"main\",offset=\"258\",inst=\"mov    
%eax,(%esp)\"},{address=\"0x08048ec8\",func-name=\"main\",offset=\"261\",inst=\"call   0x8048b74 
<_ZNSaIcED1Ev plt>\"},{address=\"0x08048ecd\",func-name=\"main\",offset=\"266\",inst=\"mov    
%ebx,-0x54(%ebp)\"},{address=\"0x08048ed0\",func-name=\"main\",offset=\"269\",inst=\"mov    
%esi,-0x50(%ebp)\"},{address=\"0x08048ed3\",func-name=\"main\",offset=\"272\",inst=\"mov    
-0x50(%ebp),%esi\"},{address=\"0x08048ed6\",func-name=\"main\",offset=\"275\",inst=\"mov    
-0x54(%ebp),%ebx\"},{address=\"0x08048ed9\",func-name=\"main\",offset=\"278\",inst=\"lea    
-0x2c(%ebp),%eax\"},{address=\"0x08048edc\",func-name=\"main\",offset=\"281\",inst=\"mov    
%eax,-0x4c(%ebp)\"},{address=\"0x08048edf\",func-name=\"main\",offset=\"284\",inst=\"mov    
-0x4c(%ebp),%eax\"},{address=\"0x08048ee2\",func-name=\"main\",offset=\"287\",inst=\"mov    
%eax,(%esp)\"},{address=\"0x08048ee5\",func-name=\"main\",offset=\"290\",inst=\"call   0x8048bb4 <_ZNSsD1Ev 
plt>\"},{address=\"0x08048eea\",func-name=\"main\",offset=\"295\",inst=\"mov    
%ebx,-0x54(%ebp)\"},{address=\"0x08048eed\",func-name=\"main\",offset=\"298\",inst=\"mov    
%esi,-0x50(%ebp)\"},{address=\"0x08048ef0\",func-name=\"main\",offset=\"301\",inst=\"jmp    0x8048f62 
<main+415>\"},{address=\"0x08048ef2\",func-name=\"main\",offset=\"303\",inst=\"lea    
-0x25(%ebp),%eax\"},{address=\"0x08048ef5\",func-name=\"main\",offset=\"306\",inst=\"mov    
%eax,(%esp)\"},{address=\"0x08048ef8\",func-name=\"main\",offset=\"309\",inst=\"call   0x8048b74 
<_ZNSaIcED1Ev plt>\"},{address=\"0x08048efd\",func-name=\"main\",offset=\"314\",inst=\"call   0x8048cd4 
<_Z5func1v>\"},{address=\"0x08048f02\",func-name=\"main\",offset=\"319\",inst=\"movl   
$0x2,0x4(%esp)\"},{address=\"0x08048f0a\",func-name=\"main\",offset=\"327\",inst=\"movl   
$0x1,(%esp)\"},{address=\"0x08048f11\",func-name=\"main\",offset=\"334\",inst=\"call   0x8048ce7 
<_Z5func2ii>\"},{address=\"0x08048f16\",func-name=\"main\",offset=\"339\",inst=\"lea    
-0x15(%ebp),%eax\"},{address=\"0x08048f19\",func-name=\"main\",offset=\"342\",inst=\"mov    
%eax,(%esp)\"},{address=\"0x08048f1c\",func-name=\"main\",offset=\"345\",inst=\"call   0x8048be4 
<_ZNSaIcEC1Ev plt>\"},{address=\"0x08048f21\",func-name=\"main\",offset=\"350\",inst=\"lea    
-0x15(%ebp),%eax\"},{address=\"0x08048f24\",func-name=\"main\",offset=\"353\",inst=\"mov    
%eax,0x8(%esp)\"},{address=\"0x08048f28\",func-name=\"main\",offset=\"357\",inst=\"movl   
$0x8049490,0x4(%esp)\"},{address=\"0x08048f30\",func-name=\"main\",offset=\"365\",inst=\"lea    
-0x1c(%ebp),%eax\"},{address=\"0x08048f33\",func-name=\"main\",offset=\"368\",inst=\"mov    
%eax,(%esp)\"},{address=\"0x08048f36\",func-name=\"main\",offset=\"371\",inst=\"call   0x8048b84 
<_ZNSsC1EPKcRKSaIcE plt>\"},{address=\"0x08048f3b\",func-name=\"main\",offset=\"376\",inst=\"jmp    0x8048f84 
<main+449>\"},{address=\"0x08048f3d\",func-name=\"main\",offset=\"378\",inst=\"mov    
%eax,-0x54(%ebp)\"},{address=\"0x08048f40\",func-name=\"main\",offset=\"381\",inst=\"mov    
%edx,-0x50(%ebp)\"},{address=\"0x08048f43\",func-name=\"main\",offset=\"384\",inst=\"mov    
-0x50(%ebp),%esi\"},{address=\"0x08048f46\",func-name=\"main\",offset=\"387\",inst=\"mov    
-0x54(%ebp),%ebx\"},{address=\"0x08048f49\",func-name=\"main\",offset=\"390\",inst=\"lea    
-0x38(%ebp),%eax\"},{address=\"0x08048f4c\",func-name=\"main\",offset=\"393\",inst=\"mov    
%eax,(%esp)\"},{address=\"0x08048f4f\",func-name=\"main\",offset=\"396\",inst=\"call   0x804921a 
<~Person>\"},{address=\"0x08048f54\",func-name=\"main\",offset=\"401\",inst=\"mov    
%ebx,-0x54(%ebp)\"},{address=\"0x08048f57\",func-name=\"main\",offset=\"404\",inst=\"mov    
%esi,-0x50(%ebp)\"},{address=\"0x08048f5a\",func-name=\"main\",offset=\"407\",inst=\"jmp    0x8048f62 
<main+415>\"},{address=\"0x08048f5c\",func-name=\"main\",offset=\"409\",inst=\"mov    
%eax,-0x54(%ebp)\"},{address=\"0x08048f5f\",func-name=\"main\",offset=\"412\",inst=\"mov    
%edx,-0x50(%ebp)\"},{address=\"0x08048f62\",func-name=\"main\",offset=\"415\",inst=\"mov    
-0x50(%ebp),%esi\"},{address=\"0x08048f65\",func-name=\"main\",offset=\"418\",inst=\"mov    
-0x54(%ebp),%ebx\"},{address=\"0x08048f68\",func-name=\"main\",offset=\"421\",inst=\"lea    
-0x25(%ebp),%eax\"},{address=\"0x08048f6b\",func-name=\"main\",offset=\"424\",inst=\"mov    
%eax,(%esp)\"},{address=\"0x08048f6e\",func-name=\"main\",offset=\"427\",inst=\"call   0x8048b74 
<_ZNSaIcED1Ev plt>\"},{address=\"0x08048f73\",func-name=\"main\",offset=\"432\",inst=\"mov    
%ebx,-0x54(%ebp)\"},{address=\"0x08048f76\",func-name=\"main\",offset=\"435\",inst=\"mov    
%esi,-0x50(%ebp)\"},{address=\"0x08048f79\",func-name=\"main\",offset=\"438\",inst=\"mov    
-0x54(%ebp),%eax\"},{address=\"0x08048f7c\",func-name=\"main\",offset=\"441\",inst=\"mov    
%eax,(%esp)\"},{address=\"0x08048f7f\",func-name=\"main\",offset=\"444\",inst=\"call   0x8048bd4 
<_Unwind_Resume plt>\"},{address=\"0x08048f84\",func-name=\"main\",offset=\"449\",inst=\"lea    
-0x1c(%ebp),%eax\"},{address=\"0x08048f87\",func-name=\"main\",offset=\"452\",inst=\"mov    
%eax,0x4(%esp)\"},{address=\"0x08048f8b\",func-name=\"main\",offset=\"456\",inst=\"lea    
-0x38(%ebp),%eax\"},{address=\"0x08048f8e\",func-name=\"main\",offset=\"459\",inst=\"mov    
%eax,(%esp)\"},{address=\"0x08048f91\",func-name=\"main\",offset=\"462\",inst=\"call   0x8049140 
<_ZN6Person14set_first_nameERKSs>\"},{address=\"0x08048f96\",func-name=\"main\",offset=\"467\",inst=\"lea    
-0x1c(%ebp),%eax\"},{address=\"0x08048f99\",func-name=\"main\",offset=\"470\",inst=\"mov    
%eax,-0x44(%ebp)\"},{address=\"0x08048f9c\",func-name=\"main\",offset=\"473\",inst=\"mov    
-0x44(%ebp),%eax\"},{address=\"0x08048f9f\",func-name=\"main\",offset=\"476\",inst=\"mov    
%eax,(%esp)\"},{address=\"0x08048fa2\",func-name=\"main\",offset=\"479\",inst=\"call   0x8048bb4 <_ZNSsD1Ev 
plt>\"},{address=\"0x08048fa7\",func-name=\"main\",offset=\"484\",inst=\"jmp    0x8048fce 
<main+523>\"},{address=\"0x08048fa9\",func-name=\"main\",offset=\"486\",inst=\"mov    
%eax,-0x54(%ebp)\"},{address=\"0x08048fac\",func-name=\"main\",offset=\"489\",inst=\"mov    
%edx,-0x50(%ebp)\"},{address=\"0x08048faf\",func-name=\"main\",offset=\"492\",inst=\"mov    
-0x50(%ebp),%esi\"},{address=\"0x08048fb2\",func-name=\"main\",offset=\"495\",inst=\"mov    
-0x54(%ebp),%ebx\"},{address=\"0x08048fb5\",func-name=\"main\",offset=\"498\",inst=\"lea    
-0x1c(%ebp),%eax\"},{address=\"0x08048fb8\",func-name=\"main\",offset=\"501\",inst=\"mov    
%eax,-0x44(%ebp)\"},{address=\"0x08048fbb\",func-name=\"main\",offset=\"504\",inst=\"mov    
-0x44(%ebp),%eax\"},{address=\"0x08048fbe\",func-name=\"main\",offset=\"507\",inst=\"mov    
%eax,(%esp)\"},{address=\"0x08048fc1\",func-name=\"main\",offset=\"510\",inst=\"call   0x8048bb4 <_ZNSsD1Ev 
plt>\"},{address=\"0x08048fc6\",func-name=\"main\",offset=\"515\",inst=\"mov    
%ebx,-0x54(%ebp)\"},{address=\"0x08048fc9\",func-name=\"main\",offset=\"518\",inst=\"mov    
%esi,-0x50(%ebp)\"},{address=\"0x08048fcc\",func-name=\"main\",offset=\"521\",inst=\"jmp    0x8049006 
<main+579>\"},{address=\"0x08048fce\",func-name=\"main\",offset=\"523\",inst=\"lea    
-0x15(%ebp),%eax\"},{address=\"0x08048fd1\",func-name=\"main\",offset=\"526\",inst=\"mov    
%eax,(%esp)\"},{address=\"0x08048fd4\",func-name=\"main\",offset=\"529\",inst=\"call   0x8048b74 
<_ZNSaIcED1Ev plt>\"},{address=\"0x08048fd9\",func-name=\"main\",offset=\"534\",inst=\"lea    
-0xd(%ebp),%eax\"},{address=\"0x08048fdc\",func-name=\"main\",offset=\"537\",inst=\"mov    
%eax,(%esp)\"},{address=\"0x08048fdf\",func-name=\"main\",offset=\"540\",inst=\"call   0x8048be4 
<_ZNSaIcEC1Ev plt>\"},{address=\"0x08048fe4\",func-name=\"main\",offset=\"545\",inst=\"lea    
-0xd(%ebp),%eax\"},{address=\"0x08048fe7\",func-name=\"main\",offset=\"548\",inst=\"mov    
%eax,0x8(%esp)\"},{address=\"0x08048feb\",func-name=\"main\",offset=\"552\",inst=\"movl   
$0x8049494,0x4(%esp)\"},{address=\"0x08048ff3\",func-name=\"main\",offset=\"560\",inst=\"lea    
-0x14(%ebp),%eax\"},{address=\"0x08048ff6\",func-name=\"main\",offset=\"563\",inst=\"mov    
%eax,(%esp)\"},{address=\"0x08048ff9\",func-name=\"main\",offset=\"566\",inst=\"call   0x8048b84 
<_ZNSsC1EPKcRKSaIcE plt>\"},{address=\"0x08048ffe\",func-name=\"main\",offset=\"571\",inst=\"jmp    0x8049022 
<main+607>\"},{address=\"0x08049000\",func-name=\"main\",offset=\"573\",inst=\"mov    
%eax,-0x54(%ebp)\"},{address=\"0x08049003\",func-name=\"main\",offset=\"576\",inst=\"mov    
%edx,-0x50(%ebp)\"},{address=\"0x08049006\",func-name=\"main\",offset=\"579\",inst=\"mov    
-0x50(%ebp),%esi\"},{address=\"0x08049009\",func-name=\"main\",offset=\"582\",inst=\"mov    
-0x54(%ebp),%ebx\"},{address=\"0x0804900c\",func-name=\"main\",offset=\"585\",inst=\"lea    
-0x15(%ebp),%eax\"},{address=\"0x0804900f\",func-name=\"main\",offset=\"588\",inst=\"mov    
%eax,(%esp)\"},{address=\"0x08049012\",func-name=\"main\",offset=\"591\",inst=\"call   0x8048b74 
<_ZNSaIcED1Ev plt>\"},{address=\"0x08049017\",func-name=\"main\",offset=\"596\",inst=\"mov    
%ebx,-0x54(%ebp)\"},{address=\"0x0804901a\",func-name=\"main\",offset=\"599\",inst=\"mov    
%esi,-0x50(%ebp)\"},{address=\"0x0804901d\",func-name=\"main\",offset=\"602\",inst=\"jmp    0x80490fa 
<main+823>\"},{address=\"0x08049022\",func-name=\"main\",offset=\"607\",inst=\"lea    
-0x14(%ebp),%eax\"},{address=\"0x08049025\",func-name=\"main\",offset=\"610\",inst=\"mov    
%eax,0x4(%esp)\"},{address=\"0x08049029\",func-name=\"main\",offset=\"614\",inst=\"lea    
-0x38(%ebp),%eax\"},{address=\"0x0804902c\",func-name=\"main\",offset=\"617\",inst=\"mov    
%eax,(%esp)\"},{address=\"0x0804902f\",func-name=\"main\",offset=\"620\",inst=\"call   0x804915a 
<_ZN6Person15set_family_nameERKSs>\"},{address=\"0x08049034\",func-name=\"main\",offset=\"625\",inst=\"lea    
-0x14(%ebp),%eax\"},{address=\"0x08049037\",func-name=\"main\",offset=\"628\",inst=\"mov    
%eax,-0x40(%ebp)\"},{address=\"0x0804903a\",func-name=\"main\",offset=\"631\",inst=\"mov    
-0x40(%ebp),%eax\"},{address=\"0x0804903d\",func-name=\"main\",offset=\"634\",inst=\"mov    
%eax,(%esp)\"},{address=\"0x08049040\",func-name=\"main\",offset=\"637\",inst=\"call   0x8048bb4 <_ZNSsD1Ev 
plt>\"},{address=\"0x08049045\",func-name=\"main\",offset=\"642\",inst=\"jmp    0x804906c 
<main+681>\"},{address=\"0x08049047\",func-name=\"main\",offset=\"644\",inst=\"mov    
%eax,-0x54(%ebp)\"},{address=\"0x0804904a\",func-name=\"main\",offset=\"647\",inst=\"mov    
%edx,-0x50(%ebp)\"},{address=\"0x0804904d\",func-name=\"main\",offset=\"650\",inst=\"mov    
-0x50(%ebp),%esi\"},{address=\"0x08049050\",func-name=\"main\",offset=\"653\",inst=\"mov    
-0x54(%ebp),%ebx\"},{address=\"0x08049053\",func-name=\"main\",offset=\"656\",inst=\"lea    
-0x14(%ebp),%eax\"},{address=\"0x08049056\",func-name=\"main\",offset=\"659\",inst=\"mov    
%eax,-0x40(%ebp)\"},{address=\"0x08049059\",func-name=\"main\",offset=\"662\",inst=\"mov    
-0x40(%ebp),%eax\"},{address=\"0x0804905c\",func-name=\"main\",offset=\"665\",inst=\"mov    
%eax,(%esp)\"},{address=\"0x0804905f\",func-name=\"main\",offset=\"668\",inst=\"call   0x8048bb4 <_ZNSsD1Ev 
plt>\"},{address=\"0x08049064\",func-name=\"main\",offset=\"673\",inst=\"mov    
%ebx,-0x54(%ebp)\"},{address=\"0x08049067\",func-name=\"main\",offset=\"676\",inst=\"mov    
%esi,-0x50(%ebp)\"},{address=\"0x0804906a\",func-name=\"main\",offset=\"679\",inst=\"jmp    0x804908a 
<main+711>\"},{address=\"0x0804906c\",func-name=\"main\",offset=\"681\",inst=\"lea    
-0xd(%ebp),%eax\"},{address=\"0x0804906f\",func-name=\"main\",offset=\"684\",inst=\"mov    
%eax,(%esp)\"},{address=\"0x08049072\",func-name=\"main\",offset=\"687\",inst=\"call   0x8048b74 
<_ZNSaIcED1Ev plt>\"},{address=\"0x08049077\",func-name=\"main\",offset=\"692\",inst=\"lea    
-0x38(%ebp),%eax\"},{address=\"0x0804907a\",func-name=\"main\",offset=\"695\",inst=\"mov    
%eax,(%esp)\"},{address=\"0x0804907d\",func-name=\"main\",offset=\"698\",inst=\"call   0x8049272 
<_ZN6Person7do_thisEv>\"},{address=\"0x08049082\",func-name=\"main\",offset=\"703\",inst=\"jmp    0x80490a3 
<main+736>\"},{address=\"0x08049084\",func-name=\"main\",offset=\"705\",inst=\"mov    
%eax,-0x54(%ebp)\"},{address=\"0x08049087\",func-name=\"main\",offset=\"708\",inst=\"mov    
%edx,-0x50(%ebp)\"},{address=\"0x0804908a\",func-name=\"main\",offset=\"711\",inst=\"mov    
-0x50(%ebp),%esi\"},{address=\"0x0804908d\",func-name=\"main\",offset=\"714\",inst=\"mov    
-0x54(%ebp),%ebx\"},{address=\"0x08049090\",func-name=\"main\",offset=\"717\",inst=\"lea    
-0xd(%ebp),%eax\"},{address=\"0x08049093\",func-name=\"main\",offset=\"720\",inst=\"mov    
%eax,(%esp)\"},{address=\"0x08049096\",func-name=\"main\",offset=\"723\",inst=\"call   0x8048b74 
<_ZNSaIcED1Ev plt>\"},{address=\"0x0804909b\",func-name=\"main\",offset=\"728\",inst=\"mov    
%ebx,-0x54(%ebp)\"},{address=\"0x0804909e\",func-name=\"main\",offset=\"731\",inst=\"mov    
%esi,-0x50(%ebp)\"},{address=\"0x080490a1\",func-name=\"main\",offset=\"734\",inst=\"jmp    0x80490fa 
<main+823>\"},{address=\"0x080490a3\",func-name=\"main\",offset=\"736\",inst=\"lea    
-0x38(%ebp),%eax\"},{address=\"0x080490a6\",func-name=\"main\",offset=\"739\",inst=\"mov    
%eax,(%esp)\"},{address=\"0x080490a9\",func-name=\"main\",offset=\"742\",inst=\"call   0x804911c 
<_ZN6Person8overloadEv>\"},{address=\"0x080490ae\",func-name=\"main\",offset=\"747\",inst=\"movl   
$0x0,0x4(%esp)\"},{address=\"0x080490b6\",func-name=\"main\",offset=\"755\",inst=\"lea    
-0x38(%ebp),%eax\"},{address=\"0x080490b9\",func-name=\"main\",offset=\"758\",inst=\"mov    
%eax,(%esp)\"},{address=\"0x080490bc\",func-name=\"main\",offset=\"761\",inst=\"call   0x8049130 
<_ZN6Person8overloadEi>\"},{address=\"0x080490c1\",func-name=\"main\",offset=\"766\",inst=\"lea    
-0x38(%ebp),%eax\"},{address=\"0x080490c4\",func-name=\"main\",offset=\"769\",inst=\"mov    
%eax,(%esp)\"},{address=\"0x080490c7\",func-name=\"main\",offset=\"772\",inst=\"call   0x8048db0 
<_Z5func3R6Person>\"},{address=\"0x080490cc\",func-name=\"main\",offset=\"777\",inst=\"lea    
-0x38(%ebp),%eax\"},{address=\"0x080490cf\",func-name=\"main\",offset=\"780\",inst=\"mov    
%eax,(%esp)\"},{address=\"0x080490d2\",func-name=\"main\",offset=\"783\",inst=\"call   0x8048cff 
<_Z5func4R6Person>\"},{address=\"0x080490d7\",func-name=\"main\",offset=\"788\",inst=\"mov    
$0x0,%ebx\"},{address=\"0x080490dc\",func-name=\"main\",offset=\"793\",inst=\"lea    
-0x38(%ebp),%eax\"},{address=\"0x080490df\",func-name=\"main\",offset=\"796\",inst=\"mov    
%eax,(%esp)\"},{address=\"0x080490e2\",func-name=\"main\",offset=\"799\",inst=\"call   0x804921a 
<~Person>\"},{address=\"0x080490e7\",func-name=\"main\",offset=\"804\",inst=\"mov    
%ebx,%eax\"},{address=\"0x080490e9\",func-name=\"main\",offset=\"806\",inst=\"add    
$0x5c,%esp\"},{address=\"0x080490ec\",func-name=\"main\",offset=\"809\",inst=\"pop    
%ecx\"},{address=\"0x080490ed\",func-name=\"main\",offset=\"810\",inst=\"pop    
%ebx\"},{address=\"0x080490ee\",func-name=\"main\",offset=\"811\",inst=\"pop    
%esi\"},{address=\"0x080490ef\",func-name=\"main\",offset=\"812\",inst=\"pop    
%ebp\"},{address=\"0x080490f0\",func-name=\"main\",offset=\"813\",inst=\"lea    
-0x4(%ecx),%esp\"},{address=\"0x080490f3\",func-name=\"main\",offset=\"816\",inst=\"ret    
\"},{address=\"0x080490f4\",func-name=\"main\",offset=\"817\",inst=\"mov    
%eax,-0x54(%ebp)\"},{address=\"0x080490f7\",func-name=\"main\",offset=\"820\",inst=\"mov    
%edx,-0x50(%ebp)\"},{address=\"0x080490fa\",func-name=\"main\",offset=\"823\",inst=\"mov    
-0x50(%ebp),%esi\"},{address=\"0x080490fd\",func-name=\"main\",offset=\"826\",inst=\"mov    
-0x54(%ebp),%ebx\"},{address=\"0x08049100\",func-name=\"main\",offset=\"829\",inst=\"lea    
-0x38(%ebp),%eax\"},{address=\"0x08049103\",func-name=\"main\",offset=\"832\",inst=\"mov    
%eax,(%esp)\"},{address=\"0x08049106\",func-name=\"main\",offset=\"835\",inst=\"call   0x804921a 
<~Person>\"},{address=\"0x0804910b\",func-name=\"main\",offset=\"840\",inst=\"mov    
%ebx,-0x54(%ebp)\"},{address=\"0x0804910e\",func-name=\"main\",offset=\"843\",inst=\"mov    
%esi,-0x50(%ebp)\"},{address=\"0x08049111\",func-name=\"main\",offset=\"846\",inst=\"mov    
-0x54(%ebp),%eax\"},{address=\"0x08049114\",func-name=\"main\",offset=\"849\",inst=\"mov    
%eax,(%esp)\"},{address=\"0x08049117\",func-name=\"main\",offset=\"852\",inst=\"call   0x8048bd4 
<_Unwind_Resume plt>\"}]";
   
@@ -935,6 +938,15 @@ test_breakpoint ()
     BOOST_REQUIRE_EQUAL (breakpoint.sub_breakpoints ().size (), 2);
     BOOST_REQUIRE_EQUAL (breakpoint.sub_breakpoints ()[0].id (), "2.1");
     BOOST_REQUIRE_EQUAL (breakpoint.sub_breakpoints ()[1].id (), "2.2");
+
+    parser.push_input (gv_breakpoint_modified_async_output0);
+    breakpoint.clear ();
+    is_ok = parser.parse_breakpoint_modified_async_output (0, cur, breakpoint);
+    BOOST_REQUIRE (is_ok);
+    BOOST_REQUIRE (breakpoint.has_multiple_locations ());
+    BOOST_REQUIRE_EQUAL (breakpoint.sub_breakpoints ().size (), 10);
+    BOOST_REQUIRE_EQUAL (breakpoint.sub_breakpoints ()[0].id (), "2.1");
+    BOOST_REQUIRE_EQUAL (breakpoint.sub_breakpoints ()[9].id (), "2.10");
 }
 
 void
-- 
                Dodji


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