用gdb调试多线程程序,没有改变信号量但是执行了s..
时间:2009-08-22 来源:rain_fish
近期在调试epoll程序时发现用GDB时收不到消息,但是只执行程序是没有问题的,感觉很奇怪。经过输出日志的情况下跟踪程序,发现不是epoll的问题,而是信号量。上网一查发现这个问题确实存在,具体描述如下:
不调试运行正常,一个线程sem_wait()等待别的线程执行sem_post(),但是
用gdb调试运行时,本应等待的线程执行了后面的代码导致错误。 原因是:在GDB调试环境下sem_wait()总是被触发,但是errno是EINTR(系统中断),这是需要屏蔽EINTR,具体操作代码是: int ret = 0;
while (0 != (ret = sem_wait(&(_readyfds.sem_write))))
{
if (errno == EINTR)
continue; else return -1;
} 这样就可以了。
用gdb调试运行时,本应等待的线程执行了后面的代码导致错误。 原因是:在GDB调试环境下sem_wait()总是被触发,但是errno是EINTR(系统中断),这是需要屏蔽EINTR,具体操作代码是: int ret = 0;
while (0 != (ret = sem_wait(&(_readyfds.sem_write))))
{
if (errno == EINTR)
continue; else return -1;
} 这样就可以了。
相关阅读 更多 +