trạng thái: điều này đã được nhìn thấy gần đây như Mac OS 10.8 và Xcode 4.4.
tl; dr: Điều này có thể xảy ra trong hai bối cảnh: khi chạy trên thiết bị và khi chạy trên trình giả lập. Khi chạy trên thiết bị, ngắt kết nối và kết nối lại thiết bị dường như để khắc phục mọi thứ.
Mike Ash đề nghị
launchctl list|grep UIKitApplication|awk '{print $3}'|xargs launchctl remove
Điều này không hoạt động tất cả các thời gian. Trong thực tế, nó không bao giờ làm việc cho tôi nhưng nó rõ ràng hoạt động trong một số trường hợp. Chỉ không biết trường hợp nào. Vì vậy, nó đáng để thử.
Mặt khác, cách duy nhất được biết để khắc phục điều này là khởi động lại launchd của người dùng. Khởi động lại sẽ làm điều đó nhưng có một cách ít quyết liệt hơn / nhanh hơn. Bạn sẽ cần tạo một người dùng quản trị khác, nhưng bạn chỉ phải làm điều đó một lần. Khi mọi thứ kết thúc, hãy đăng xuất như chính bạn, đăng nhập với tư cách người dùng đó và tiêu diệt launchd thuộc về người dùng chính của bạn, ví dụ:
sudo kill -9 `ps aux | egrep 'user_id .*[0-9] /sbin/launchd' | awk '{print $2}'`
thay thế tên người dùng chính của bạn cho user_id
. Đăng nhập lại khi người dùng bình thường của bạn đưa bạn trở lại trạng thái lành mạnh. Kinda đau đớn, nhưng ít hơn một khởi động lại đầy đủ.
chi tiết:
Điều này đã bắt đầu xảy ra thường xuyên hơn với Lion / Xcode 4.2. (Cá nhân tôi chưa bao giờ thấy nó trước sự kết hợp đó.)
Lỗi dường như là trong launchd, kế thừa quá trình ứng dụng khi còn nhỏ khi trình gỡ lỗi ngừng gỡ lỗi mà không giết nó. Điều này thường được báo hiệu bởi ứng dụng trở thành zombie, có trạng thái quá trình Z trong ps.
Vấn đề cốt lõi dường như nằm ở máy chủ tên bootstrap được triển khai trong launchd. Điều này (trong phạm vi tôi hiểu nó) ánh xạ id ứng dụng đến các cổng mach. Khi lỗi được kích hoạt, ứng dụng sẽ chết nhưng không được xóa khỏi bản đồ máy chủ tên của máy chủ bootstrap và do đó, máy chủ bootstrap từ chối cho phép một phiên bản khác của ứng dụng được đăng ký dưới cùng tên.
Người ta hy vọng (xem các bình luận) rằng việc buộc launchd wait()
cho zombie sẽ sửa chữa mọi thứ nhưng không được. Không phải tình trạng zombie là vấn đề cốt lõi (đó là lý do tại sao một số zombie lành tính) mà là máy chủ tên bootstrap và không có cách nào để xóa đoạn giới thiệu giết chóc này.
Có vẻ như lỗi được kích hoạt bởi một cái gì đó xấu giữa Xcode, gdb và launchd của người dùng. Tôi vừa lặp lại cái nêm bằng cách chạy một ứng dụng trong trình giả lập iphone, để nó dừng lại trong gdb, sau đó thực hiện xây dựng và chạy đến trình giả lập ipad. Nó dường như rất nhạy cảm với việc chuyển đổi các trình giả lập (iOS 4.3 / iOS 5, iPad / iPhone). Nó không xảy ra mọi lúc nhưng khá thường xuyên khi tôi chuyển đổi giả lập rất nhiều.
Giết launchd trong khi bạn đăng nhập sẽ làm hỏng phiên của bạn. Đăng xuất và đăng nhập lại không giết được launchd của người dùng; OS X giữ quá trình hiện có xung quanh. Khởi động lại sẽ sửa chữa mọi thứ, nhưng đó là đau đớn. Các hướng dẫn ở trên là nhanh hơn.
Tôi đã gửi một lỗi cho Apple, FWIW. lần thứ nhất: // 10330930