2012-02-05 44 views
5

Tôi có một mô-đun hạt nhân lỗi mà tôi đang cố sửa chữa. Về cơ bản khi mô-đun này đang chạy, nó sẽ khiến các tác vụ khác bị treo trong hơn 120 giây. Vì hầu như tất cả các tác vụ treo đang đợi hoặc mm-> mmap_sem hoặc một số khóa hệ thống tệp (i_node-> i_mutex), tôi nghi ngờ rằng nó có liên quan đến mô-đun này không lấy khóa mmap_sem và một số mức hệ thống tệp khóa (như inote-> i_mutex) theo thứ tự, có thể đã gây ra một số vấn đề bế tắc. Vì mô-đun của tôi không cố gắng lấy những khóa đó trực tiếp, tôi cho rằng đó là một số chức năng mà tôi gọi là lấy các khóa đó. Và bây giờ tôi đang cố gắng tìm ra các chức năng gọi trong module của tôi đang gây ra vấn đề.Cách gỡ lỗi các sự cố bế tắc trong hạt nhân

Tuy nhiên, tôi có một thời gian khó gỡ lỗi nó vì những lý do sau đây:

  1. Tôi không biết chính xác khóa nhiệm vụ treo đang cố gắng để lấy. Tôi đã nhận được dấu vết cuộc gọi của nhiệm vụ treo, và biết tại điểm nó treo. Kernel cũng cung cấp cho tôi một số loại thông tin như: "1 khóa do automount/3115: 0: (& type-> i_mutex_dir_key # 2) {- ..}, tại: [] real_lookup + 0x24/0xc5". Tuy nhiên, tôi muốn biết chính xác khóa nào một nhiệm vụ được giữ, và chính xác khóa nào nó đang cố gắng có được để tìm ra vấn đề. Vì hạt nhân không cung cấp các đối số của các cuộc gọi hàm cùng với dấu vết cuộc gọi, tôi thấy thông tin này khó có được.

  2. Tôi đang sử dụng gdb andvmware để gỡ lỗi điều này, cho phép tôi đặt điểm ngắt, bước vào một hàm và như vậy. Tuy nhiên, khi mà nhiệm vụ và tại thời điểm mà nhiệm vụ sẽ treo là loại không xác định, tôi không thực sự biết nơi để thiết lập các điểm ngắt và kiểm tra. Nó sẽ là tuyệt vời nếu tôi bằng cách nào đó có thể "đính kèm" vào nhiệm vụ mà hạt nhân báo cáo bị chặn trong hơn 120 giây, và nhận được một số thông tin về nó.

Vì vậy, câu hỏi của tôi là như sau:

  1. Tôi có thể lấy ở đâu, cùng với các dấu vết cuộc gọi, những lập luận của các chức năng trong các dấu vết cuộc gọi, để tìm ra chính xác mà khóa một nhiệm vụ đang cố gắng lấy.

  2. Tôi có thể sử dụng gdb bằng cách nào đó "đính kèm" vào tác vụ bị treo trong hạt nhân không? Nếu không, có cách nào để tôi ít nhất là kiểm tra cấu trúc dữ liệu đại diện cho nhiệm vụ đó không? Vì tôi đang gặp khó khăn trong việc kiểm tra tất cả cấu trúc dữ liệu toàn cầu trong hạt nhân. GDB luôn phàn nàn rằng "không thể truy cập bộ nhớ 0x3200" hoặc một cái gì đó tương tự.

  3. Nó cũng sẽ rất hữu ích nếu tôi có thể in ra cho mọi công việc trong hạt nhân, khóa nào họ hiện đang nắm giữ. Có cách nào để làm điều đó?

Cảm ơn bạn rất nhiều!

Trả lời

3

Không trả lời trực tiếp câu hỏi của bạn, nhưng hy vọng điều này hữu ích hơn - hạt nhân Linux có trình xác thực khóa nhiệm vụ nặng được gọi là lockdep. Bật nó lên và để nó chạy. Nếu bạn có một vấn đề về trật tự khóa, nó có khả năng bắt nó và cung cấp cho bạn một báo cáo chi tiết.

Xem: http://www.mjmwired.net/kernel/Documentation/lockdep-design.txt

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