#multithreading
#многопоточность
Вопрос:
У меня есть приложение в Linux с 5 потоками.
Thread1..Thread5
У меня есть критический раздел, который является буфером, содержащим некоторые данные.
Я применил функции блокировки и разблокировки мьютекса для этого критического раздела
lock()
bufferdata
unlock
Все потоки обращаются к данным синхронизированным образом.
Теперь, например
thread 3
получил блокировку и обработал данные буфера. При обработке буфера были перезаписаны некоторые данные, что привело к переполнению буфера
После повреждения данных поток 3 разблокировал критическую секцию.
Теперь, когда thread 5
получил блокировку и попытался выполнить некоторые операции с поврежденной памятью, и из-за этого весь процесс получил сброс ядра.
В общем случае, если мы подключим ядро к GDB и выполним обратную трассировку, это покажет вам стеки вызовов для всех потоков в процессе.
Есть ли в любом случае в системах Linux способ найти поток-виновник (здесь thread 3
). Если да, пожалуйста, сообщите мне о процессе поиска потока-нарушителя
Заранее спасибо
Ответ №1:
Для переполнения буфера и других типов повреждения памяти, valgrind, вероятно, является подходящим инструментом. Не существует «единственно правильного способа» отладки, а отладка многопоточных программ особенно сложна. Опыт ничем не заменишь.
Я должен также добавить, что модульные тесты, утверждения и хорошая документация по коду оказывают огромную помощь.