Как выполнить gdb против демона в фоновом режиме?

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

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

8
задан David Titarenco 16 September 2011 в 16:52
поделиться

6 ответов

Почему не просто запустить процесс интерактивно на постоянном сеансе экрана? Почему это должно быть демоном при отладке? Или просто запустите GDB на экране сеанса и прикрепите его к процессу запущенного (например, GDB / PATH / TO / BINARY -P PID_OF_BINAL) После него.

7
ответ дан 5 December 2019 в 07:35
поделиться

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

2
ответ дан 5 December 2019 в 07:35
поделиться

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

  1. Tracepoints, которые могут дать вам необходимую информацию во время выполнения программы, или
  2. Используйте средство удаленной отладки gdb's для отладки вашей программы во время ее работы в качестве демона.
1
ответ дан 5 December 2019 в 07:35
поделиться

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

gdb /path/to/binary _pid_

или в пределах GDB с помощью команды прикрепления:

attach _pid_

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

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

  1. создать и зарегистрировать обработчики сигналов для SIGSEGV.
  2. Скажите GDB не останавливаться на этом сигнале ( ручка Sigsegv Nostop )
  3. Установите точку останова на первой строке обработчика сигнала.
  4. Назначать Команды на точку останова с шага 3
8
ответ дан 5 December 2019 в 07:35
поделиться

Вы можете взглянуть на то, как Samba облегчает отладку; Он имеет конфигурируемый «Panic Action» , который может приостановить приложение, уведомить разработчику, порождать GDB и т. Д., И выполняется как часть его обработчика сигнала. См. Lib / Util / fift.C в дереве Samba Source.

1
ответ дан 5 December 2019 в 07:35
поделиться

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

ulimit -c unlimited

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

gdb /path/to/app /path/to/core/file
3
ответ дан 5 December 2019 в 07:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: