Написание тестов, использующих GDB – как захватить выходные данные?

StackOverflow https://stackoverflow.com/questions/2321087

  •  22-09-2019
  •  | 
  •  

Вопрос

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

Мне удалось написать сценарии Expect, которые могут взаимодействовать с GDB и выходные данные которых можно перенаправить в файл журнала, но я не хочу писать свои тесты в TCL.Я надеюсь использовать Groovy, совместимый с Java.По какой-то причине в Perl Expect и ExpectJ вывод программы всегда поступает на терминал и не может быть перенаправлен в файл.

Я попытался запустить процесс GDB из Java с помощью ProcessBuilder, и в основном он работает, но вывод операторов печати никогда не появляется на стандартном выводе и не может быть захвачен.Я подумал, что если Expect сработает, то я запущу его с Java и заставлю его взаимодействовать с GDB, но в этом случае большая часть вывода программы теряется и никогда не появляется в стандартном выводе созданного процесса.

Итак, мой вопрос: как я могу написать тест в 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
Это было полезно?

Решение

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

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

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

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

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top