Niektóre tła:Jak wyzwalać fałszywe budzenie w aplikacji systemu Linux?
mam aplikację, która opiera się na sprzęcie firm trzecich i kierowca źródłowego zamkniętym. Sterownik ma obecnie błąd, który powoduje, że urządzenie przestaje odpowiadać po losowym czasie. Jest to spowodowane widocznym zakleszczeniem w sterowniku i przerywa prawidłowe funkcjonowanie mojej aplikacji, która jest zawsze w dobrze widocznym środowisku 24/7.
To, co odkryłem, to dołączenie GDB do procesu i natychmiastowe odłączenie GDB od procesu powoduje wznowienie działania urządzenia. To był mój pierwszy dowód, że w samym sterowniku wystąpił problem z blokowaniem wątków. Jest jakiś rodzaj wyścigu, który prowadzi do impasu. Dołączenie GDB oczywiście spowodowało pewne przetasowanie wątków i prawdopodobnie wypchnięcie ich z ich stanu oczekiwania, powodując ich ponowną ocenę ich warunków i tym samym przerwanie impasu.
Pytanie:
Moje pytanie jest po prostu tak: jest tam czyste czekać na wniosek wyzwolić wszystkie wątki w programie przerwania ich stan oczekiwania? Jedną rzeczą, która na pewno działa (przynajmniej na moim realizacji) jest wysłać SIGSTOP następuje natychmiast przez SIGCONT od innego procesu (tj od bash):
kill -19 `cat /var/run/mypidfile` ; kill -18 `cat /var/run/mypidfile`
To wywołuje fałszywy wake-up w ramach procesu i wszystko wraca do życia.
Mam nadzieję, że istnieje inteligentna metoda wyzwalania fałszywego przebudzenia wszystkich wątków w ramach mojego procesu. Pomyśl pthread_cond_broadcast(...)
, ale bez dostępu do aktualnej zmiennej warunkowej, na którą czekano.
Czy to możliwe, czy opiera się na programie takim jak: kill
moje jedyne podejście?
Jakie są twoje wątki zablokowane? 'gdb' może ci powiedzieć, czy są zablokowane w przestrzeni użytkownika. 'ps axlm' może Ci powiedzieć w polu' WCHAN'. –
Trudno mi powiedzieć dokładnie, w którym - wątki są zakleszczoną parą. Istnieją dwa wątki w 'pthread_cond_wait', które są moim zdaniem najbardziej trafne jako obraźliwe wątki. Mogę być niepoprawny. Właśnie dlatego staram się trafić w "cały wątek". Nie wiedziałem o "ps axlm" i wykorzystam to do zebrania kolejnych danych następnym razem, gdy złapię problem. Jest to bardzo nieuchwytne i niestety nie ma żadnych etapów reprodukcji. Zgłoszę moje wnioski. –
Możesz użyć skryptu, aby złapać stos każdego wątku. 'gdb -ex" ustaw paginię 0 "-ex" wątek stosuje wszystkie bt "--batch -p $ (pidof EXECUTABLE_NAME)' –