如何使gdb可重复获取堆栈跟踪?
像
for((;;)) {
gdb -batch -n -ex 'set pagination off' -ex 'thread apply all bt' ffplay_g `pidof ffplay_g` >> /tmp/qq;
}
,但速度更快,无需每次重新加载GDB和符号?
回溯需要通过定时器进行,而不是触发某些断点。
使用系统睡眠,这个gdb
命令应该做的诀窍:
shell sleep 1
正如评论所建议的那样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, taa bt, c, and then go back to sleep. – Jeremy W. Sherman
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, taa 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 33344ntgdbdriver.pl init_command period_seconds backtrace_command startup_argumentsn") unless $ARGV[0];
my $pid = open2(*OUT, *IN, @ARGV);
print "pid=$pidn";
print IN "set pagination offn";
print IN "$initn";
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 "$commandn"; # backtrace
print IN "cn"; # continue the program
while(<OUT>) {
last if /Continuing./;
print;
}
select undef, undef, undef, $delay; # sorry, nanosleep fails
print "INTn";
kill 2, $pid; # SIGINT to gdb to make it interrupt the program
}
附加,设置断点,在包含continue
的断点上设置命令,然后继续:
$ gdb attach ffplay_g
. . .
(gdb) b symbol
(gdb) comm 1
> t a a bt
> c
> end
(gdb) c
如果你问如何定期让gdb进入休眠状态,那么你可以循环调用一步然后回溯,但是你不会非常快速:
(gdb) while 1
(gdb) t a a bt
(gdb) s
(gdb) end
如果你试图描述你的流程,这是错误的。 看看gprof或(在Mac OS / iOS下)鲨鱼。
链接地址: http://www.djcxy.com/p/86027.html上一篇: How to make gdb get stacktrace repeatably?
下一篇: What's the best way to send a signal to all members of a process group?