Отладка C-программы с несколькими потоками - PullRequest
3 голосов
/ 14 сентября 2011

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

Так что я начал с GDB.После ввода команды run сервер работает в фоновом режиме, но GDB возвращает приглашение и сообщение «Программа получила сигнал SIG64 (событие в реальном времени 64)» (относится к pthread, я полагаю).Я знаю, что это должно быть что-то, когда главное разветвляется на несколько потоков.Но я понятия не имею, как это отладить.Любые отправные точки были бы очень полезны.

Кроме того, есть ли какой-нибудь другой «след», такой как отладчики, небольшой размер, который я могу использовать?

Пожалуйста, помогите

Ответы [ 4 ]

6 голосов
/ 14 сентября 2011

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

Это не поможет в вашей конкретной проблеме, но это лучший совет, который я получил при работе с многопоточными приложениями, особенно встроенными.

2 голосов
/ 14 сентября 2011

Видите, в таком случае я обычно делаю это:

  1. Создайте файл журнала с многопоточностью и перенаправьте все выходные данные stdout и stderr в этот файл журнала ... возможноэто поможет вам в этом: В многопоточном приложении, как я могу перенаправить stderr & stdout в отдельный файл для каждого потока?

  2. Отслеживать глобальные переменные между всемипотоки.Неправильное использование глобальных переменных имеет тенденцию вызывать проблемы.

  3. Если вы используете мьютекс, убедитесь, что он не создает тупиковых ситуаций.В условном и семафорном дизайне всегда старайтесь отслеживать все эти нити на бумаге.

1 голос
/ 14 сентября 2011

Я рекомендую вам использовать программу проверки доступа к памяти, например, valgrind. В моем случае многие из ошибок вызваны неправильной обработкой памяти. Трудно найти ошибку в многопоточной программе, поэтому использование программы проверки утечки памяти - лучший способ выяснить причины ошибок.

0 голосов
/ 14 сентября 2011

какая-то хитрая идея ..

  1. добавить сон (несколько раз) в поток для отладки в качестве начальной точки
  2. после запуска программы проверьте pid потока (используя ps с опцией -L)
  3. запустите программу gdb {pid} или вызовите attach {pid} в приглашении gdb
  4. после сна, вы можете проследить следующий шаг для этой нити

Не забывайте, что прикрепление должно быть выполнено до того, как закончится время сна.

Как отмечалось выше, тестирование в однопоточном режиме или использование средства регистрации текста является хорошим выбором.

...