iOS 10 không in NSLogs


88

Không có gì in NSLogtrên Xcode 8.0 beta (8S128d). printfkhông thay đổi

Đây là mã của tôi:

NSLog(@"hello from NSLog");
printf("hello from printf");

Đây là kết quả trên iOS 9 Simulator:

2016-06-17 09:49:10.887 calmapp-dev[28517:567025] hello from NSLog
hello from printf

Đây là kết quả trên iOS 10 Simulator:

hello from printf

Tôi đã có một vấn đề tương tự. Nhưng trong iOS 8.1, Xcode 8. Tôi đã kiểm tra từng câu trả lời ở đây. Hóa ra là tôi đã làm mọi thứ một cách chính xác. Không có gì thực sự giúp ích. Vì vậy, tôi đã tắt thiết bị và bật nó lên. Nó hoạt động. Tôi đã viết bình luận này ở đây để nó có thể giúp đỡ người khác phải đối mặt với một vấn đề tương tự
KrishnaCA

Câu trả lời:


229

Có thể là bạn đã thêm thuộc tính "OS_ACTIVITY_MODE": "vô hiệu hóa" trong các biến môi trường Đề án (để ẩn đầu ra của Hệ điều hành khỏi trình mô phỏng) và quên mất nó và hiện đang chạy trên thiết bị thực.

Trong Xcode 8:

Product -> Scheme -> Edit Scheme -> Run -> Arguments -> Environment Variables

Chỉ thêm OS_ACTIVITY_MODEvà kiểm tra nó (Không thêm giá trị)

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

Tóm tắt: Đây là một lỗi của Xcode 8 + iOS10, chúng tôi có thể giải quyết nó theo cách này:

  • Khi sử dụng trình mô phỏng, hãy thêm Tên "OS_ACTIVITY_MODE" và Giá trị "vô hiệu hóa" và kiểm tra.

  • Khi ở trên thiết bị thực, chỉ thêm "OS_ACTIVITY_MODE" và chọn nó (Không thêm Giá trị). Bạn sẽ thấy NSLog trong Xcode8 Console.


4
> "Không thêm giá trị" Tôi đặt nó thành "vô hiệu hóa" và nó hoạt động! Trường trống không phù hợp với tôi.
m8labs

Bạn có chắc nó hoạt động khi gỡ lỗi thiết bị iphone thực, không phải trình giả lập? Nếu tôi đặt nó thành "vô hiệu hóa", bảng điều khiển không thể NSLog khi gỡ lỗi iphone thực.
user6833743 18/09/16

Tôi đã kiểm tra tại không có "vô hiệu hóa", nó hoạt động trên thiết bị bây giờ, nhưng bị hỏng trên mô phỏng, nó cho thấy tất cả mọi thứ giờ đây một lần nữa ...
m8labs

2
có cách nào để tự động hóa quá trình này không? nó thực sự thực sự khó chịu mà chúng tôi phải nhớ đi đi lại lại như thế này: /
nhà kính

2
Giải pháp này sẽ ẩn tất cả NSLog bắt đầu bằng Xcode 9. Để giữ NSLog, hãy thay thế disablebằng default.
Cœur

27

Nếu bạn kiểm tra ghi chú phát hành Xcode 8 beta , bạn sẽ thấy rằng:

Khi gỡ lỗi ứng dụng đang chạy trên Simulator, nhật ký có thể không hiển thị trong bảng điều khiển. Cách giải quyết: Sử dụng lệnh + / trong Simulator.app để mở nhật ký hệ thống trong ứng dụng Console để xem NSLog. (26457535)


9
Tôi cũng không thể thấy đầu ra NSLog trong thiết bị iOS 10 thực. Nếu đang sử dụng thiết bị thực, bạn có thể mở cửa sổ Thiết bị (Shift + Command + 2) và xem nhật ký thiết bị ở đó, nhưng thật khó để xem nhật ký ứng dụng gỡ lỗi vì bảng điều khiển hiển thị tất cả nhật ký từ hệ thống và ứng dụng.
kientux

19

NSlog hoặc bản in thực sự được thực thi nhưng bị ẩn trong số rất nhiều đầu ra gỡ lỗi bảng điều khiển khác để giải quyết vấn đề này Mở Xcode8:

Product -> Scheme -> Edit Scheme -> Run -> Arguments -> Environment Variables

thêm "OS_ACTIVITY_MODE" và đặt Giá trị thành "vô hiệu hóa" và kiểm tra.

bấm đóng

xcode9

thêm "OS_ACTIVITY_MODE" và đặt Giá trị thành "mặc định" và kiểm tra.

nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây


Điều này không làm việc cho tôi. NSLogs không hiển thị cho các ứng dụng đã triển khai. Tôi sử dụng xcode 8.1 (chạy trên Mac 10.11) với thiết bị iOS 10.
mobjug

21
Giải pháp này sẽ ẩn tất cả NSLog bắt đầu bằng Xcode 9. Để giữ NSLog, hãy thay thế disablebằng default.
Cœur

3
Câu trả lời này sẽ được cập nhật vào tài khoản cho @ sửa Cœur cho Xcode 9.
Joel

7

Tôi cũng không thể thấy đầu ra NSLog trong thiết bị iOS 10 thực. Nếu đang sử dụng thiết bị thực, bạn có thể mở cửa sổ Thiết bị từ Xcode (Shift + Command + 2) và xem nhật ký thiết bị ở đó, nhưng thật khó để xem nhật ký ứng dụng của bạn vì bảng điều khiển hiển thị nhật ký từ hệ thống và tất cả các ứng dụng.

