我有一个特定的 Linux 可执行文件,它被一个更大的应用程序调用来执行一些计算。我想修改执行计算的方式,因为我首先需要了解如何调用可执行文件以及以何种方式传输参数和数据。
因此,如果调用此可执行文件,我想监视命令行参数、stdin 和 stdout。可执行文件的正常运行不应受到干扰。
有没有简单的方法可以做到这一点?
更新:
我尝试使用 shell 脚本占位符想法来使用以下脚本获取所有数据:
#!/bin/bash
export LOGFILE=/tmp/logname
echo `env` > $LOGFILE-env
echo "$@" >> $LOGFILE-arguments
tee -a $LOGFILE-stdin | /path/to/real/executable 2>&1 | tee -a $LOGFILE-stdout
这对于测试输入来说效果很好,但如果真正调用它,它就会挂起。也许发生的事情比我想象的还要多。
答案1
选项 1 是修改调用应用程序的源代码并插入tee
到输出管道中,以获取输出的副本以供在该阶段进行审查。
选项 2 是围绕相关可执行文件编写一个包装脚本。一个快速脚本,将标准输入和参数传递给真正的应用程序,然后将输出发送到某个位置供您查看,并将其吐出,就像应用程序应该只需几行代码即可启动一样。将其放在特殊的位置并将该位置添加到 PATH 变量的前面,然后运行您的应用程序。
#!/bin/sh
cat - | /path/to/realapp $@ | tee /tmp/debug_output
答案2
您可以通过调用以下程序来获取有关程序的大量信息strace
。这显示了程序进行的每个系统调用,有时信息量可能太大,但对于查找问题所在有很大帮助。
方法一是在strace
.这可能会产生大量输出并减慢应用程序的速度。
strace -s9999 -efile,process -f -o bigapp.strace bigapp
如果大型应用程序是交互式的,您可能更愿意启动它,并在准备好触发计算后将 strace 连接到它。记下应用程序的进程 ID,例如 12345,然后运行
strace -s9999 -efile,process -f -o bigapp-calculations.strace -p12345
如果观察外部可执行文件就足够了,那么
其他 答案已经建议,用包装脚本替换该可执行文件。您可以将可执行文件移动到不同的名称并将包装器脚本放在其位置,或者将包装器脚本放在 中的常用可执行文件之前PATH
,或者将应用程序配置为调用您的包装器脚本而不是常用的可执行文件,只要方便即可。制作包装脚本
#!/bin/sh
exec strace -s9999 -efile -o auxapp-$$.strace /path/to/original/executable "$@"
使用的strace参数说明:
答案3
您不应该更改路径,而应该将您感兴趣的二进制文件从“binary”移动到“binary.orig”,然后用脚本替换它。您说过您对这些参数感兴趣,因此您也想将它们写入文件中。您可能还会对命令“env”的输出感兴趣。它转储当前活动的所有环境变量。一个程序经常使用环境变量来影响它调用的另一程序的行为。
答案4
以下对我有用:
猫-|三通/tmp/in.log | /路径/到/realapp $@ |三通/tmp/out.log