Как запустить GDB против демона в фоновом режиме? - PullRequest
8 голосов
/ 12 января 2010

Я пытаюсь отладить сервер, который я написал с помощью gdb, так как он segfaults при очень специфических и редких условиях.

Можно ли как-нибудь заставить GDB работать в фоновом режиме (в тихом или пакетном режиме?), Следовать за детьми (так как мой сервер является демоном и отключается от основного PID) и автоматически выгружать ядро ​​и обратную трассировку (для назначенный файл) после сбоя программы?

Ответы [ 6 ]

8 голосов
/ 12 января 2010

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

gdb /path/to/binary _pid_

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

attach _pid_

Итак, после запуска вашего демона вы можете использовать любой из этих методов, чтобы присоединиться к окончательному PID, под которым работает ваш демон. Присоединение gdb останавливает отслеживаемый вами процесс, поэтому вам нужно будет выполнить команду «continue», чтобы перезапустить его.

Я не знаю прямого способа заставить gdb запускать произвольные команды в случае сбоя программы. Вот один из обходных путей, о котором я могу подумать:

  1. Создание и регистрация обработчиков сигналов для SIGSEGV.
  2. Скажите GDB не останавливаться на этом сигнале (handle SIGSEGV nostop)
  3. Установите точку останова в первой строке вашего обработчика сигнала.
  4. Назначение команд для точки останова с шага 3
7 голосов
/ 12 января 2010

Почему бы просто не запустить процесс в интерактивном режиме в постоянном сеансе экрана? Почему это должен быть демон при отладке? Или просто запустите gdb в сеансе экрана и подключите его к запущенному процессу (например, gdb / path / to / binary -p PID_of_binary) после того, как он разветвится.

3 голосов
/ 12 января 2010

Во-первых, я бы настроил вашу оболочку / окружение, чтобы дать вам дамп ядра. В баш:

ulimit -c unlimited

Получив дамп ядра, вы можете использовать gdb для проверки трассировки стека:

gdb /path/to/app /path/to/core/file
2 голосов
/ 12 января 2010

Как создать трассировку стека при сбое моего приложения gcc C ++ Ответ на этот вопрос должен делать то, что вы хотите. (при условии, что вы можете внести изменения в свой код)

1 голос
/ 13 января 2010

Возможно, вы захотите взглянуть на то, как Samba облегчает отладку;он имеет настраиваемое «паническое действие» , которое может приостановить работу приложения, уведомить разработчика, spawn gdb и т. д., и запускается как часть его обработчика сигналов.См. lib / util / fault.c в дереве исходников Samba.

1 голос
/ 12 января 2010

Я на самом деле не эксперт по GDB, но на ум приходят две вещи

  1. Точки трассы , которые могут дать вам необходимую информацию при запуске вашей программы или
  2. Используйте средство удаленной отладки gdb для отладки вашей программы, пока она работает как демон.
...