[padb] r436 committed - Initial support for using idb over gdb as a backend debugger....

padb at googlecode.com padb at googlecode.com
Wed Mar 30 23:11:42 BST 2011


Revision: 436
Author:   apittman at gmail.com
Date:     Wed Mar 30 15:10:37 2011
Log:      Initial support for using idb over gdb as a backend debugger.
Enable this with the -Obackend-debugger=idb option, this is not
ready for widespread use however as the mi interface to idb is
flaky and in some places completely different from that of gdb.

In particular this doesn't work for MPI queues, only shows
one thread per program and doesn't show variables or paramaters
for any functions.  Basically right now all it shows is function
names in stack traces.

http://code.google.com/p/padb/source/detail?r=436

Modified:
  /trunk/src/padb

=======================================
--- /trunk/src/padb	Wed Mar 30 13:12:35 2011
+++ /trunk/src/padb	Wed Mar 30 15:10:37 2011
@@ -407,7 +407,7 @@
  # Config options the inner knows about, only forward options if they are in
  # this list.
  my @inner_conf =
-  qw(edb edbopt rmgr scripts slurm_job_step pbs_server lsf_mode  
lsfmpi_server lsfmpi_mpirpid lsfmpi_port);
+  qw(edb edbopt rmgr scripts slurm_job_step pbs_server lsf_mode  
lsfmpi_server lsfmpi_mpirpid lsfmpi_port backend_debugger);

  # More options the inner knows about, these are forwarded on the
  # command line rather than over the sockets.
@@ -601,6 +601,9 @@

  $conf{pbs_server} = undef;

+# Backend debugger to use, can be either idb or gdb.
+$conf{backend_debugger} = 'gdb';
+
  # These settings are passed onto inner only.
  $conf{edbopt} = undef;

@@ -6125,6 +6128,9 @@
      };

      my $cmd = 'gdb --interpreter=mi -q';
+    if ( $inner_conf{backend_debugger} eq 'idb' ) {
+        $cmd = 'idb --interpreter=mi2 -q';
+    }
      if ( defined $core ) {
          $cmd .= " $exe $core";
      }
@@ -6234,8 +6240,10 @@
          $gdb->{runtime}{mpich2} = 1;
      }

-    gdb_n_send( $gdb, '-gdb-set print address off' );
-    gdb_n_send( $gdb, '-gdb-set language auto' );
+    if ( $inner_conf{backend_debugger} ne 'idb' ) {
+        gdb_n_send( $gdb, '-gdb-set print address off' );
+        gdb_n_send( $gdb, '-gdb-set language auto' );
+    }

      return;
  }
@@ -6263,6 +6271,10 @@

      my %p = _gdb_send_real_async_wait( $gdb, "-target-attach $pid" );

+    if ( $inner_conf{backend_debugger} eq 'idb' ) {
+        gdb_attach_post( $gdb, $pid );
+        return $pid;
+    }
      if ( not defined $p{status} or $p{status} eq 'error' ) {
          %p = gdb_n_send( $gdb, "attach $pid" );
      }
@@ -6302,7 +6314,7 @@
      my ($gdb) = @_;
      my $result = gdb_send( $gdb, '-target-detach' );

-    return if ( $result eq 'error' );
+    return if ( not defined $result or $result eq 'error' );

      $gdb->{attached} = 0;

@@ -6334,7 +6346,10 @@
          print { $gdb->{debugfd} } "$seq$cmd\n";
      }
      my %r = gdb_n_next_result( $gdb, $seq );
-    if ( $gdb->{attached} and $r{seq} ne $seq ) {
+    if (    $inner_conf{backend_debugger} ne 'idb'
+        and $gdb->{attached}
+        and $r{seq} ne $seq )
+    {
          croak(
  "Invalid sequence number from gdb, expecting $seq got $r{seq} cmd=\"$cmd\""
          );
@@ -6361,6 +6376,9 @@
  sub _gdb_send_real_async_wait {
      my ( $gdb, $cmd ) = @_;
      my $seq = $gdb->{seq};
+    if ( $inner_conf{backend_debugger} eq 'idb' ) {
+        return;
+    }
      my %r = gdb_n_next_result( $gdb, $seq );
      if ( $gdb->{attached} and $r{seq} ne $seq ) {
          croak(
@@ -6380,6 +6398,10 @@
      if ( $flag == $gdb->{pa} ) {
          return;
      }
+
+    if ( $inner_conf{backend_debugger} eq 'idb' ) {
+        return;
+    }

      $gdb->{pa} = $flag;

@@ -6397,6 +6419,10 @@
      if ( $lang eq $gdb->{lang} ) {
          return;
      }
+
+    if ( $inner_conf{backend_debugger} eq 'idb' ) {
+        return;
+    }

      $gdb->{lang} = $lang;

@@ -6734,6 +6760,12 @@
      #    $res{debug} =~ s/\\n/\n/g;
      #    chomp $res{debug};
      #}
+
+    # As idb doesn't confirm that it's attached properly it's impossible
+    # to do this test correctly here.
+    if ( $inner_conf{backend_debugger} eq 'idb' ) {
+        return %res;
+    }

      if ( $gdb->{attached} ) {
          croak("Unexpected EOF from gdb");
@@ -7862,8 +7894,13 @@

              gdb_send( $gdb, "-stack-select-frame $frame->{level}" );

+            my $print_cmd = '2';
+            if ( $inner_conf{backend_debugger} eq 'idb' ) {
+                $print_cmd = '1';
+            }
              my %r = gdb_send_addr( $gdb,
-                "-stack-list-arguments 2 $frame->{level} $frame->{level}"  
);
+"-stack-list-arguments $print_cmd $frame->{level} $frame->{level}"
+            );
              my $args = gdb_parse_reason( $r{reason} );

              if ( defined $args->{'stack-args'}[0]{frame}{args} ) {
@@ -7873,7 +7910,7 @@
                  gdb_expand_vars( $gdb, $frame, 'params' );
              }

-            my %s = gdb_n_send( $gdb, '-stack-list-locals --simple-values'  
);
+            my %s = gdb_n_send( $gdb, '-stack-list-locals 2' );
              if ( $s{status} eq 'done' ) {
                  my $flocals = gdb_parse_reason( $s{reason} );
                  if ( defined $flocals->{locals} ) {




More information about the padb-devel mailing list