如何使用dlv调试带有输入输出文件重定向的Go二进制程序
问题原因及正确解法
你的操作存在的3个核心问题
- 你直接在dlv命令末尾使用shell级别的
<>重定向符号,默认这些重定向会作用于dlv本身,而非你要调试的runme程序。dlv默认需要绑定终端来接收用户输入的调试指令,所以会报Stdin is not a terminal错误。 - 你使用
-r参数的方式错误:-r是dlv的参数,需要紧跟重定向规则,不能把二进制程序路径./runme当做-r的参数值,你之前的写法相当于给-r传了无效的规则,所以报错和之前完全一致。 - 你添加
--allow-non-terminal-interactive=true之后,dlv的标准输入被重定向到了plaintext.txt,文件里存储的是要加密的业务数据而非dlv的调试命令,dlv读不到合法指令就会返回Command failed: command not available。
正确调试命令
dlv exec ./runme -r stdin:plaintext.txt -r stdout:encrypted.txt -- encrypt --password=password
参数说明
- 所有dlv专属参数必须放在
--分隔符之前,目标程序runme的参数放在--之后 -r stdin:plaintext.txt:指定目标程序runme的标准输入来源为plaintext.txt-r stdout:encrypted.txt:指定目标程序runme的标准输出写入到encrypted.txt- 不需要额外加shell重定向符号,dlv本身的输入输出依然绑定终端,你可以正常输入
break、continue等调试命令。
内容的提问来源于stack exchange,提问作者user1068636
相关产品推荐
相关产品推荐

