Если у вас есть зависание, которое вы не можете воспроизвести во время работы в отладчике, вы можете присоединить отладчик к запущенному процессу после воспроизведения зависания.Это не позволит вам наблюдать за изменяющимися переменными по мере того, как вы ведете к зависанию, но, по крайней мере, вы получите трассировку стека точно, где происходит зависание.
Как только вы узнаете идентификатор процесса зависшего процесса (предположим, что это 12345), вы можете использовать:
$ gdb -p 12345
Или вы можете завершить процесс с помощью сигнала, который вызовет генерацию ядра.Мне нравится использовать SIGTRAP
, поскольку его легко отличить от SIGSEGV
.
$ kill -SIGTRAP 12345
А затем вы можете использовать gdb
, чтобы узнать, что зависло в процессеon.
Преимущество присоединения к запущенному процессу состоит в том, что процесс все еще активен.Это позволяет вам вызывать функции из отладчика, что может облегчить доступ к диагностике, встроенной в вашу программу.Файл core сохраняет ошибку, что полезно, если трудно воспроизвести зависшую ошибку.