gpt4 book ai didi

c - gcc tracker/make/fork/exec/wait 的问题

转载 作者:行者123 更新时间:2023-11-30 18:09:24 25 4
gpt4 key购买 nike

这是一个最独特的问题,具有许多跨学科的影响。

重点关注这段代码(文件名mainpp.c):

<小时/>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
int status;
if (fork())
{
FILE *f=fopen("/tmp/gcc-trace","a");
fprintf(f,"----------------------------------------------------------------\n");
int i;
for(i=0;i<argc;i++)
{

fprintf(f,"%s:",argv[i]);
}
wait(&status);
fprintf(f,"\nstatus=%d",status);
fprintf(f,"\n");
fclose(f);
}
else
{
execv("g++.old",argv);
}
sleep(10);
return status;
}
<小时/>

这与 bash 脚本一起使用:

#!/bin/sh

gcc -g main.c -o gcc
gcc -g mainpp.c -o g++
mv /usr/bin/gcc /usr/bin/gcc.old
mv /usr/bin/g++ /usr/bin/g++.old
cp ./gcc /usr/bin/gcc
cp ./g++ /usr/bin/g++
<小时/>

这段代码(以及 gcc 的相应 main.c)的目的是明确的。它取代了 g++ 并记录对 g++ 的调用以及所有命令行参数,然后继续调用 g++ 编译器(现在称为 g++.old )。

计划使用它来记录对 g++/gcc 的所有调用。 (由于 make -n 不跟踪递归 make,因此这是一种“野外”捕获调用的方法。)

我在几个程序上尝试过这个方法,效果很好。 (包括编译程序本身。)然后我在我感兴趣的项目 libapt-pkg-dev(Ubuntu 存储库)上进行了尝试。

构建似乎进展顺利,但当我检查时,一些可执行文件丢失了。计算项目目录中的文件数,我发现未记录的版本生成 1373 个,而记录的版本生成 1294 个。通过列出这些文件,我发现所有丢失的文件都是可执行文件、共享库或目标文件。

从记录的 make 和未记录的 make 中捕获标准会给出相同的输出。记录的所有exec调用的进程的返回值为0。

我已将 sleep 放置在代码中的各个位置。它们似乎没有任何区别。 (带有跟踪版本的代码似乎每个文件的编译速度要快得多。我怀疑 exec 可能导致程序在 gcc 运行时终止。我认为这可能会导致失败,因为当其他文件需要它们时,某些目标文件可能无法完成.)

我只剩下一个诊断程序要运行,看看是否可以诊断问题,然后我就没有主意了。有建议吗?

最佳答案

我不确定这是否能解决您的问题,但是您是否考虑过使用 strace 而不是您的自定义代码?

strace 执行命令(或附加到正在运行的进程)并列出它进行的所有系统调用。例如,您可以运行:

,而不是直接运行 make
strace -f -q -e trace=execve make
  • -f 表示在 fork 新进程时附加到它们
  • -q 表示抑制附加/分离消息
  • -e trace=execve 表示仅报告对 execve 的调用

然后您可以通过 grep 查找有关 /usr/bin/gcc 的消息的输出。

关于c - gcc tracker/make/fork/exec/wait 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2332205/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com