Используйте GDB для отладки программы на C ++, вызываемой из сценария оболочки - PullRequest
23 голосов
/ 19 февраля 2011

У меня чрезвычайно сложный сценарий оболочки, внутри которого он вызывает программу на C ++, которую я хочу отлаживать через GDB. Очень трудно отделить эту программу на С ++ от оболочки, поскольку в ней много ветвей и много переменных окружения.

Есть ли способ вызвать GDB для этого сценария оболочки? Похоже, gdb требует, чтобы я вызывал программу на C ++ напрямую.

Ответы [ 5 ]

15 голосов
/ 28 августа 2015

В дополнение к опциям, упомянутым @ diverscuba23, вы можете сделать следующее:

gdb --args bash <script>

(при условии, что это скрипт bash. Иначе адаптироваться соответственно)

15 голосов
/ 19 февраля 2011

Есть две опции, которые вы можете сделать:

  1. Вызывать GDB непосредственно в сценарии оболочки.Это может означать, что у вас нет стандартного входа и стандартного перенаправления.

  2. Запустите сценарий оболочки и затем присоедините отладчик к уже запущенному процессу C ++, например: gdb progname 1234 где1234 - это идентификатор процесса запущенного процесса C ++.

Если вам нужно что-то сделать до запуска программы, то вариант 1 будет лучшим выбором, иначе вариант 2 будетчище.

3 голосов
/ 19 февраля 2011

Я бы, вероятно, изменил сценарий так, чтобы он всегда вызывал gdb (и вернул это позже), или добавил бы опцию для вызова gdb. Это почти всегда будет самым простым решением.

Следующий простой способ - временно переместить исполняемый файл и заменить его сценарием оболочки, который запускает gdb в перемещенной программе. Например, в каталоге, содержащем вашу программу:

$ mv program _program
$ (echo "#!/bin/sh"; echo "exec gdb $PWD/_program") > program
$ chmod +x program
2 голосов
/ 19 февраля 2011

Измените приложение c ++, чтобы оно печатало pid и спало 30 секунд (возможно, в зависимости от окружения или аргумента). Присоедините к запущенному экземпляру с помощью gdb.

1 голос
/ 19 февраля 2011

Не могли бы вы просто временно добавить gdb в ваш скрипт?

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