2016-07-07 15 views
10

Xcode 8 kết hợp Trình tiện ích Chủ đề, một công cụ để phát hiện các điều kiện chủng tộc và các vấn đề liên quan đến luồng khác.Làm cách nào để ngăn chặn cảnh báo Thread Sanitizer trong Xcode từ thư viện bên ngoài?

Tôi đang cố gắng thực hiện điều này đối với dự án của tôi và đang phát hiện nhiều sự cố với thư viện nhị phân của bên thứ ba. Những vấn đề này là áp đảo bất kỳ những người trong mã của riêng tôi, và tôi không thể thay thế các thư viện nhị phân cho đến khi các nhà cung cấp sửa chữa nó.

Làm cách nào để ngăn chặn các cảnh báo Trình vệ sinh chủ đề trong Xcode cho thư viện của bên thứ ba?

+0

Ở đây chúng tôi có hai trường hợp; 1) Chủ đề Sanitizer sinh ra các ngăn xếp cảnh báo vô dụng trong trường hợp công cụ cần được tung ra; hoặc 2) cảnh báo là có thật, trong trường hợp đó lại có hai trường hợp 2a) bạn có thể đặt các mutex phù hợp và do đó nên làm như vậy, hoặc 2b) * trong trường hợp thư viện phải được gửi nếu nhà cung cấp không sửa chữa nó *. Điều kiện cuộc đua trong thư viện mà bạn không thể bảo vệ chống lại nghĩa là thư viện không phù hợp với mã đa luồng. – Joshua

+0

Đừng bỏ qua điều kiện chủng tộc hoặc các vấn đề hỏng hóc tiềm ẩn vì bạn không thể thay thế thư viện. Bằng cách đó nằm điên rồ hoàn toàn. – Joshua

Trả lời

16

Chủ đề Sanitizer có thể sử dụng các tệp đàn áp để chọn lọc tắt báo cáo các sự cố phát hiện trong các thư viện bên ngoài mã của bạn. Để sử dụng chúng với Xcode, lần đầu tiên tạo một file có tên TSan.supp (hoặc một cái gì đó tương tự) và đưa dây chuyền vào nó như sau:

mutex:Purge 
mutex:ProcessBulkInData 
mutex:EventDestroy 

Tôi đã gặp phải vấn đề với mutexes xấu trong một số chức năng nội bộ trong một thư viện cụ thể, vì vậy Tôi đã chặn các cảnh báo mutex (phần mutex: một phần ở trên) bằng cách cung cấp chuỗi con từ các tên hàm xuất hiện trong dấu vết ngăn xếp Thread Sanitizer.

Khi bạn đã hoàn thành tệp đàn áp, hãy sửa sơ đồ Chạy của bạn trong Xcode và chuyển đến tab Đối số. Trong Biến môi trường, hãy thêm tên TSAN_OPTIONS và đặt giá trị là suppressions=[path_to_TSan.supp]. Đường dẫn sẽ cần phải liên quan đến tệp nhị phân của ứng dụng của bạn trong vị trí dữ liệu có nguồn gốc của bạn.

Bạn có thể cần chạy Thread Sanitizer vài lần và chỉnh sửa tệp đàn áp của bạn để thêm từng mục từ thư viện bạn muốn chặn.

Định dạng tệp và các tùy chọn khác của tệp đàn áp này có thể được tìm thấy trên this wiki page. Cho hậu thế, đây là những

chủ đề: ngăn chặn các báo cáo liên quan đến chủ đề (rò rỉ)

mutex: ngăn chặn các báo cáo liên quan đến mutexes (phá hủy một mutex khóa)

tín hiệu : chặn báo cáo liên quan đến trình xử lý tín hiệu (handler calls malloc())

bế tắc: ngăn chặn đảo ngược khóa báo cáo

called_from_lib: ngăn chặn tất cả các máy bay đánh chặn trong một thư viện cụ thể

cám ơn đến các kỹ sư của Apple vô danh người giải thích quá trình này để đáp ứng với một báo cáo lỗi gần đây.

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