Как я могу переключаться между различными процессами fork () ed в GDB? - PullRequest
10 голосов
/ 03 июня 2011

Я отлаживаю такое приложение с несколькими процессами,

как я могу переключаться между fork() процессами ed?

1 Ответ

16 голосов
/ 03 июня 2011
  1. Вы можете перевести дочерний процесс в спящий режим, а затем присоединить к нему новый экземпляр GDB. Руководство пользователя GDB описывает этот процесс следующим образом (выделено мое):

    В большинстве систем GDB не имеет специальных поддержка отладочных программ, которые создать дополнительные процессы, используя функция вилки. Когда программа разветвляется, GDB будет продолжать отлаживать родительский процесс и дочерний процесс будет выполняться беспрепятственное. Если вы установили точка останова в любом коде, который ребенок затем выполняет, ребенок получит Сигнал SIGTRAP который (если это не ловит сигнал) заставит его прекратить.

    Однако, если вы хотите отладить дочерний процесс есть обходной путь что не слишком больно. Позвоните спать в коде который ребенок Процесс выполняется после разветвления. It может быть полезно спать только если определенная переменная окружения установлена, или существует определенный файл, так что задержка не должна происходить, когда вы хочу запустить GDB на ребенка. Пока ребенок спит, используйте пс программа, чтобы получить свой идентификатор процесса. затем сказать GDB ( новый вызов GDB, если вы также отлаживаете родителя процесс ) прикрепить к ребенку процесс (см. Приложение). С этого момента на вы можете отлаживать дочерний процесс как и любой другой процесс, который вы прилагается к.

    Суть и короткость в том, что при запуске программы, которая впоследствии разветвляется, GDB будет оставаться подключенным к родительскому процессу (хотя вместо этого вы можете следить за дочерним процессом, используя set follow-fork-mode child). Переведя другой процесс в спящий режим, вы также можете подключить к нему новый экземпляр GDB.

  2. Используйте set detach-on-fork off, чтобы держать оба процесса под контролем GDB. По умолчанию родительский процесс будет отлажен как обычно, а дочерний процесс будет приостановлен, но, вызвав set follow-fork-mode child, вы можете изменить это поведение (чтобы дочерний процесс был отлажен как обычно, а родительский приостановлен). Руководство пользователя GDB описывает этот процесс следующим образом:

    GDB сохранит контроль над всеми разветвленными процессы (включая вложенные вилки). Вы можете перечислить разветвленные процессы под контролем GDB с помощью info inferiors команда и переключатель от одной вилки к другой, используя Команда inferior (см. Отладка Несколько интерьеров и программ ).

    Чтобы прервать отладку одного из разветвленных процессы, вы можете отсоединиться от это с помощью detach inferiors команда (позволяющая запустить самостоятельно) или убить его, используя kill inferiors команда. Смотрите Отладка Несколько интерьеров и программ .

...