Написание тестов, использующих GDB - как перехватить вывод?
Я пытаюсь написать тесты, которые взаимодействуют с GDB, но у меня возникают проблемы с записью результатов. Я хотел бы, чтобы был создан файл журнала, который выглядит так, как если бы тест выполнялся вручную. Однако GDB оказывается очень упрямым, когда дело доходит до захвата своей продукции.
Мне удалось написать сценарии Expect, которые могут взаимодействовать с GDB и чьи выходные данные могут быть перенаправлены в файл журнала, но я не хочу писать свои тесты в TCL. Я надеюсь использовать Groovy, который совместим с Java. По какой-то причине в Perl Expect и ExpectJ выходные данные программы всегда отправляются на терминал и не могут быть перенаправлены в файл.
Я попытался запустить процесс GDB из Java с помощью ProcessBuilder, и он в основном работает, но вывод операторов print никогда не появляется на stdout и не может быть захвачен. Я подумал, что если Expect сработает, то я запустил бы ожидаемый от Java и дал бы ему взаимодействовать с GDB, но в этом случае большая часть выходных данных программы теряется, никогда не появляясь в stdout созданного процесса.
Итак, мой вопрос, как я могу написать тест в Groovy (с Java тоже будет хорошо), который взаимодействует с GDB и может захватывать весь вывод?
Псевдо-код:
process = "gdb -q".execute()
waitForPrompt()
send("file exec")
waitForPrompt()
send("run")
send("quit")
Журнальный файл:
(gdb) file exec
Reading symbols from exec...done.
(gdb) run
Starting program: exec
<... output ...>
Program exited normally.
(gdb) quit
2 ответа
Одна возможность состоит в том, что вывод GDB сбрасывается при стандартной ошибке, а вы захватываете только стандартный вывод. Вы должны быть в состоянии исправить это с помощью перенаправления, что-то вроде этого, я думаю:
process = "gdb -q 2&>1".execute()
Второе предположение заключается в том, что, возможно, стоит проверить, что говорит "show interactive-mode" в рабочих и нерабочих случаях. Если они различаются, попробуйте отключить интерактивный режим, прежде чем делать что-либо еще.
Третий вариант - использовать средство ведения журнала GDB для записи файла журнала ("установить файл журнала" и "установить вход в систему") и избежать необходимости записывать выходные данные самостоятельно.
Если ваш тест предполагает использование gdb для фактической отладки чего-либо, в отличие от тестирования самого gdb, вам, вероятно, следует изучить использование интерфейса gdb/mi.