如何将stdin从文件传输到Xcode 4+中的可执行文件?

时间:2011-10-02 23:18:36

标签: macos xcode4 mpi

我有一个mpi程序并设法通过Xcode 4编译和链接它。 现在我想使用Xcode 4进行调试。

如何从文件中将标准输入传输到程序?

在终端我会输入

mpirun -np 2 program < input.txt

我能够在Scheme编辑器的“Info”面板中运行定义自定义可执行文件(mpirun)的程序,我也知道我可以在“Arguments”面板中传递参数。但是Xcode 4似乎不接受“&lt; input.txt”作为参数,即使我选中“使用自定义工作目录”+在“选项”面板中添加输入脚本的正确目录。

This article说可以使用“&lt; input.txt”作为参数,但我猜这在Xcode 2或Xcode 3中有效,但它似乎不再适用于Xcode 4。 / p>

4 个答案:

答案 0 :(得分:25)

在Xcode 4.5.1中:

  1. 打开方案编辑器(产品菜单 - &gt;编辑方案...)
  2. 选择“运行调试方案”
  3. 在“信息”标签面板中,将“启动”单选按钮选项从“自动”更改为“等待MyApp.app启动”
  4. 关闭方案编辑器
  5. 按“运行”按钮构建并运行目标。 (工具栏中的Xcode状态窗口将显示“等待MyApp启动”)
  6. 启动终端并cd到您构建的应用程序的文件夹。 (它将类似/ Users / user / Library / Developer / Xcode / DerivedData / MyApp-dmzfrqdevydjuqbexdivolfeujsj / Build / Products / Debug /)
  7. 将您想要的任何应用程序管道启动到标准输入中:

    echo mydata | ./MyApp.app/Contents/MacOs/MyApp
    
  8. 切换回Xcode,调试器将检测到您的应用程序启动并附加到它。

答案 1 :(得分:1)

不想唤醒僵尸,但这仍然是问题的最佳搜索结果。

我已经设法在XCode 9.2中使用它 - 但它应该向后兼容。它使用子shell并在预操作脚本中休眠。 这将从文件和管道cout管道传输到文件,并支持断点。

(1)将以下preaction.sh脚本添加到项目中。

#!/bin/sh
exec > ${PROJECT_DIR}/tests/result.log 2>&1
(
sleep 1
${TARGET_BUILD_DIR}/${EXECUTABLE_NAME} < ${PROJECT_DIR}/tests/file
)&

(2)然后将其添加到“运行”菜单上的预操作中。 Pre-action setting

(3)确保您的运行等待可执行文件启动。 Run setting

(4)关闭目标代码签名!

No Codesigning 否则您将收到错误&#34;来自调试器的消息:无法附加&#34;

(5)设置断点并正常运行Xcode

这就是它的全部内容。整个技巧依赖于使预操作脚本产生一个子shell,该子shell本身会延迟进程,直到启动运行操作。

答案 2 :(得分:0)

另一种方法:

在程序的最开始,freopen 输入文件作为标准输入。

    freopen( "input.txt", "r", stdin );

条件宏可能对您有所帮助。

#ifdef DEBUG
    freopen( "input.txt", "r", stdin );
    freopen( "output.txt", "w", stdout );
#endif

答案 3 :(得分:-1)

尝试以下预执行运行脚本:

mv program program.real
echo -e '#!/bin/sh\nmpirun -np 2 program.real < input.txt' > program

也许这会欺骗XCode执行你想要执行的程序。