ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/AnyEvent-GDB/GDB.pm
Revision: 1.7
Committed: Thu May 15 10:32:04 2014 UTC (10 years ago) by root
Branch: MAIN
CVS Tags: rel-0_2, HEAD
Changes since 1.6: +5 -5 lines
Log Message:
0.2

File Contents

# User Rev Content
1 root 1.1 =head1 NAME
2    
3     AnyEvent::GDB - asynchronous GDB machine interface interface
4    
5     =head1 SYNOPSIS
6    
7     use AnyEvent::GDB;
8    
9     =head1 DESCRIPTION
10    
11     This module is an L<AnyEvent> user, you need to make sure that you use and
12     run a supported event loop.
13    
14 root 1.6 It implements the GDB MI protocol, which can be used to talk to GDB
15     without having to parse the ever changing command syntax aimed at humans.
16    
17     It properly quotes your commands and parses the data structures returned
18     by GDB.
19    
20     At the moment, it's in an early stage of development, so expect changes,
21     and, over time, further features (such as breakpoint-specific callbacks
22     and so on).
23    
24     =head1 EXAMPLE PROGRAM
25    
26     To get you started, here is an example program that runs F</bin/ls>,
27     displaying the stopped information when hitting a breakpoint on C<_exit>:
28    
29     use Data::Dump;
30     use AnyEvent::GDB;
31    
32     our $gdb = new AnyEvent::GDB
33     trace => 1,
34     on_exec_stopped => sub {
35     ddx $_[0];
36     },
37     ;
38    
39     my $done
40    
41     ddx $gdb->cmd_sync (file_exec_and_symbols => "/bin/ls");
42     ddx $gdb->cmd_sync (break_insert => "_exit");
43     ddx $gdb->cmd_sync ("exec_run");
44    
45     AE::cv->recv;
46    
47 root 1.3 =head2 PROTOCOL QUIRKS
48    
49     =head3 Minus vs. underscores
50    
51     The MI protocol uses C<-> to separate name components, while in Perl, you
52     use C<_> for this purpose.
53    
54     This module usually accepts either form as input, and always converts
55     names with C<-> to names with C<_>, so the C<library-loaded> notify might
56     become C<notify_library_loaded>, and the C<host-name> result in that event
57     is stored in the C<host_name> hash element in Perl.
58    
59     =head3 Output redirection
60    
61 root 1.6 Unfortunately, GDB has no (portable) provision to separate GDB
62     input/output from program input/output. Obviously, without a distinction
63     between program I/O and GDB I/O it becomes impossible to safely control
64     GDB.
65    
66     There are two ways for you around it: redirect stdin/stdout yourself, or
67     set a tty (eg. with the C<inferior_set_tty> command).
68    
69     Unfortunately, the MI interface does not seem to support any kind
70     of I/O redirection, so this module helps you a bit, by setting the
71     C<exec-wrapper> variable with a console C<set> commmand. That is, this
72 root 1.7 module does soeQmthing like the following for you, providing proper file
73     descriptors for your actual stdin and stdout:
74 root 1.6
75     set exec-wrapper <&5 >&6
76    
77     The actual I/O redirection operators are also stored in C<< $gdb->{stdio}
78 root 1.7 >>, so you can even do it yourself, e.g. when providing your own wrapper:
79 root 1.6
80     $self->cmd_raw ("set exec-wrapper $self->{stdio}", sub { });
81    
82     (You need to use a raw command, as the "correct" C<gdb_set> MI command
83     silently ignores any C<exec-wrapper> setting).
84    
85 root 1.1 =cut
86    
87     package AnyEvent::GDB;
88    
89     use common::sense;
90    
91 root 1.3 use Carp ();
92 root 1.1 use Fcntl ();
93     use Scalar::Util ();
94    
95     use AnyEvent ();
96     use AnyEvent::Util ();
97    
98 root 1.7 our $VERSION = '0.2';
99 root 1.1
100     =head2 METHODS
101    
102     =over 4
103    
104 root 1.3 =item $gdb = new AnyEvent::GDB key => value...
105    
106     Create a new GDB object using the given named parameters.
107    
108     For initial experiments, it is highly recommended to run with tracing or
109     at least C<verbose> enabled. And don't forget to provide an C<on_eof>
110     callback.
111    
112     my $gdb = new AnyEvent::GDB
113     on_eof => sub {
114 root 1.7 print "We are done.\n";
115 root 1.3 },
116     trace => 1; # or verbose => 1, for less output
117 root 1.1
118     =over 4
119    
120     =item exec => $path (default: "gdb")
121    
122     The path of the GDB executable.
123    
124     =item args => [$string...] (default: ["-n"])
125    
126     An optional array of parameters to pass to GDB. This should not be
127     used to load a program executable, use the C<file_exec_and_symbols>,
128     C<target_attach> or similar MI commands instead.
129    
130 root 1.3 =item trace => $boolean (default: 0)
131    
132     If true, then all commands sent to GDB are printed to STDOUT prefixed with
133     "> ", and all replies received from GDB are printed to STDOUT prefixed
134     with "< ".
135    
136     =item verbose => $boolean (default: true if trace is enabled, false otherwise)
137    
138     If true, then log output and possibly other information is printed to
139     STDOUT.
140    
141     =item on_xxxx => $callback->(...)
142    
143     This specifies a callback for a specific event - see the L<EVENTS> section
144     later in this document.
145 root 1.1
146     =back
147    
148     =cut
149    
150     sub new {
151     my ($class, %arg) = @_;
152    
153     my $self = bless {
154     %arg,
155     }, $class;
156    
157     my $exe = delete $self->{exec} // "gdb";
158     my $arg = delete $self->{args} // [qw(-n)];
159    
160 root 1.3 $self->{verbose} = 1
161     if $self->{trace} && !exists $self->{verbose};
162    
163 root 1.1 ($self->{fh}, my $fh2) = AnyEvent::Util::portable_socketpair;
164    
165     $self->{pid} = fork;
166    
167     open my $stdin , "<&STDIN" ;
168     open my $stdout, ">&STDOUT";
169    
170     unless ($self->{pid}) {
171     if (defined $self->{pid}) {
172     open STDIN , "<&", $fh2;
173     open STDOUT, ">&", $fh2;
174     fcntl $stdin , Fcntl::F_SETFD, 0;
175     fcntl $stdout, Fcntl::F_SETFD, 0;
176     exec $exe, qw(--interpreter=mi2 -q), @$arg;
177     kill 9, 0; # don't want to load the POSIX module just for this
178     } else {
179 root 1.3 Carp::croak "cannot fork: $!";
180 root 1.1 }
181     }
182    
183     AnyEvent::Util::fh_nonblocking $self->{fh}, 1;
184    
185     {
186     Scalar::Util::weaken (my $self = $self);
187     $self->{rw} = AE::io $self->{fh}, 0, sub {
188     my $len = sysread $self->{fh}, $self->{rbuf}, 256, length $self->{rbuf};
189    
190 root 1.3 defined $len || $self->eof;
191 root 1.1
192     $self->feed ("$1")
193     while $self->{rbuf} =~ s/^([^\r\n]*)\r?\n//;
194     };
195    
196     $self->{wcb} = sub {
197     my $len = syswrite $self->{fh}, $self->{wbuf};
198     substr $self->{wbuf}, 0, $len, "";
199     delete $self->{ww} unless length $self->{wbuf};
200     };
201     }
202    
203 root 1.6 $self->{stdio} = sprintf "<&%d >&%d", fileno $stdin, fileno $stdout;
204    
205     $self->cmd_raw ("set exec-wrapper $self->{stdio}", sub { });
206 root 1.1
207     $self
208     }
209    
210     #sub DESTROY {
211     #)}
212    
213 root 1.3 sub eof {
214     my ($self) = @_;
215    
216     $self->event ("eof");
217    
218     %$self = ();
219     }
220    
221 root 1.1 sub send {
222     my ($self, $data) = @_;
223    
224 root 1.2 print "> $data"
225 root 1.3 if $self->{trace};
226 root 1.1
227     $self->{wbuf} .= $data;
228     $self->{ww} ||= AE::io $self->{fh}, 1, $self->{wcb};
229     }
230    
231     our %C_ESCAPE = (
232     "\\" => "\\",
233     '"' => '"',
234     "'" => "'",
235     "?" => "?",
236    
237     a => "\x07",
238     b => "\x08",
239     t => "\x09",
240     n => "\x0a",
241     v => "\x0b",
242     f => "\x0c",
243     r => "\x0d",
244     );
245    
246     sub _parse_c_string {
247     my $r = "";
248    
249     # syntax is not documented, so we do full C99, except unicode
250    
251     while () {
252     if (/\G([^"\\\n]+)/gc) {
253     $r .= $1;
254     } elsif (/\G\\([abtnvfr\\"'?])/gc) {
255     $r .= $C_ESCAPE{$1};
256     } elsif (/\G\\([0-8]{1,3})/gc) {
257     $r .= chr oct $1;
258     } elsif (/\G\\x([0-9a-fA-F]+)/gc) {
259     $r .= chr hex $1;
260     } elsif (/\G"/gc) {
261     last;
262     } else {
263     die "invalid string syntax\n";
264     }
265     }
266    
267     $r
268     }
269    
270     sub _parse_value {
271     if (/\G"/gc) { # c-string
272     &_parse_c_string
273    
274     } elsif (/\G\{/gc) { # tuple
275     my $r = &_parse_results;
276    
277     /\G\}/gc
278     or die "tuple does not end with '}'\n";
279    
280     $r
281    
282     } elsif (/\G\[/gc) { # list
283     my @r;
284    
285     until (/\G\]/gc) {
286     # if GDB outputs "result" in lists, let me know and uncomment the following lines
287     # # list might also contain key value pairs, but apparently
288     # # those are supposed to be ordered, so we use an array in perl.
289     # push @r, $1
290     # if /\G([^=,\[\]\{\}]+)=/gc;
291    
292     push @r, &_parse_value;
293    
294     /\G,/gc
295     or last;
296     }
297    
298     /\G\]/gc
299     or die "list does not end with ']'\n";
300    
301     \@r
302    
303     } else {
304     die "value expected\n";
305     }
306     }
307    
308     sub _parse_results {
309     my %r;
310    
311     # syntax for string is undocumented
312     while (/\G([^=,\[\]\{\}]+)=/gc) {
313     my $k = $1;
314    
315 root 1.3 $k =~ y/-/_/;
316    
317 root 1.1 $r{$k} = &_parse_value;
318    
319     /\G,/gc
320     or last;
321     }
322    
323     \%r
324     }
325    
326     my %type_map = qw(
327 root 1.3 * exec
328     + status
329     = notify
330 root 1.1 );
331    
332     sub feed {
333     my ($self, $line) = @_;
334    
335 root 1.2 print "< $line\n"
336 root 1.3 if $self->{trace};
337 root 1.1
338     for ($line) {
339     if (/^\(gdb\)\s*$/gc) { # docs say "(gdb)", but reality says "(gdb) "
340     # nop
341     } else {
342     /^([0-9]*)/gc; # [token], actually ([0-9]+)?
343     my $token = $1;
344    
345     eval {
346     if (/\G\^(done|running|connected|error|exit)/gc) { # result
347     my $class = $1 eq "running" ? "done" : $1;
348     # documented for error is an incompatible format, but in reality it is sane
349    
350     my $results = /\G,/gc ? &_parse_results : {};
351    
352     if (my $cb = delete $self->{cb}{$token}) {
353     # unfortunately, gdb sometimes outputs multiple result records for one command
354 root 1.3 $cb->($class, $results, delete $self->{console});
355 root 1.1 }
356    
357     } elsif (/\G([*+=])([^,]+)/gc) { # *exec-async, +status-async, =notify-async
358     my ($type, $class) = ($type_map{$1}, $2);
359    
360     my $results = /\G,/gc ? &_parse_results : {};
361    
362 root 1.3 $class =~ y/-/_/;
363    
364 root 1.2 $self->event ($type => $class, $results);
365 root 1.3 $self->event ("$type\_$class" => $results);
366 root 1.1
367     } elsif (/\G~"/gc) {
368 root 1.3 push @{ $self->{console} }, &_parse_c_string;
369 root 1.1 } elsif (/\G&"/gc) {
370 root 1.3 my $log = &_parse_c_string;
371 root 1.6 chomp $log;
372 root 1.3 print "$log\n" if $self->{verbose};
373     $self->event (log => $log);
374 root 1.1 } elsif (/\G\@"/gc) {
375 root 1.3 $self->event (target => &_parse_c_string);
376 root 1.1 }
377     };
378    
379     /\G(.{0,16})/gcs;
380     $@ = "extra data\n" if !$@ and length $1;
381    
382     if ($@) {
383     chop $@;
384 root 1.3 warn "AnyEvent::GDB: parse error: $@, at ...$1\n";
385     $self->eof;
386 root 1.1 }
387     }
388     }
389     }
390    
391     sub _q($) {
392     return $_[0]
393     if $_[0] =~ /^[A-Za-z0-9_]+$/; # we are a lot more strict than the spec
394    
395     local $_ = shift;
396     utf8::encode $_; # just in case
397     s/([^\x20-\x21\x23-\x5b\x5d-\x7e])/sprintf "\\x%02x", ord $1/ge;
398     "\"$_\""
399     }
400    
401     =item $gdb->cmd_raw ($command, $cb->($class, $results, $console))
402    
403     Execute a raw command: C<$command> is sent unchanged to GDB. See C<cmd_>
404     for a description of the callback arguments.
405    
406     Example: execute a CLI command and print its output.
407    
408     $gdb->cmd_raw ("info sh", sub {
409     print "$_[3]\n";
410     });
411    
412     =cut
413    
414     sub cmd_raw {
415     my ($self, $cmd, $cb) = @_;
416    
417     my $token = ++$self->{token};
418     $self->send ("$token$cmd\n");
419     $self->{cb}{$token} = $cb;
420     }
421    
422     =item $gdb->cmd ($command => [$option...], $parameter..., $cb->($class, $results, $console))
423    
424     Execute a MI command and invoke the callback with the results.
425    
426 root 1.2 C<$command> is a MI command name. The leading minus sign can be omitted,
427     and instead of minus signs, you can use underscores, i.e. all the
428     following command names are equivalent:
429    
430     "-break-insert" # as documented in the GDB manual
431     -break_insert # using underscores and _ to avoid having to quote
432     break_insert # ditto, when e.g. used to the left of a =>
433     "break-insert" # no leading minus
434 root 1.1
435     The second argument is an optional array reference with options (i.e. it
436     can simply be missing). Each C<$option> is either an option name (similar
437     rules as with command names, i.e. no initial C<-->) or an array reference
438     with the first element being the option name, and the remaining elements
439     being parameters: [$option, $parameter...].
440    
441     The remaining arguments, excluding the last one, are simply the parameters
442     passed to GDB.
443    
444     All options and parameters will be properly quoted.
445    
446     When the command is done, the callback C<$cb> will be invoked with
447     C<$class> being one of C<done>, C<connected>, C<error> or C<exit>
448     (note: not C<running>), C<$results> being a has reference with all the
449     C<variable=value> pairs from the result list.
450    
451     C<$console> is an array reference with all the GDB console messages
452     written while command executes (for MI commands, this should always be
453     C<undef> and can be ignored).
454    
455     Example: #todo#
456    
457     =cut
458    
459     sub cmd {
460     my $cb = pop;
461     my ($self, $cmd, @arg) = @_;
462    
463 root 1.2 $cmd =~ s/^[\-_]?/_/;
464     $cmd =~ y/_/-/;
465    
466     $cmd .= " ";
467 root 1.1
468     my $opt = ref $arg[0] ? shift @arg : [];
469    
470     for (@$opt) {
471     $cmd .= "-";
472     $cmd .= (_q $_) . " "
473     for (ref) ? @$_ : $_;
474     }
475    
476 root 1.5 # the MI syntax is inconsistent, providing "--" in case
477 root 1.1 # parameters start with "-", but not allowing "-" as first
478     # char of a parameter. in fact, "--" is flagged as unknown
479     # option.
480     if (@arg) {
481     # $cmd .= "-- ";
482    
483     $cmd .= (_q $_) . " "
484     for @arg;
485     }
486    
487     # remove trailing " "
488     substr $cmd, -1, 1, "";
489    
490     $self->cmd_raw ($cmd, $cb);
491     }
492    
493 root 1.6 =item ($results, $console) = $gdb->cmd_sync ($command => [$option...], $parameter...])
494     =item $results = $gdb->cmd_sync ($command => [$option...], $parameter...])
495 root 1.1
496 root 1.6 Like C<cmd>, but blocks execution until the command has been executed, and
497     returns the results if sucessful. Croaks when GDB returns with an error.
498 root 1.1
499     This is purely a convenience method for small scripts: since it blocks
500     execution using a condvar, it is not suitable to be used inside callbacks
501 root 1.6 or modules.
502    
503     That is, unless L<Coro> is used - with Coro, you can run multiple
504     C<cmd_sync> methods concurrently form multiple threads, with no issues.
505 root 1.1
506     =cut
507    
508     sub cmd_sync {
509     push @_, my $cv = AE::cv;
510     &cmd;
511 root 1.6
512     my ($class, $results, $console) = $cv->recv;
513    
514     Carp::croak $results->{msg}
515     if $class eq "error";
516    
517     wantarray ? ($results, $console) : $results
518 root 1.1 }
519    
520     sub event {
521     my ($self, $event, @args) = @_;
522    
523 root 1.2 # if ($self->{verbose}) {
524     # use Data::Dumper;
525     # print Data::Dumper
526     # ->new ([[$event, @args]])
527     # ->Pair ("=>")
528     # ->Useqq (1)
529     # ->Indent (0)
530     # ->Terse (1)
531     # ->Quotekeys (0)
532     # ->Sortkeys (1)
533     # ->Dump,
534     # "\n";
535     # }
536    
537 root 1.3 my $cb;
538    
539 root 1.5 $cb = $self->can ("on_event") and $cb->($self, $event, @args);
540     $cb = $self-> {on_event} and $cb->($self, $event, @args);
541     $cb = $self->can ("on_$event") and $cb->($self, $event, @args);
542 root 1.3 $cb = $self-> {"on_$event"} and $cb->($self, $event, @args);
543     }
544    
545     # predefined events
546    
547     sub on_notify_thread_group_added {
548     my ($self, undef, $r) = @_;
549    
550     $self->{thread_group}{$r->{id}} = $r;
551     }
552    
553     sub on_notify_thread_group_removed {
554     my ($self, undef, $r) = @_;
555    
556     delete $self->{thread_group}{$r->{id}};
557     }
558    
559     sub on_notify_thread_group_started {
560     my ($self, undef, $r) = @_;
561    
562     delete $self->{thread_group}{exit_code};
563     $self->{thread_group}{$r->{id}}{pid} = $r->{pid};
564     }
565    
566     sub on_notify_thread_group_exited {
567     my ($self, undef, $r) = @_;
568    
569     delete $self->{thread_group}{pid};
570     $self->{thread_group}{$r->{id}}{exit_code} = $r->{exit_code};
571     }
572    
573     sub on_notify_record_started {
574     my ($self, undef, $r) = @_;
575    
576     $self->{thread_group}{$r->{id}}{recording} = 1;
577     }
578    
579     sub on_notify_record_stopped {
580     my ($self, undef, $r) = @_;
581    
582     $self->{thread_group}{$r->{id}}{recording} = 0;
583     }
584    
585     sub on_notify_thread_created {
586     my ($self, undef, $r) = @_;
587    
588     $self->{thread}{$r->{id}} = $r;
589     }
590    
591     sub on_notify_thread_exited {
592     my ($self, undef, $r) = @_;
593    
594     delete $self->{thread}{$r->{id}};
595     }
596    
597     sub _threads {
598 root 1.4 my ($self, $id) = @_;
599 root 1.3
600 root 1.4 ref $id
601 root 1.5 ? @{ $self->{thread} }{@$id}
602 root 1.4 : $id eq "all"
603     ? values %{ $self->{thread} }
604     : $self->{thread}{$id}
605 root 1.3 }
606    
607     sub on_exec_running {
608     my ($self, undef, $r) = @_;
609    
610 root 1.5 for ($self->_threads ($r->{thread_id})) {
611 root 1.3 delete $_->{stopped};
612     $_->{running} = 1;
613     }
614     }
615    
616     sub on_exec_stopped {
617     my ($self, undef, $r) = @_;
618    
619 root 1.5 for ($self->_threads ($r->{stopped_threads})) {
620 root 1.3 delete $_->{running};
621     $_->{stopped} = $r;
622     }
623    
624     # $self->event ("thread_$r->{reason}" => $r, [map $_->{id}, $self->_threads ($r)]);
625     }
626    
627     sub _thread_groups {
628     my ($self, $r) = @_;
629 root 1.2
630 root 1.3 exists $r->{thread_group}
631     ? $self->{thread_group}{$r->{thread_group}}
632     : values %{ $self->{thread_group} }
633 root 1.1 }
634    
635 root 1.3 sub on_notify_library_loaded {
636     my ($self, undef, $r) = @_;
637    
638     $_->{library}{$r->{id}} = $r
639     for $self->_thread_groups ($r);
640     }
641    
642     sub on_notify_library_unloaded {
643     my ($self, undef, $r) = @_;
644    
645     delete $_->{library}{$r->{id}}
646     for $self->_thread_groups ($r);
647     }
648    
649     =back
650    
651     =head2 EVENTS
652    
653     AnyEvent::GDB is asynchronous in nature, as the goal of the MI interface
654     is to be fully asynchronous. Due to this, a user of this interface must
655     be prepared to handle various events.
656    
657 root 1.4 When an event is produced, the GDB object will look for the following four
658     handlers and, if found, will call each one in order with the GDB object
659     and event name (without C<on_>) as the first two arguments, followed by
660     any event-specific arguments:
661 root 1.3
662     =over 4
663    
664 root 1.4 =item on_event method on the GDB object
665 root 1.3
666     Useful when subclassing.
667    
668 root 1.6 =item on_event constructor parameter/object member
669 root 1.3
670     The callback specified as C<on_event> parameter to the constructor.
671    
672 root 1.4 =item on_EVENTNAME method on the GDB object
673 root 1.3
674     Again, mainly useful when subclassing.
675    
676 root 1.6 =item on_EVENTNAME constructor parameter/object member
677 root 1.4
678     Any callback specified as C<on_EVENTNAME> parameter to the constructor.
679    
680 root 1.3 =back
681    
682 root 1.6 You can change callbacks dynamically by simply replacing the corresponding
683     C<on_XXX> member in the C<$gdb> object:
684    
685     $gdb->{on_event} = sub {
686     # new event handler
687     };
688    
689 root 1.3 Here's the list of events with a description of their arguments.
690    
691     =over 4
692    
693     =item on_eof => $cb->($gdb, "eof")
694    
695     Called whenever GDB closes the connection. After this event, the object is
696     partially destroyed and must not be accessed again.
697    
698     =item on_target => $cb->($gdb, "target", $string)
699    
700     Output received from the target. Normally, this is sent directly to STDOUT
701     by GDB, but remote targets use this hook.
702    
703     =item on_log => $cb->($gdb, "log", $string)
704    
705     Log output from GDB. Best printed to STDOUT in interactive sessions.
706    
707     =item on_TYPE => $cb->($gdb, "TYPE", $class, $results)
708    
709     Called for GDB C<exec>, C<status> and C<notify> event (TYPE is one of
710     these three strings). C<$class> is the class of the event, with C<->
711     replaced by C<_> everywhere.
712    
713     For each of these, the GDB object will create I<two> events: one for TYPE,
714     and one for TYPE_CLASS. Usuaully you should provide the more specific
715     event (TYPE_CLASS).
716    
717     =item on_TYPE_CLASS => $cb->($gdb, "TYPE_CLASS", $results)
718    
719     Called for GDB C<exec>, C<status> and C<notify> event: TYPE is one
720     of these three strings, the class of the event (with C<-> replaced b
721     C<_>s) is appended to it to form the TYPE_CLASS (e.g. C<exec_stopped> or
722     C<notify_library_loaded>).
723    
724 root 1.1 =back
725    
726 root 1.6 =head2 STATUS STORAGE
727    
728     The default implementations of the event method store the thread,
729     thread_group, recording, library and running status insid ethe C<$gdb>
730     object.
731    
732     You can access these at any time. Specifically, the following information
733     is available:
734    
735     =over 4
736    
737     =item C<< $gdb->{thread_group}{I<id>} >>
738    
739     The C<thread_group> member stores a hash for each existing thread
740     group. The hash always contains the C<id> member, but might also contain
741     other members.
742    
743     =item C<< $gdb->{thread_group}{I<id>}{pid} >>
744    
745     The C<pid> member only exists while the thread group is running a program,
746     and contaisn the PID of the program.
747    
748     =item C<< $gdb->{thread_group}{I<id>}{exit_code} >>
749    
750     The C<exit_code> member only exists after a program has finished
751     executing, and before it is started again, and contains the exit code of
752     the program.
753    
754     =item C<< $gdb->{thread_group}{I<id>}{recording} >>
755    
756     The C<recording> member only exists if recording has been previously
757     started, and is C<1> if recoridng is currently active, and C<0> if it has
758     been stopped again.
759    
760     =item C<< $gdb->{thread}{I<id>} >>
761    
762     The C<thread> member stores a hash for each existing thread. The hash
763     always contains the C<id> member with the thread id, and the C<group_id>
764     member with the corresponding thread group id.
765    
766     =item C<< $gdb->{thread}{I<id>}{running} >>
767    
768     The C<running> member is C<1> while the thread is, well, running, and is
769     missing otherwise.
770    
771     =item C<< $gdb->{thread}{I<id>}{stopped} >>
772    
773     The C<stopped> member contains the result list from the C<on_exec_stopped>
774     notification that caused the thread to stop, and only exists when the
775     thread is topped.
776    
777     =item C<< $gdb->{library}{I<id>} >>
778    
779     The C<library> member contains all results from the C<on_library_loaded>
780     event (such as C<id>, C<target_name>, C<host_name> and potentially a
781     C<thread_group>.
782    
783     =back
784    
785 root 1.1 =head1 SEE ALSO
786    
787     L<AnyEvent>, L<http://sourceware.org/gdb/current/onlinedocs/gdb/GDB_002fMI.html#GDB_002fMI>.
788    
789     =head1 AUTHOR
790    
791     Marc Lehmann <schmorp@schmorp.de>
792     http://home.schmorp.de/
793    
794     =cut
795    
796     1