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

标签 c++ c linux networking gdb

我正在使用 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/

相关文章:

linux - 如何从 fish $PATH 中永久删除一条路径?

c - 如果我的编译器对函数指针的支持被破坏,我该如何编写一个调度程序?

转换双指针以及如何在 C 中使用

php ssh2_execute 偶尔会挂起

C++ 模板 : check if a type's destructor can be "ignored"

C++虚函数定义

c++ - 分配给堆与堆栈的执行时间有何不同?

C++ [] 映射,可能通过模板

c - c中的浮点不准确

linux - 如何通过linux终端在文本文件中创建一个名为sth的文件夹?