2012-12-26 32 views
9

Một số nền:Làm thế nào để kích hoạt đánh thức giả mạo trong một ứng dụng Linux?

Tôi có một ứng dụng dựa trên phần cứng của bên thứ ba và trình điều khiển nguồn đóng. Trình điều khiển hiện có lỗi trong đó khiến thiết bị ngừng phản hồi sau một khoảng thời gian ngẫu nhiên. Điều này là do một bế tắc rõ ràng trong trình điều khiển và ngắt hoạt động đúng đắn của ứng dụng của tôi, mà là trong một môi trường luôn luôn 24/7 có thể nhìn thấy cao.

Điều tôi đã tìm thấy là gắn GDB vào quy trình và ngay lập tức tách GDB khỏi kết quả quá trình trong chức năng tiếp tục thiết bị. Đây là dấu hiệu đầu tiên của tôi rằng có một vấn đề khóa trong chính trình điều khiển. Có một số loại tình trạng chủng tộc dẫn đến bế tắc. Đính kèm GDB rõ ràng là gây ra một số thay đổi chủ đề và có thể đẩy họ ra khỏi trạng thái chờ đợi của họ, khiến họ phải đánh giá lại các điều kiện của họ và do đó phá vỡ bế tắc.

Câu hỏi đặt ra:

Câu hỏi của tôi chỉ đơn giản là thế này: là có một chờ đợi sạch cho một ứng dụng để kích hoạt tất cả các chủ đề trong chương trình làm gián đoạn trạng thái chờ đợi của họ? Một điều mà chắc chắn công trình (ít nhất là về việc thực hiện của tôi) là để gửi một SIGSTOP ngay sau đó một SIGCONT từ quá trình khác (ví dụ từ bash):

kill -19 `cat /var/run/mypidfile` ; kill -18 `cat /var/run/mypidfile` 

này gây ra một giả mạo đánh thức trong quá trình và tất cả mọi thứ trở lại với cuộc sống.

Tôi hy vọng có một phương pháp thông minh để kích hoạt đánh thức giả mạo tất cả các chuỗi trong quá trình của tôi. Hãy suy nghĩ pthread_cond_broadcast(...) nhưng không có quyền truy cập vào biến điều kiện thực tế đang chờ.

Điều này có thể hay đang dựa vào một chương trình như kill cách tiếp cận duy nhất của tôi?

+2

Chủ đề của bạn bị chặn trên? 'gdb' có thể cho bạn biết nếu chúng bị chặn trong không gian người dùng. 'ps axlm' có thể cho bạn biết trong trường' WCHAN'. –

+0

Thật khó cho tôi để nói chính xác - chủ đề nào là cặp bế tắc. Có hai chủ đề trong 'pthread_cond_wait', đó là dự đoán tốt nhất của tôi là các chủ đề vi phạm. Tôi có thể không chính xác. Đây là lý do tại sao tôi đang cố gắng để đạt -every-thread. Tôi đã không biết 'ps axlm' và sẽ sử dụng điều này để thu thập thêm dữ liệu vào lần sau tôi gặp vấn đề. Nó là rất khó nắm bắt và không có bất kỳ bước sinh sản, không may. Tôi sẽ báo cáo những phát hiện của tôi. –

+1

Bạn có thể sử dụng tập lệnh để nắm bắt tất cả các chuỗi. 'gdb -ex" đặt pagination 0 "-ex" thread áp dụng tất cả bt "--batch -p $ (pidof EXECUTABLE_NAME)' –

Trả lời

4

Cách bạn đang thực hiện ngay bây giờ có lẽ là chính xác và đơn giản nhất. Không có "đánh thức tất cả chờ đợi futexes trong một quá trình nhất định" hoạt động trong hạt nhân, đó là những gì bạn sẽ cần để đạt được điều này trực tiếp hơn.

Lưu ý rằng nếu "bế tắc" không thành công "" là trong pthread_cond_wait nhưng ngắt nó bằng tín hiệu thoát ra khỏi bế tắc, lỗi không thể có trong ứng dụng; nó phải thực sự trong việc thực hiện các biến điều kiện pthread. glibc đã biết các lỗi không có sẵn trong việc thực hiện biến điều kiện của nó; xem http://sourceware.org/bugzilla/show_bug.cgi?id=13165 và báo cáo lỗi có liên quan. Tuy nhiên, bạn có thể đã tìm thấy một cái mới, vì tôi không nghĩ rằng những cái đã biết hiện tại có thể được cố định bằng cách phá vỡ sự chờ đợi của futex với một tín hiệu. Nếu bạn có thể báo cáo lỗi này cho trình theo dõi lỗi glibc, nó sẽ rất hữu ích.

+0

Tôi sẽ khám phá điều này. Cảm ơn bạn. –

+0

Tôi hiện đang thu thập thêm dữ liệu dựa trên nhận xét của David về câu hỏi trên. Tôi tin rằng điều này sẽ giúp tôi hiểu rõ hơn về vấn đề này và liệu một lỗi glibc là một khả năng hay không. Theo như câu hỏi của tôi, tôi sẽ tiếp tục chấp nhận câu trả lời này trong một vài ngày để xem có ai khác có ý tưởng nào không. Phương thức báo hiệu HOẠT ĐỘNG, nó có vẻ như nó có thể tốt hơn. Cảm ơn bạn đã giúp đỡ. –

Các vấn đề liên quan