(Tôi đang sử dụng Xcode 7, vì vậy có thể không phải vấn đề của Xcode mà là vấn đề iOS 10)


Tôi không thấy NSLog cho ứng dụng của mình trong cửa sổ thiết bị trong iOS 10 GM ... bạn có đang gặp sự cố tương tự không?
TahoeWolverine

Tôi có thể xem nhật ký trong Xcode 7 với iOS 10 GM, không cần mở cửa sổ thiết bị nữa.
kientux

2
Tuy nhiên, tôi không nói về việc chạy từ Xcode, tôi đang nói về nhật ký được in từ một ứng dụng đã triển khai.
TahoeWolverine

Bất kỳ tiến bộ về điều này?
jhurray

NSLogs và printf bị bỏ qua trong nhật ký thiết bị iOS 10 trong các ứng dụng đã triển khai. Bạn có thể thêm macro toàn cục để thay thế nó bằng một lệnh gọi trực tiếp tới os_log.
Elist

7

Ngoài ra, hãy đảm bảo Bảng điều khiển thực sự hiển thị trong Xcode (tức là, đảm bảo biểu tượng bên tay phải được đánh dấu màu xanh lam, như theo hình ảnh bên dưới). Sau khi tôi nâng cấp Xcode, nó ẩn Bảng điều khiển và chỉ hiển thị cho tôi chế độ xem Biến. Điều này làm cho nó có vẻ như NSLog()không hoạt động bình thường, trong khi nó thực sự hoạt động chính xác, tôi chỉ không thể thấy đầu ra.

nhập mô tả hình ảnh ở đây


Ngoài ra, có thể kích hoạt bảng điều khiển với Shift + ⌘ + CXcode phiên bản 8.3.3
DJ2

5

Hmmm ... có vẻ như thuộc tính "OS_ACTIVITY_MODE": "vô hiệu hóa" PREVENTS NSlog không hiển thị trong nhật ký Xcode 9.

Bỏ chọn giá trị này trong lược đồ của tôi đã khôi phục nhật ký của tôi.


5

Đối với bất cứ ai đến điều này trong tương lai. Lý do NSLog không in vào nhật ký hệ thống trong iOS 10 và iOS 11 là do Apple thay đổi thành Ghi nhật ký hợp nhất.

Bạn có thể xem cuộc nói chuyện của WWDC về nó tại đây: https://developer.apple.com/videos/play/wwdc2016/721/

Tài liệu tại đây: https://developer.apple.com/documentation/os/logging

Từ ngày 10 trở đi, bạn nên sử dụng os_log thay vì NSLog.

Cách tìm nhật ký trên đĩa: https://www.blackbagtech.com/blog/2017/09/22/accessing-unified-logs-image/

Tóm lại, các bản ghi được đặt trong /var/db/diagnosticsđó có thể được tìm thấy cho một máy ảo tại/Users/USERNAME/Library/Developer/CoreSimulator/Devices/SIMULATOR-GUID/data/var/db/

Sao chép tất cả các mục bên trong diagnosticsuuidtextvào một thư mục duy nhất (không bao gồm chẩn đoán thư mục hoặc văn bản uuidtext chỉ những gì bên trong).

Đổi tên thư mục đó foldername.xarchive.

Mở nó trong Console.app hoặc sử dụng OSX log:log show <path to archive> --info --predicate <options>


Còn trên iOS thì sao?
kakyo

1

Tôi đang sử dụng Xcode 8, vì vậy tôi cũng gặp phải vấn đề tương tự. Và tôi đã giải quyết vấn đề này bằng cách thêm value = disablevào trình mô phỏng, nhưng trên máy thực, tôi không thêm giá trị.


1
tôi đang gặp một số vấn đề với Xcode 9. i chèn đối số: OS_ACTIVITY_MODE nhưng có vẻ như không hoạt động ...
Alessio Campanelli

4
Giải pháp này sẽ ẩn tất cả NSLog bắt đầu bằng Xcode 9. Để giữ NSLog, hãy thay thế disablebằng default.
Cœur

Theo tôi đây là câu trả lời chính xác. OS_ACTIVITY_MODEdisablehoặc defaulttrực tiếp
Greg

1

NSLogthông báo không còn hiển thị khi tôi nâng cấp lên Xcode 9.1 + iOS 11.1. Ban đầu, câu trả lời được chấp nhận đã cho tôi cách giải quyết vấn đề này bằng ứng dụng Console và bật Trình mô phỏng ( xem câu trả lời của Lucas ).

Trong ứng dụng Bảng điều khiển, Actiontôi đã thử chọn Include Debug Messagesvà bỏ chọn Include Info Messages(để Bảng điều khiển không bị lấp đầy bởi các thông báo hệ thống). NSLogthông báo xuất hiện trong cửa sổ Bảng điều khiển trong Xcode nhưng không xuất hiện trong ứng dụng Bảng điều khiển.

Tôi nhận ra rằng phải có một cách trực tiếp hơn để disablehoặc kích hoạt (tức là default) NSLogsnhờ nhận xét của Coeur để trả lời câu trả lời này. Theo ý kiến ​​của tôi, đó là câu trả lời tốt nhất vì đặt OS_ACTIVITY_MODEthành disablehoặc defaultsẽ có ý nghĩa hơn đối với người mới bắt đầu.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.