如何通过管道将命令的标准输出传递给lldb调试文件的标准输入?

3

我想运行一个可执行文件,通过管道将其stdout重定向到我的程序,并使用LLDB调试我的程序。例如:

cat my_file | ./main

然后调试./main。 我知道process launch -i my_file,但那不完全是我想做的-我希望输出来自cat的stdout(它可以是任何其他可执行文件,而-i不能实现类似的行为)。 我在help process launch下没有看到相关选项。

3个回答

2
这不是lldb支持的选项。您可以通过运行以下命令来实现几乎相同的效果:
(lldb) process attach -w -n main
然后转到命令行并运行“cat | ./main”命令。 lldb将在创建名为main的进程时附加到该进程。lldb通过轮询进程表来实现此操作,因此它不会在程序生命周期的最开始停止。但是,它通常会在很早的阶段(通常是dyld加载阶段)捕获它,因此这可能对您没有影响。如果有影响,并且main是可以重新构建的程序,则一种解决方案是在main开头放置类似于此的内容:
int go_on = 1
while (go_on) { sleep(1); }

当您进行连接时,请执行以下操作:

(lldb) expr go_on = 0
(lldb) continue

很遗憾它不被支持。这是一个很棒的解决方案!我可以尝试一下,通常在程序设置较重的情况下,这已经足够了,不需要休眠。如果是在加载阶段,那就更好了。感谢您的建议 :) - Gal Gofrit

1

对于那些仍然想将 shell 命令输出作为参数传递给 lldb 的人,您可以尝试一种解决方案,即创建一个环境变量,其中包含命令的结果,然后将其作为参数传递给 lldb。当 lldb 运行时,它会设置从环境变量中获取的 target.run-args 选项。

在您的示例中,您可以按照以下步骤操作。

ARG=`cat my_file`

(echo $ARG 以验证结果是否正确)

lldb -- main $ARG


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接