我正在追查一起非常奇怪的撞车事故。它的奇怪之处在于有人发现了一个我无法解释的变通方法。
解决办法是这个小程序,我称之为“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填充程序间接调用时,它工作得很好:
/path/to/runner /path/to/prog args # works successfully对于我来说,我可以弄清楚额外的exec如何改变正在运行的程序的行为(正如您所看到的,该程序不会改变环境)。
关于坠机的一些背景资料。崩溃本身发生在C++运行时。具体地说,当程序执行throw时,崩溃版本错误地认为没有匹配的catch (尽管有),并调用terminate。当我通过runner调用程序时,异常被正确捕获。
我的问题是,为什么额外的exec会改变exec‘’ed程序的行为?
发布于 2010-03-23 05:07:38
运行者加载的.so文件可能导致运行者正常工作。尝试ldd每个二进制文件,看看是否有库加载了不同的版本/位置。
发布于 2010-03-23 09:35:17
也许被调用的程序存在内存泄漏。尝试使用valgrind或其他内存检查工具运行它。发生内存错误后,其他一切都是未定义的行为(因此一切都可能发生)。
发布于 2010-03-23 04:55:10
在黑暗中,双exec可能会改变环境变量在RAM中的顺序。
环境是一个带有指针的内存结构;内核将该结构复制到新进程的地址空间中。在复制过程中,RAM中元素实际顺序可能会改变(环境变量没有语义上的顺序,但RAM中的地址有顺序)。使用两个exec(),可以修改顺序两次。
改变RAM中字符串的顺序会发现一个bug,这有点奇怪,但更奇怪的事情已经发生了。
https://stackoverflow.com/questions/2495348
复制相似问题