我想使用gdb来调试多个线程。当然线程使用信号量很好地协同工作。但是当有一句话如下:
sem_wait(&empty);
现在假设信号量为空应该等到空可用。换句话说,它应该阻止在这里。并且gdb是调度程序锁定的:
(gdb) show scheduler-locking
Mode for locking scheduler during execution is "on".
然后我输入
n
gdb是如下所示的块。 (当然它应该是阻止的。但我想回到命令行切换到其他线程继续调试。)
(gdb) n
^C
Thread 3 "sem" received signal SIGINT, Interrupt.
0x00007ffff7bc6f96 in futex_abstimed_wait_cancelable (private=0,
abstime=0x0, expected=0, futex_word=0x555555755060 <full>)
at ../sysdeps/unix/sysv/linux/futex-internal.h:205
我想使用Ctrl-C,但线程退出。所以我该怎么做?谢谢你的回答。
答案 0 :(得分:1)
我想使用Ctrl-C,但线程退出。
当您的主题收到SIGINT
信号时,sem_wait
应该返回EINTR
错误。见documentation:
EINTR呼叫被信号处理程序中断;见信号(7)。
您可以尝试添加EINTR
的错误处理,并在出现此错误时再次调用sem_wait
,以使您的代码更具可调试性。您可以使用此blog post中的sem_wait
包装器:
static inline
int sem_wait_nointr(sem_t *sem) {
while (sem_wait(sem))
if (errno == EINTR) errno = 0;
else return -1;
return 0;
}