使用sscanf和线程进行sigpipe分段故障

时间:2016-08-11 00:15:59

标签: c multithreading scanf sigpipe

描述

我为多维数据集2制作了一个C服务器mod:Sauerbraten https://github.com/deathstar/QServCollect

所有代码都可以在上面的链接中找到

IRC Bot最终停止在打开的套接字上发送ping / pong数据。该进程是线程化的,因为主线程通过PTHREAD_CREATE_JOINABLE连接,所以当IRC bot死亡时它就会死掉。这会导致整个服务器崩溃,我只是试图调试它。任何帮助将不胜感激。

KEY

Ircbot代码:ircbot / ircbot.cpp,ircbot / ircbot.h

主线程:engine / server.cpp

LLDB调查报告

Process 7933 stopped
* thread #1: tid = 0xa4b8d, 0x00007fff83e4010a libsystem_kernel.dylib`__semwait_signal + 10, queue = 'com.apple.main-thread', stop reason = signal SIGPIPE
    frame #0: 0x00007fff83e4010a libsystem_kernel.dylib`__semwait_signal + 10
libsystem_kernel.dylib`__semwait_signal:
->  0x7fff83e4010a <+10>: jae    0x7fff83e40114            ; <+20>
    0x7fff83e4010c <+12>: movq   %rax, %rdi
    0x7fff83e4010f <+15>: jmp    0x7fff83e3a7f2            ; cerror
    0x7fff83e40114 <+20>: retq  

服务器日志

PING :NuclearFallout.WA.US.GameSurge.net

SENT: PONG :NuclearFallout.WA.US.GameSurge.net

PING :NuclearFallout.WA.US.GameSurge.net

SENT: PONG :NuclearFallout.WA.US.GameSurge.net

[ OK ] looking up sauerbraten.org...
master server registration failed: failed pinging server
[ OK ] looking up sauerbraten.org...

1 个答案:

答案 0 :(得分:0)

问题是函数(特别是sscanf)被数据重载了。我需要做一个strlen(buff)来检查进入函数的数据的缓冲区大小。从本质上讲,它获得的数据远远多于它可以处理的数据,并且最终会因此而导致崩溃。

如果要实现线程,请确保使用线程安全实现。