【问题标题】:Child processes gives seg fault on exit function子进程在退出函数上给出 seg 错误
【发布时间】:2013-02-28 13:07:57
【问题描述】:

我的环境:

  • FreeBSD 9.1,我得到了一个预分叉的多进程环境。
  • 一个主进程,一个轮询器来管理工作人员(决定忙碌或可用)和工作人员。

如果我将SIGTERM 发送到主进程,那没关系,如果工人数量不高。如果high (x > 20) 我得到段错误。

我有两个 truss 输出,一个是正常出口,另一个是 seg 错误。

核心文件的gdb输出:

Die: DW_TAG_unspecified_type (abbrev = 62, offset = 1535499)
    has children: FALSE
    attributes:
        DW_AT_name (DW_FORM_strp) string: "decltype(nullptr)"
Dwarf Error: Cannot find type of die [in module /usr/local/lib/gcc46/libstdc++.so.6]
Die: DW_TAG_unspecified_type (abbrev = 62, offset = 1535499)
    has children: FALSE
    attributes:
        DW_AT_name (DW_FORM_strp) string: "decltype(nullptr)"
Dwarf Error: Cannot find type of die [in module /usr/local/lib/gcc46/libstdc++.so.6]

正常退出进程的truss输出:

> close(0)                                         = 0 (0x0) close(7)   
> = 0 (0x0) gettimeofday({1360957175.665250 },0x0)           = 0 (0x0) write(5,"2013-02-15 21:39:35.665 [64591] "...,64) = 64 (0x40) close(5)
> = 0 (0x0)
> 
> sigprocmask(SIG_BLOCK,SIGHUP|SIGINT|SIGQUIT|SIGKILL|SIGPIPE|SIGALRM|SIGTERM|SIGURG|SIGSTOP|SIGTSTP|SIGCONT|SIGCHLD|SIGTTIN|SIGTTOU|SIGIO|SIGXCPU|SIGXFSZ|SIGVTALRM|SIGPROF|SIGWINCH|SIGINFO|SIGUSR1|SIGUSR2,0x
> 0) = 0 (0x0)
> 
> sigprocmask(SIG_SETMASK,0x0,0x0)                 = 0 (0x0)
> 
> .............. .............. so many same sigprocmask call
> 
> 
> sigprocmask(SIG_BLOCK,SIGHUP|SIGINT|SIGQUIT|SIGKILL|SIGPIPE|SIGALRM|SIGTERM|SIGURG|SIGSTOP|SIGTSTP|SIGCONT|SIGCHLD|SIGTTIN|SIGTTOU|SIGIO|SIGXCPU|SIGXFSZ|SIGVTALRM|SIGPROF|SIGWINCH|SIGINFO|SIGUSR1|SIGUSR2,0x
> 0) = 0 (0x0)
> sigprocmask(SIG_SETMASK,0x0,0x0)                 = 0 (0x0)
> process exit, rval = 0

存在段错误的进程:

> gettimeofday({1360954514.547064 },0x0)           = 0 (0x0)
> write(5,"2013-02-15 20:55:14.547 [7580] I"...,63) = 63 (0x3f)
> close(5)                                         = 0 (0x0)
> SIGNAL 11 (SIGSEGV)
> process exit, rval = 0

当进程尝试调用 sigprocmask 时,它会给出 seg 错误。我没有明确调用 sigprocmask,并且怀疑调用 sigprocmask 的竞争条件。您是否遇到与 sigprocmask 相关的竞态条件?

【问题讨论】:

    标签: c++ signals fork multiprocessing freebsd


    【解决方案1】:

    当进程尝试调用 sigprocmask 时会出现 seg 错误

    我没看到。看来,崩溃是在第 5 个文件描述符关闭之后发生的。进一步看来,描述符 5 在关闭之前获得了一条日志消息(带有时间戳)。

    您的“主”守护进程尝试清理,但在尝试中死去。我建议在运行时将 gdb 附加到它——就在发送 SIGTERM 之前。发送 SIGTERM 后,告诉 gdb 继续。

    发送 SIGSEGV 后,进行调查。

    我还强烈建议在 valgrind 下运行守护程序。这样你很可能会抓到很多虱子……

    【讨论】:

    • 嗨,我解决了缓冲区溢出的问题。当程序试图归还内存时,我因 BoF 而出现 seg 错误。谢谢..
    • 始终在您的代码上使用 valgring。总是。它适用于 Linux 和 FreeBSD,没有理由不使用它进行测试运行。它会比你写下这个问题更快地指出这个缓冲区溢出问题。它可能仍然通过查找其他问题来帮助您...
    猜你喜欢
    • 1970-01-01
    • 2021-12-06
    • 2020-01-16
    • 1970-01-01
    • 2016-06-11
    • 1970-01-01
    • 2013-12-04
    • 1970-01-01
    • 2023-03-21
    相关资源
    最近更新 更多