Я пытаюсь отладить сервер, который я записал с gdb как он segfaults при очень определенных и редких условиях.
Есть ли какой-либо способ, которым я могу сделать gdb выполненным в фоновом режиме (через тихий или пакетный режим?), следуйте за детьми (поскольку мой сервер является демоном и отсоединениями от основного PID), и автоматически выведите ядро и след (в обозначенный файл), после того как программа отказывает?
Почему не просто запустить процесс интерактивно на постоянном сеансе экрана? Почему это должно быть демоном при отладке? Или просто запустите GDB на экране сеанса и прикрепите его к процессу запущенного (например, GDB / PATH / TO / BINARY -P PID_OF_BINAL) После него.
Как генерировать укладку, когда мои приложения GCC C ++ Ответ на этот вопрос должен делать то, что вы хотите. (Предполагая, что вы можете вносить изменения в свой код)
Я не эксперт gdb, но на ум приходят две вещи
Предполагая, что у вас есть соответствующие разрешения, вы можете приложить GDB к любому процессу. Вы можете сделать это в командной строке с:
gdb /path/to/binary _pid_
или в пределах GDB с помощью команды прикрепления:
attach _pid_
Итак, как только ваш демон начнется, вы можете использовать любую из этих методов, чтобы прикрепить к окончательному PID. Ваш демон работает в качестве. Присоединение GDB останавливает процесс, который вы тратите, поэтому вам нужно будет выпустить «продолжить», чтобы перезапустить его.
Я не знаю прямого способа получить GDB для запуска произвольных команд, когда программа сбивает. Вот один обходной путь, о котором я могу подумать:
ручка Sigsegv Nostop
) Вы можете взглянуть на то, как Samba облегчает отладку; Он имеет конфигурируемый «Panic Action» , который может приостановить приложение, уведомить разработчику, порождать GDB и т. Д., И выполняется как часть его обработчика сигнала. См. Lib / Util / fift.C в дереве Samba Source.
Во-первых, я бы настроил вашу оболочку / среду, чтобы дать вам ядро. В Bash:
ulimit -c unlimited
После того, как у вас есть ядро, вы можете использовать GDB для изучения трассировки стека:
gdb /path/to/app /path/to/core/file