【问题标题】:sigpipe with sscanf and threading带有 sscanf 和线程的 sigpipe
【发布时间】:2016-08-11 00:15:58
【问题描述】:

描述

我为立方体 2 制作了一个 C 服务器模组:Sauerbraten https://github.com/deathstar/QServCollect

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

IRC Bot 最终停止在打开的套接字上发送 ping/pong 数据。该进程是线程化的,由于主线程是通过 PTHREAD_CREATE_JOINABLE 加入的,因此当 IRC 机器人死亡时,它也会死亡。这会导致整个服务器崩溃,我只是想调试它。任何帮助将不胜感激。

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...

【问题讨论】:

  • 您需要在此处发布代码的相关部分,而不是在外部链接中。
  • 您不会从 sigpipe 获得 seg 错误。您可能会从您的 sigpipe 处理程序错误处理第一个信号中得到一个段错误。您的代码在做什么以及它如何处理信号。
  • 阅读我的评论here,冲突代码here,带线程的主函数here

标签: c multithreading scanf sigpipe


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-22
    • 1970-01-01
    • 2017-04-12
    • 2016-04-05
    • 1970-01-01
    相关资源
    最近更新 更多