C 如何调试gdb中的sem_wait函数?
我想使用gdb调试多个线程。当然,线程使用信号量来很好地协同工作。但是如果有这样一句话: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。但是我想回到命令行
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;
}