C 如何调试gdb中的sem_wait函数?

C 如何调试gdb中的sem_wait函数?,c,multithreading,gdb,semaphore,C,Multithreading,Gdb,Semaphore,我想使用gdb调试多个线程。当然,线程使用信号量来很好地协同工作。但是如果有这样一句话: sem_wait(&empty); 假设现在信号量empty应该等到empty可用。换句话说,它应该在这里阻塞。并且gdb计划程序正在锁定: (gdb) show scheduler-locking Mode for locking scheduler during execution is "on". 然后我输入 n gdb块如下所示。(当然应该是block。但是我想回到命令行

我想使用gdb调试多个线程。当然,线程使用信号量来很好地协同工作。但是如果有这样一句话:

sem_wait(&empty);
假设现在信号量empty应该等到empty可用。换句话说,它应该在这里阻塞。并且gdb计划程序正在锁定:

(gdb) show scheduler-locking 
      Mode for locking scheduler during execution is "on".
然后我输入

n
gdb块如下所示。(当然应该是block。但是我想回到命令行切换到其他线程继续调试。)

(gdb)n
^C
线程3“sem”收到信号SIGINT,中断。
可取消futex中的0x00007FF7BC6F96等待(专用=0,
abstime=0x0,预期值=0,futex_字=0x55755060)
位于../sysdeps/unix/sysv/linux/futex internal.h:205
我想使用Ctrl-C,但线程退出。那我该怎么办?谢谢你的回答

我想使用Ctrl-C,但线程退出

当线程收到
SIGINT
信号时,
sem\u wait
应返回
EINTR
错误。见:

EINTR呼叫被信号处理程序中断;见信号(7)

您可以尝试添加
EINTR
的错误处理,并在出现此错误时再次调用
sem\u wait
,以使代码更易于调试。您可以从以下位置使用
sem\u wait
的包装:


不太清楚您在问什么,但您可以配置
gdb
来捕获信号或将其传递给代码。如果这就是你要问的,看看这里:@yano,我来解释这个问题。我认为这不是信号问题。因为它运行正常,不是一个bug。
(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
static inline
int sem_wait_nointr(sem_t *sem) {
  while (sem_wait(sem))
    if (errno == EINTR) errno = 0;
    else return -1;
  return 0;
}