如何调试gdb中的sem_wait函数?

时间:2018-02-02 05:21:00

标签: c multithreading gdb semaphore

我想使用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,但线程退出。所以我该怎么做?谢谢你的回答。

1 个答案:

答案 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;
}