遗留程序最有可能在某些病理输入上进入无限循环。我有> 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. 子>
答案 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