Как вы отлаживаете двоичный файл Go, который принимает перенаправление входных и выходных файлов?

# #go #stdout #stdin #delve

Вопрос:

У меня есть двоичный файл Go под названием «runme», который успешно работает следующим образом:

 ./runme encrypt --password=password < plaintext.txt > encrypted.txt
 

Он успешно считывается в файле под названием «plaintext.txt» и выводит зашифрованный файл под названием «encrypted.txt».

Теперь я хотел бы использовать отладчик dlv для Go, чтобы отладить его следующим образом:

 dlv exec  ./runme -- encrypt -password=password < plaintext.txt > encrypted.txt
 

Однако я получаю следующее сообщение об ошибке от отладчика dlv:

 Stdin is not a terminal, use '-r' to specify redirects for the target process or --allow-non-terminal-interactive=true if you really want to specify a redirect for Delve
 

Поэтому я попробую еще раз немного по-другому:

 dlv exec -r ./runme -- encrypt -password=password < plaintext.txt > encrypted.txt
 

Но я получаю точно такое же сообщение об ошибке, как показано выше. Затем я пытаюсь сделать следующее:

 dlv exec --allow-non-terminal-interactive=true  ./runme -- encrypt -password=password < plaintext.txt > encrypted.txt
 

На этот раз я получаю другое сообщение об ошибке:

 Command failed: command not available
 

То, что кажется простой вещью, я не могу сделать в отладчике. Что я мог сделать не так?

Комментарии:

1. So I try again slightly differently: Действительно? … Вы читали документацию о том, как -r ее предполагается использовать?

2. Используйте флаг-r. dlv help redirect

3. Я попробовал dlv exec -r [stdin] plaintext.txt -r [выход] encrypted.txt ./runme — encrypt-пароль=пароль, но он выдает мне ошибку «ошибка перенаправления: stdin перенаправлен дважды».

Ответ №1:

С помощью @tkausl и @gopher я смог это выяснить.

Решение заключается в:

 dlv exec -r stdin:plaintext.txt  -r stdout:encrypted.txt ./runme -- encrypt -password=password