【发布时间】:2018-03-12 04:39:51
【问题描述】:
在调试大型 C 应用程序时,我看到来自 gdb 的奇怪行为:
我总是可以按Ctrl+C打断程序:
^C
Program received signal SIGINT, Interrupt.
0x76f58964 in select () at ../sysdeps/unix/syscall-template.S:81
81 in ../sysdeps/unix/syscall-template.S
(gdb)
但是,在程序运行足够长的时间后(例如 > 1 天),我不能再轻易地中断程序了。
当试图用Ctrl+C 中断程序时,gdb 只会显示
^C
Program received signal SIGINT, Interrupt.
并在那里挂起几分钟到几小时。
如果花费的时间超过几分钟,我通常会打开另一个终端并手动终止 gdb 才能继续。
问题:这是gdb 的预期行为吗?我可以设置一个选项来避免这种情况吗?
更多细节:
- 应用程序是
FTL(https://github.com/pi-hole/FTL) - 它是多线程的,使用
pthreads - 在点击
Ctrl+C后的等待时间内,gdb处于 100% CPU。
编辑:更多细节
我在 gdb 被冻结时运行了大约 10 秒 perf record -p $(pidof gdb)。 perf report 返回:
90,82% gdb gdb [.] find_thread_ptid
9,13% gdb gdb [.] ptid_equal
0,02% gdb gdb [.] iterate_over_threads
0,01% gdb [kernel.kallsyms] [k] run_timer_softirq
0,01% gdb gdb [.] 0x0016a9a4
0,00% gdb gdb [.] 0x0015a480
0,00% gdb gdb [.] 0x0016a998
0,00% gdb gdb [.] is_exited
几分钟后,gdb 完成,我运行 info threads,它仍然只显示三个线程(和以前一样):
(gdb) info threads
Id Target Id Frame
3 Thread 0x764b8460 (LWP 10114) "socket listener" 0x76f60260 in accept () at ../sysdeps/unix/syscall-template.S:81
2 Thread 0x76cb8460 (LWP 10113) "loganalyzer" 0x76f58964 in select () at ../sysdeps/unix/syscall-template.S:81
* 1 Thread 0x76e65000 (LWP 10098) "pihole-FTL" 0x76f58964 in select () at ../sysdeps/unix/syscall-template.S:81
【问题讨论】:
-
文件
signal.c似乎与它处理SIGINT信号的方式有些不一致。这可能与观察到的问题有关