Отладка Linux-процесса зависает, какой код он запускает? - PullRequest
1 голос
/ 20 сентября 2019

У меня есть процесс, работающий на очень слабом встроенном устройстве Linux, которое не может запустить сервер gdb / gdb сам по себе.Я позволил ей вызывать функцию X из общей библиотеки несколько раз (есть и другие процессы, вызывающие ее одновременно с гораздо меньшей частотой), она обычно зависает где-то внутри общей библиотеки через 1 день или полдня.Как мне отладить:

  • Если он где-то заблокирован: какая последняя строка кода запущена?
  • Если он застрял в бесконечном цикле: какие строки кодавыполняется?

Что я пробовал:

  • Я копаюсь в общей библиотеке и помещаю много syslog внутрь для проверки.Тем не менее, из-за очень большого количества системных вызовов, вызываемых постоянно, мой процесс теперь зависает каждые 2-5 минут.Я думаю, что системный журнал заблокирован сокетом UNIX?

1 Ответ

2 голосов
/ 20 сентября 2019

GDB поставляется с программой под названием gcore, которая генерирует файл ядра из запущенного процесса.

Многие системы в настоящее время отключают файлы ядра по умолчанию (ulimit -c в оболочке будет показывать 0).Используйте команду оболочки ulimit -c unlimited, затем запустите ваш процесс в той же оболочке (эти ограничения унаследованы от родительского процесса. Если вы запускаете свой процесс не так, как непосредственно из оболочки, вам необходимо выяснить, как их установитьнапример, LimitCORE= в файле системного модуля).

Как только ваш процесс перейдет в плохое состояние, запустите gcore для его идентификатора процесса.Затем вы можете скопировать его на свою рабочую станцию ​​и загрузить в gdb (gdb <executable> <core-file>).Затем вы можете просмотреть трассировку стека и другое состояние на момент получения дампа ядра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...