2010-01-12 3 views
7

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

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

+0

http: // stackoverflow.com/questions/17965/generate-a-core-dump-in-linux SO post о создании дампов ядра –

+0

@HassanSyed: http://vmlinux.org/jocke/mirror/www.objsw.com/docs/gdb_22.html это мертвая ссылка. – bgoodr

ответ

6

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

+0

На самом деле это отличная идея, не знаю, почему я не подумал об этом: P Спасибо за элементарное решение! –

+0

+1 для tmux вместо экрана – lkraav

1

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

  1. Tracepoints, которые могут дать вам необходимую информацию, как работает ваша программа или
  2. Использование информации GDB remote debugging facility для отладки вашей программы в то время как он работает как демон.
3

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

ulimit -c unlimited 

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

gdb /path/to/app /path/to/core/file 
+2

Обратите внимание, что наличие файла ядра не совпадает с тем же процессом, что и при отладчике. Основной файл не сохраняет информацию об открытых файловых дескрипторах или состоянии отображения карты памяти. Это не всегда полезно. –

+1

И вы не можете вызывать функции, определенные в программе. –

7

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

gdb /path/to/binary _pid_ 

или из GDB с помощью команды Attach:

attach _pid_ 

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

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

  1. Создание и регистрация обработчиков сигналов для SIGSEGV.
  2. Сообщите gdb не останавливаться на этом сигнале (handle SIGSEGV nostop)
  3. Установите точку останова в первой строке вашего обработчика сигнала.
  4. Присвоить commands to the breakpoint с шага 3
1

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

Смежные вопросы