【问题标题】:strace: SIGFPE before anything happensstrace:在任何事情发生之前的 SIGFPE
【发布时间】:2011-02-21 23:43:33
【问题描述】:

我在特定机器上执行 C++ 程序时遇到问题。这是整个 strace 输出:

26936 execve("/data1/xfm/bin/xfm", ["/data1/xfm/bin/xfm", "-d", "-s", "/data1/smail/", "-p", "/data1/xfm", "-m", "Mailing.176"], [/* 21 vars */]) = 0
26936 uname({sys="Linux", node="smail2.<removed>.com", ...}) = 0
26936 brk(0)                            = 0x98f7000
26936 --- SIGFPE (Floating point exception) @ 0 (0) ---
26936 +++ killed by SIGFPE +++

我已经在其他几台机器上安装并运行了这个可执行文件,没有任何问题(并且有数千行 strace 输出)。知道什么可能导致我的问题吗?谢谢。

【问题讨论】:

    标签: c++ linux strace


    【解决方案1】:

    我的猜测是问题机器运行的是较旧的 Linux 发行版:据我所知,通常的原因是二进制文件中的符号哈希表与动态链接器。

    动态链接的二进制文件(或相关的库)可能在名为 .hash 的部分中具有经典 ELF 符号哈希表,或在名为 .gnu.hash 的部分中具有新的 GNU 符号哈希表,或两者兼有。

    一些较新的发行版默认设置 gcc 以将标志传递给链接器 (--hash-style=gnu),这导致它在二进制文件中仅发出 .gnu.hash 部分。

    如果这样的二进制文件在带有不理解.gnu.hash 的旧动态链接器的旧系统上运行,它将完全以这种方式失败。失败发生在很早的时候,在动态链接期间(在二进制文件实际执行任何操作之前),这就是为什么您几乎没有从 strace 获得任何输出。

    【讨论】:

      【解决方案2】:

      仅凭这些信息很难给出答案。您应该尝试在 gdb 中运行您的程序或插入 sigfpe 信号处理程序以确定错误的确切位置及其原因。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-15
        • 2021-05-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多