Я работаю над встроенной системой Linux (3.12.something), и наше приложение через какое-то случайное время начинает перегружать ЦП. Я запустил strace
в нашем приложении, и сразу же, когда возникает проблема, я вижу много строк, подобных этой, в выводе strace
:
[48530666] futex(0x485f78b8, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) <0.009002>
Я почти уверен, что это именно тот дымящийся пистолет, который я ищу, и есть своего рода гонка. Однако теперь мне нужно выяснить, как определить место в коде, которое пытается получить этот мьютекс. Как я могу это сделать? Наш код скомпилирован с помощью GCC и содержит отладочные символы.
Моя текущая мысль (которую я еще не пробовал) состоит в том, чтобы распечатать строку на стандартный вывод и сбросить ее, прежде чем пытаться захватить любой мьютекс в нашей системе, с ожиданием, что строка будет напечатана прямо перед тем, как strace пожалуется на получение блокировки. ., но в коде есть МНОГО мест, которые нужно было бы инструментировать таким образом.
РЕДАКТИРОВАТЬ: Еще одна странная вещь, которую я только что понял, заключается в том, что наша программа не начинает перегружать ЦП, пока не пройдет некоторое случайное время с момента ее запуска (от 5 минут до 5 часов и где-то между ними). За это время происходит ноль futex
системных вызовов. Почему они вдруг начинаются? Из того, что я прочитал, я думаю, что, возможно, они правильно используются в пользовательском пространстве, пока что-то не выйдет из строя и не вернется к системному вызову futex()
...
Какие-либо предложения?
catch syscall 240
будет работать для этого в gdb. Я попробую. - person Steve   schedule 23.09.2015The feature 'catch syscall' is not supported on this architecture yet.
Дох! - person Steve   schedule 23.09.2015