Bazı arka plan:Linux uygulamasında sahte uyandırma nasıl tetiklenir?
Ben üçüncü şahıs donanım ve kapalı bir kaynak sürücüsü kullanan bir uygulama var. Sürücüde, aygıtın rastgele bir süre sonra yanıt vermeyi durdurmasına neden olan bir hata var. Bu, sürücünün içinde görünen bir çıkmazdan kaynaklanıyor ve her zaman 7/24 oldukça görünür bir ortamda bulunan, uygulamamın düzgün çalışmasını engelliyor.
Bulduğum şey, GDB'yi sürece eklemenin ve GDB'yi işlemden hemen çıkarmanın, aygıtın işlevselliğini sürdürmesiyle sonuçlandığını buldu. Bu, sürücünün kendisinde bir iplik kilitleme sorunu olduğuna dair ilk göstergemdi. Bir çıkmaz yol açan bir tür yarış durumu var. GDB'nin takılması açık bir şekilde ipliklerin yeniden şekillendirilmesine neden oluyordu ve muhtemelen onları bekleme durumundan dışarı atıyordu, bu da onların koşullarını yeniden değerlendirmelerine ve böylece çıkmazı kırmasına neden oluyordu.
soru:
sorum basitçe şudur: Onların bekleme durumu kesmek için programdaki tüm konuları tetiklemek için bir uygulama için temiz bir bekleme var mı? kesinlikle (en azından benim uygulanmasına ilişkin) çalışır bir şey başka bir işlem bir SIGCONT tarafından SIGSTOP hemen ardından göndermektir (yani bash): Bu süreç ve her şeyi içinde sahte uyandırma tetikler
kill -19 `cat /var/run/mypidfile` ; kill -18 `cat /var/run/mypidfile`
hayata geri döner.
Sürecimdeki tüm parçacıkların sahte uyanmasını tetikleyen akıllı bir yöntem olduğunu umuyorum. pthread_cond_broadcast(...)
'u düşünün, ancak beklenen gerçek koşul değişkenine erişmeden.
Bu mümkün mü ya da tek yaklaşımım olan kill
gibi bir programa güveniyor mu?
Konuların neler engellendi? gdb, kullanıcı alanında engellendiğini söyleyebilir. 'ps axlm'' WCHAN' alanında size söyleyebilir. –
Tam olarak söyleyebilmem benim için zor - iş parçacıkları çıkmaz çifti. Pthread_cond_wait'de iki iş parçacığı vardır; Yanlış olabilirim. Bu yüzden herşeyi vurmaya çalışıyorum. Ben ps axlm'den habersizdim ve bir dahaki sefere sorunu yakaladığımda daha fazla veri toplamak için kullanacağım. Çok zor ve maalesef herhangi bir reprodüksiyon aşaması yok. Bulgularımı rapor edeceğim. –
Her iş parçacığının yığınını yakalamak için bir komut dosyası kullanabilirsiniz. "gdb -ex" sayfalandırma ayarlandı 0 "-ex" iş parçacığı tüm bt'yi uygular --batch -p $ (pidof EXECUTABLE_NAME) ' –