используя команду «return» в скрипте GDB - PullRequest
0 голосов
/ 05 сентября 2018

Я пытаюсь автоматизировать тест, в котором я заставляю функцию возвращать ошибку. Но команда gdb «return (int) 22», похоже, не выполняется, и программа завершается с кодом успеха. Что-то особенное, что нужно сделать, чтобы заставить команду return работать в скрипте GDB? Вот скрипт gdb, который я использую:

set width 0
set height 0
set confirm off
set pagination off
set verbose off
set breakpoint pending on

set args the program args

break file.c:function_in_which_to_break
commands 1
    return 22
    continue
end

run the program args
quit

Я бы запустил программу со следующей командной строкой GDB:

gdb --batch --command=rc my_program

Желаемое поведение состоит в том, что «function_in_which_to_break» возвращает 22. Остальная часть кода будет продолжать передавать это вверх по стеку вызовов до тех пор, пока программа не завершится, а код выхода программы должен быть 22.

Фактическое поведение состоит в том, что код завершения программы успешен.

Когда я запускаю программу под GDB в терминале (с помощью команды

gdb --args my_program the program args

), прервите файл file.c: function_in_which_to_break, введя команду «break file.c: function_in_which_to_break» и запустите, программа прервется там. Затем, когда я набираю «return 22» и «continue», программа ведет себя так, как я ожидаю, функция возвращает 22, программа возвращает 22, и отображается ожидаемая ошибка.

ОБНОВЛЕНИЕ: Когда я сказал, что программа возвращает «успех», я имел в виду, что gdb сообщил, что ребенок вернул успех. И когда я сказал, что программа возвращает 22, я имею в виду, что GDB сообщает, что ребенок возвращает 22 (на самом деле, он говорит «выход с кодом 026»). Сам GDB возвращает успех в обоих случаях.

ОБНОВЛЕНИЕ 2: Я обнаружил некоторые ошибки в автоматизации, связанные с вызовом GDB - в поиске «exited с кодом 026» в файле с ошибочным именем, вызовом скрипта gdb-rc с орфографической ошибкой и тому подобными глупостями. Как только они были исправлены, файл сценария gdb с оператором return среди команд, кажется, работает. Поэтому, как только кто-то напишет ответ типа «команды возврата должны работать так же, как и все остальные команды», я приму его. @ Ks1322

1 Ответ

0 голосов
/ 06 сентября 2018

Фактическое поведение состоит в том, что код завершения программы успешен.

В соответствии с документацией , вы также должны запустить gdb с опцией -return-child-result, чтобы получить код возврата отлаживаемого процесса:

-return-child-result

    The return code from GDB will be the return code from the child process (the process being debugged), with the following exceptions:

        GDB exits abnormally. E.g., due to an incorrect argument or an internal error. In this case the exit code is the same as it would have been without ‘-return-child-result’.
        The user quits with an explicit value. E.g., ‘quit 1’.
        The child process never runs, or is not allowed to terminate, in which case the exit code will be -1. 

    This option is useful in conjunction with ‘-batch’ or ‘-batch-silent’, when GDB is being used as a remote program loader or simulator interface.

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

Есть ли что-то особенное, что нужно сделать, чтобы "вернуться" Командная работа в сценарии GDB?

Похоже, что нет, но есть исключения для команд, которые возобновляют выполнение, см. Как напечатать Ввод и Выход для функции в команде gdb? для получения подробной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...