Написание тестов, использующих GDB - как перехватить вывод? - PullRequest
1 голос
/ 23 февраля 2010

Я пытаюсь написать тесты, которые взаимодействуют с 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 ]

1 голос
/ 23 февраля 2010

Если ваш тест предполагает использование gdb для фактической отладки чего-либо, в отличие от тестирования самого gdb, вам, вероятно, следует изучить использование интерфейса gdb / mi.

1 голос
/ 23 февраля 2010

Одна из возможностей заключается в том, что вывод GDB сбрасывается при стандартной ошибке, а вы захватываете только стандартный вывод. Вы должны быть в состоянии исправить это с помощью перенаправления, что-то вроде этого, я думаю:

 process = "gdb -q 2&>1".execute()

Второе предположение состоит в том, что, возможно, стоит проверить, что говорит «показывать интерактивный режим» в рабочих и нерабочих случаях. Если они различаются, попробуйте отключить интерактивный режим, прежде чем делать что-либо еще.

Третий вариант - использовать средство ведения журнала GDB для записи файла журнала («установить файл журнала» и «установить вход в систему») и избежать необходимости записывать вывод самостоятельно.

...