Отладка многопоточного приложения

#multithreading

#многопоточность

Вопрос:

У меня есть приложение в Linux с 5 потоками.

 Thread1..Thread5
  

У меня есть критический раздел, который является буфером, содержащим некоторые данные.

Я применил функции блокировки и разблокировки мьютекса для этого критического раздела

 lock()

bufferdata

unlock
  

Все потоки обращаются к данным синхронизированным образом.

Теперь, например

thread 3 получил блокировку и обработал данные буфера. При обработке буфера были перезаписаны некоторые данные, что привело к переполнению буфера

После повреждения данных поток 3 разблокировал критическую секцию.

Теперь, когда thread 5 получил блокировку и попытался выполнить некоторые операции с поврежденной памятью, и из-за этого весь процесс получил сброс ядра.

В общем случае, если мы подключим ядро к GDB и выполним обратную трассировку, это покажет вам стеки вызовов для всех потоков в процессе.

Есть ли в любом случае в системах Linux способ найти поток-виновник (здесь thread 3 ). Если да, пожалуйста, сообщите мне о процессе поиска потока-нарушителя

Заранее спасибо

Ответ №1:

Для переполнения буфера и других типов повреждения памяти, valgrind, вероятно, является подходящим инструментом. Не существует «единственно правильного способа» отладки, а отладка многопоточных программ особенно сложна. Опыт ничем не заменишь.

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