我如何使用gdb多线程网络程序
How do I use gdb for multi threaded networking program
我正在使用epoll进行网络编程。我得到一个分段错误,但由于它在多线程上运行,很难找到它确切地通过使用日志得到错误。
我试图使用gdb,所以我可以看到堆栈跟踪。如果我在gdb上运行这个,那么我从epoll_wait中得到这个错误。如果我从不同的客户端连接到服务器,那么它根本不起作用。
我如何解决这个问题,这样我就可以使用gdb找出它在哪里得到分段错误提前感谢……
epoll_wait error
: Interrupted system call
您需要修复您的程序以正确处理EINTR。EINTR("中断的系统调用")不是致命错误;它只是表示"请再次重试该系统调用"。因此,调用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线程库使用了信号。
在环境中启用核心转储保存。运行命令ulimit -c unlimited
并重新运行程序。当它崩溃时,将生成的核心转储加载到gdb中,并查看崩溃的回溯。在多线程程序中,通过一个命令一次获得所有线程的回溯是很方便的:(gdb) thread apply all bt
.
相关文章:
- 为什么我的程序在打开网络设备时遇到问题
- 网络插座 |无法设置on_close/打开处理程序
- 自动启动网络服务器和程序
- 简单的多播应用程序无法在同一网络上的不同计算机上运行
- 在多台计算机上运行SFML tcp 网络程序
- 如何在C++程序中连接 MATLAB 中构建的经过训练的神经网络
- 使用WordPress在网络服务器上运行C 应用程序
- 通过网络中的套接字进行文件传输时,该程序中的文件传输错误是什么
- 从 mfc 应用程序点击网络服务,并希望从网络服务登录方法读取用户代码返回
- 网络tcp套接字应用程序重试方法
- 基于libpcap的应用程序是否会影响网络速度/性能
- 是否有一个演示 C/C++ OpenCV 程序,可以从网络摄像头进行简单的球跟踪
- 正在将数据库连接到本地网络中的程序
- 从网络应用程序拆包操作类型的正确方式
- 通过网络在应用程序之间进行通信
- 序列化/封送C#中的简单对象以通过网络发送,供非托管C++应用程序读取
- C++网络程序设计:Boost Asio、Serialization和OStream
- 在我的神经网络程序中使用的最有效的数据结构是什么?我的程序需要动态分配吗?
- 我如何使用gdb多线程网络程序
- 网络程序运行,但没有输出