Как найти, где процесс застрял с помощью DDD - PullRequest
0 голосов
/ 18 февраля 2011

У меня есть процесс TCP Svr, написанный на C и работающий на CentOS 5.5.Он действует как TCP-сервер для внешних клиентов, а также выполняет некоторую IPC-связь с другими процессами в системе, используя установленные доменные сокеты Unix.Это не многопоточный процесс.Это делает одну задачу за один раз.Существует функция epoll_wait (), которую я использую для прослушивания запросов либо на сокете TCP, либо на любом из сокетов IPC, которые он установил для внутренних процессов.Когда функция epoll_wait () прерывается, я обрабатываю запрос для любого пользователя и затем возвращаюсь в epoll_wait ()

У меня есть TCP-клиент, который подключается к этому процессу извне (не IPC).Он успешно подключается, отправляет запрос msg, получает ответ обратно.Я поместил это в бесконечный цикл, чтобы проверить его надежность и т. Д.

Через некоторое время TCP-сервер перестает отвечать на запросы, поступающие от TCP-клиента.TCP-клиент успешно подключается, отправляет сообщение с запросом, но не получает никаких ответных сообщений от TCP-сервера.

Так что я считаю, что TCP-сервер застрял где-то еще, пытается что-то сделать и не вернулся к epoll_wait () для обработки других входящих запросов. Я пытался выяснить это с помощью журналов, но этоне помогая мне понять, где именно застрял процесс.

Поэтому я хотел использовать любой отладчик, который может дать мне некоторую информацию (имя функции было бы замечательно), относительно того, что делает процесс.Устанавливать точки останова - это очень сложно, потому что у процесса TCP Server есть тонны файлов и функций ....

Я пытаюсь использовать DDD в CentOS 5.5, чтобы выяснить, что происходит.Я присоединяюсь к процессу успешно.Затем я нажимаю кнопку «Step», «Stepi» или «Next» .... но ничего не происходит ....

btw, когда я использую Eclipse для отладки, и присоединяюсь к этому процессу (или любому другому процессу).), Я всегда получаю "__kernel_vsyscall ()" .... Означает ли это, что программа по умолчанию прерывается во всех своих действиях?Если это так, как мне выйти из вызова __kernel_vsyscall (), чтобы продолжить работу в моей программе?Если я нажимаю f8, он выходит, но потом я не знаю, где он был, так как теряю трассировку стека ... Как я уже говорил ранее.Так как я не могу понять, где это было, я не знаю, где поставить точку останова ...

Итак, я хочу выяснить, где застрял мой процесс или что он делает, и попытаться отладить с этого момента....

Как мне поступить?

Спасибо, Амит

Ответы [ 2 ]

0 голосов
/ 21 февраля 2011

Таким образом, я хотел найти, где моя программа застревает, когда она зависает. Я понял это - это было так просто. Создайте конфигурацию в Eclipse .... "Отладка конфигураций-> C / C ++ присоединение к приложению" ...

Пусть процесс нормально запускается из оболочки (желательно с подключенным терминалом). Когда он зависнет, откройте Eclipse, щелкните значок отладки и запустите настроенный процесс. Он попросит вас присоединиться к процессу. Ищите название вашего процесса и присоединяйте к нему.

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

0 голосов
/ 19 февраля 2011

1) Присоединение к процессу C часто может вызвать проблемы само по себе, есть ли способ запустить процесс в отладчике?

2) Использование пошаговых функций DDD необходимо выполнять после установки точки останова и остановки программы по команде. Прочитав ваш вопрос, я не уверен, что вы это сделали. Возможно, вы не захотите устанавливать много точек останова, но возможно ли установить одну или две критические секции кода?

...