c++ - exec 如何改变执行程序的行为

标签 c++ linux crash exec

我正试图追踪一个非常奇怪的崩溃。奇怪的是有人发现了我无法解释的解决方法。

解决方法是这个我称之为“runner”的小程序:

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>

int main(int argc, char *argv[])
{
    if (argc == 1)
    {
        fprintf(stderr, "Usage: %s prog [args ...]\n", argv[0]);
        return 1;
    }

    execvp(argv[1], argv + 1);

    fprintf(stderr, "execv failed: %s\n", strerror(errno));

    // If exec returns because the program is not found or we
    // don't have the appropriate permission
    return 255;
}

如您所见,该程序所做的只是使用 execvp 将自身替换为不同的程序。

直接从命令行调用程序崩溃:

/path/to/prog args  # this crashes

但是当它通过我的 runner shim 间接调用时工作正常:

/path/to/runner /path/to/prog args   # works successfully

在我的一生中,我可以弄清楚额外的 exec 如何改变正在运行的程序的行为(如您所见,该程序不会改变环境)。

崩溃的一些背景。崩溃本身发生在 C++ 运行时。具体来说,当程序执行 throw 时,崩溃版本错误地认为没有匹配的 catch(尽管有)并调用 terminate。当我通过 runner 调用程序时,异常被正确捕获。

我的问题是,为什么额外的 exec 会改变被执行程序的行为?

最佳答案

运行器加载的 .so 文件可能导致运行器正常工作。尝试 ldd'ing 每个二进制文件,看看是否有任何库正在加载不同的版本/位置。

关于c++ - exec 如何改变执行程序的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2495348/

相关文章:

c# - 如何防止因 C# 中的无效输入而崩溃?

c++ - 使用来自多个主机线程的不同 OpenCL 命令队列

c++ - 静态数据成员的初始化

c++ - 将类型转换 float 与零进行比较时的奇怪行为

c - 在原始套接字中禁用网桥转发

iphone - appFailedToResumeInTime 崩溃

c++ - 在 Clang++ : fatal error: 'iostream' file not found 中定位 iostream

linux - apt-cache 的 Bash 别名

c++ - 有没有办法排队线程?

CreateDirectory 使程序崩溃