Like in
for((;;)) {
gdb -batch -n -ex 'set pagination off' -ex 'thread apply all bt' ffplay_g `pidof ffplay_g` >> /tmp/qq;
}
, but faster, without reloading GDB and symbols every time?
Backtraces need to be taken by timer, not by triggering some breakpoints.
Use system sleep, this gdb
command should do the trick:
shell sleep 1
As recommended by the comment If you want to stick with gdb, then why not script a gdb session? Your controller process can sleep for 50 ms, then wake up, send a ^C, t a a bt, c, and then go back to sleep. – Jeremy W. Sherman
http://vi-server.org/vi/bin/gdbdriver.pl
#!/usr/bin/perl -w
use strict;
use IPC::Open2;
my $init = "run";
my $command = "bt";
my $delay = 1;
my $need_int=0;
$init = shift @ARGV;
$delay = shift @ARGV;
$command = shift @ARGV;
die("Usage: gdbpriver.pl '' 0.1 'bt' gdb -q /path/to/proc 33344\n\tgdbdriver.pl init_command period_seconds backtrace_command startup_arguments\n") unless $ARGV[0];
my $pid = open2(\*OUT, \*IN, @ARGV);
print "pid=$pid\n";
print IN "set pagination off\n";
print IN "$init\n";
while(<OUT>) {
if (/Starting program:/) {
$need_int=1;
last;
}
last if /\(gdb\)/;
}
sub intr() {
kill 9, $pid;
exit(0);
}
$SIG{'INT'} = \&intr;
sub spipe() {
print "PIPE!\n";
}
$SIG{'PIPE'} = \&spipe;
if($need_int) {
kill 2, $pid;
}
for(;;) {
print IN "$command\n"; # backtrace
print IN "c\n"; # continue the program
while(<OUT>) {
last if /Continuing./;
print;
}
select undef, undef, undef, $delay; # sorry, nanosleep fails
print "INT\n";
kill 2, $pid; # SIGINT to gdb to make it interrupt the program
}
Attach, set the breakpoint, set commands on that breakpoint that include continue
, and then continue:
$ gdb attach ffplay_g
. . .
(gdb) b symbol
(gdb) comm 1
> t a a bt
> c
> end
(gdb) c
If you are asking how to have gdb break in regularly, well, you could just loop calling step and then backtrace, but you're not going to get very far very fast:
(gdb) while 1
(gdb) t a a bt
(gdb) s
(gdb) end
If you're trying to profile your process, this is the wrong way. Look into gprof or (under Mac OS/iOS) Shark.