Подтвердить что ты не робот

Повторно запускайте GDB в исполняемом файле (и останавливайте сбои/ошибки)

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

Я не мог найти способ сделать это в руководстве!

Спасибо

4b9b3361

Ответ 1

Я попробовал (в Bash):

while true ; do gdb -ex run a.out -ex quit ; done ;

К сожалению, это оказалось довольно сложным, чтобы убить, но он автоматизировал работу, и когда программа потерпела крах (я тестировал старую программу, которая вызывает SIGABRT), gdb спрашивает: "Программа запущена.? (y или n)", так что просто нажмите n.

Ответ 2

Я столкнулся с этой же проблемой и придумал то, что, по моему мнению, довольно хороший способ остановить бесконечный цикл, предложенный BoBTFish.

Вместо цикла while true вы можете использовать наличие фиктивного файла для управления циклом, например:

touch loopfile; while [ -f loopfile ] ; do gdb -ex run a.out -ex quit ; done ;

Если вы хотите остановить бесконечный сеанс отладки, вы можете либо открыть новый терминал в том же каталоге, либо rm loopfile, или вы можете выйти из того же терминала, прервав его с помощью control-c, а затем удалив loopfile из в пределах gdb:

^CQuit
A debugging session is active.

    Inferior 1 [process 11136] will be killed.

Quit anyway? (y or n) n
Not confirmed.
(gdb) shell rm loopfile 
(gdb) quit
A debugging session is active.

    Inferior 1 [process 11136] will be killed.

Quit anyway? (y or n) y

Надеюсь, это полезно кому-то в будущем, это похоже на хороший (если хакерский) способ отладки прерывистых проблем.

Ответ 3

Используйте оболочку script для повторного использования gdb и используйте параметры --batch -x <cmdfile> для gdb, чтобы указать командный файл, который просто имеет слово run для запуска программы. Так что-то вроде этого:

$ echo run > cmdfile ; while gdb --batch -x cmdfile myprogram ; do : ; done

Ответ 4

Пример аргументов Loop + LD path + командной строки

for i in {0..99}; do LD_LIBRARY_PATH=/some/path/to/libs gdb -ex 'set args arg1 arg2 arg3' -ex run ./execName -ex quit ; done