如何在10秒后暂停执行程序并获得回溯?

时间:2016-02-24 13:05:33

标签: debugging gdb infinite-loop backtrace sigint

遗留程序最有可能在某些病理输入上进入无限循环。我有> 1000个这样的实例,但是,我怀疑它们中的绝大多数会触发相同的错误。因此,我想将> 1000个实例减少到根本不同的实例。第一步是在10秒之后暂停应用程序并收集回溯。

如果我跑:

gdb --batch --command=backtrace.txt --args ./legacy_program

使用backtrace.txt

run
bt

我在同一个终端10秒后按Ctrl + C,我得到了我想要的回溯。

现在,我想自动执行此操作。我尝试从另一个终端发送SIGINT(预期等效的Ctrl + C),但我不再获得回溯。以下是我失败的一些尝试 GDB how to stop execution without a breakpoint? 这些都没有任何影响:

pkill -SIGINT gdb 
kill -SIGINT 5717 

其中5717是唯一运行的gdb的pid。将SIGINT发送到legacy_program 以同样的方式将其删除但后来我没有获得回溯:

Program received signal SIGINT, Interrupt.
Quit

如何在10秒后以编程方式暂停执行legacy_program并获得回溯?

<子> 这篇文章的动机是我无法在StackOverflow找到这个问题的答案。 另请注意 it is not merely OK to ask and answer your own question, it is explicitly encouraged.

1 个答案:

答案 0 :(得分:3)

显然,它是gdb中已知的(bug)功能,请参阅 GDB is not trapping SIGINT. Ctrl+C terminates program when should break gdb.尝试从其他终端发送SIGSTOP

pkill -STOP legacy_program 

它适用于我的机器。

请注意,您不必在调试器中运行legacy_program。启用核心转储

ulimit -c unlimited 

并发送程序SIGTRAP使其崩溃,然后从核心转储中获取回溯。所以,启动程序:

./legacy_program

来自另一个终端:

pkill -TRAP legacy_program 

可以像这样获得回溯:

gdb --batch -ex=bt ./legacy_program core