gpt4 book ai didi

c++ - 如何将 gdb 用于多线程网络程序

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:31:28 24 4
gpt4 key购买 nike

我正在使用 epoll 进行网络编程。我遇到了段错误,但由于它在多线程上运行,因此很难通过使用日志找到它准确获取错误的位置。

我尝试使用 gdb 以便可以看到堆栈跟踪。如果我在 gdb 上运行它,那么我会从 epoll_wait 得到这个错误。如果我从不同的客户端连接到服务器,那么它根本不起作用。

我该如何解决这个问题,以便我可以使用 gdb 找出出现段错误的位置提前致谢..

epoll_wait error
: Interrupted system call

最佳答案

您需要修复您的程序才能正确处理 EINTR。 EINTR(“中断的系统调用”)不是 fatal error ;它只是意味着“请再次重试该系统调用”。所以你调用 epoll_wait() 的代码应该检测到它并静静地重试调用。像这样:

int rv;
do {
rv = epoll_wait(epfd, events, maxevents, timeout);
} while (rv == -1 && errno == EINTR);

或者,如果你有一个固定的超时时间,你需要在每次调用时重新计算它:

int rv;
rv = epoll_wait(epfd, events, maxevents, timeout);
while (rv == -1 && errno == EINTR) {
...TODO: recalculate timeout here...
rv = epoll_wait(epfd, events, maxevents, timeout);
}

如果您不知道这一点,您可能在调用其他系统调用时遇到了同样的错误。特别是 read() 和 write(),还有许多其他调用 - 检查您使用的调用的手册页,看看它们是否将 EINTR 列为可能的错误。

阻止 EINTR 的发生通常是不切实际的——如果您使用任何使用信号的库,或者如果您自己使用信号,那么您可以获得 EINTR。上次我查看时,Linux 线程库使用信号。

关于c++ - 如何将 gdb 用于多线程网络程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6813629/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com