gcc跟踪器/make/fork/exec/wait出现问题

gcc跟踪器/make/fork/exec/wait出现问题,c,gcc,g++,posix,exec,C,Gcc,G++,Posix,Exec,这是一个非常独特的问题,有许多跨学科的分支 它主要关注这段代码文件名mainpp.c: 希望这段代码和gcc对应的main.c的目的很清楚。它替换g++并记录对g++的调用以及所有命令行参数,然后继续调用现在称为g++.old的g++编译器 计划是使用它来记录对g++/gcc的所有调用。由于make-n不跟踪递归make,因此这是一种在野外捕获调用的方法 我在几个程序上试用过,效果很好。包括编译程序本身。然后我在我感兴趣的项目libapt pkg dev Ubuntu repository上试用

这是一个非常独特的问题,有许多跨学科的分支

它主要关注这段代码文件名mainpp.c:

希望这段代码和gcc对应的main.c的目的很清楚。它替换g++并记录对g++的调用以及所有命令行参数,然后继续调用现在称为g++.old的g++编译器

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

我在几个程序上试用过,效果很好。包括编译程序本身。然后我在我感兴趣的项目libapt pkg dev Ubuntu repository上试用了它

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

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

我在代码中把睡眠放在了不同的位置。它们似乎没有任何区别。具有跟踪版本的代码似乎可以更快地编译每个文件。我怀疑exec可能导致程序在gcc运行时终止。我认为这可能会导致失败,因为某些对象文件可能无法在其他人需要时完成


我只有一个诊断运行,看看我是否可以诊断的问题,然后我的想法。建议?

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

strace执行命令或附加到正在运行的进程,并列出它进行的所有系统调用。例如,您可以运行以下命令,而不是直接运行make:

strace -f -q -e trace=execve make
-f表示在新流程分叉时附加到新流程 -q表示禁止附加/分离消息 -e trace=execve表示仅报告对execve的调用
然后,您可以在输出中搜索关于/usr/bin/gcc的消息

我不确定这是否是个问题,但“execvg++.old,argv;”必须有第一个参数usr/bin/g++。Old拍了拍他的额头,最初我通过了argv+1,因为我认为它会被追加。我没有意识到它会被改变。叹气但是,我不这么认为,很明显,g++成功了很多次,我认为每次都会导致彻底失败。您可以使用gcc的-v选项来获得更详细的报告。比较更详细的报告,如果使用的话可能会更好。事实上我在使用strace之前就试过了。每个gcc/g++调用都有大约64个IIRC参数,因此参数列表被终止。虽然尝试得不错,但有一件事我没有做,那就是对记录的版本进行扫描。这可能会给我一个有关问题的提示。
#!/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++
strace -f -q -e trace=execve make