2009-07-09 25 views
15

Tôi đã tự hỏi liệu có cách nào tốt hơn, ngoài NSLog-ing chỉ là về mọi thứ - để gỡ lỗi đúng gói ứng dụng Trình bảo vệ màn hình trong OS X?Làm cách nào để gỡ lỗi Trình bảo vệ màn hình trong OS X

"Trình bảo vệ màn hình" là loại dự án trong Xcode, nhưng rõ ràng không có Gỡ lỗi xây dựng và chạy. Hơn nữa, tôi đã tìm thấy rằng trong thực tế bó của tôi là nhận được nạp vào ứng dụng

/System/Library/Frameworks/ScreenSaver.framework/Versions/A/Resources/ScreenSaverEngine.app 

như một số loại plugin.

Vì vậy, có một cách phù hợp để gỡ lỗi mã của bạn? Nhìn vào các báo cáo sự cố và NSLog-ing tới bảng điều khiển giúp, nhưng nó không hoàn hảo.

Trả lời

10

Có một bài viết MacTech cũ mô tả chu kỳ phát triển Trình bảo vệ màn hình. Ngoài ra còn có một Part 2 cho bài viết. Tìm trong phần "Mẹo gỡ lỗi".

Tôi thấy phương pháp này là một nỗi đau vì vậy tôi đã viết một ứng dụng, ứng dụng cơ bản là một cửa sổ và một bộ điều khiển đã khởi tạo một ScreenSaverView với gói bảo vệ màn hình mới của tôi. Một khi đó đã làm việc tất cả những gì tôi phải làm để kiểm tra một sự thay đổi đã được nhấn Command-R trong Xcode.

+0

Liên kết tuyệt vời!Tôi không biết tại sao tôi không thể tìm thấy nó bản thân mình :) –

+0

Kuto của David Hill cho bài viết đó (x-Apple DTS!) – geowar

+0

Bài viết đó là từ khi MacTech đáng đọc cho các nhà phát triển. Tôi đã hủy đăng ký khi họ chuyển trọng tâm sang CNTT. – Mark

1

không nhất thiết phải là cách tốt nhất, nhưng bạn có thể ssh từ máy khác và khởi động ScreenSaverEngine từ gdb (chưa được kiểm tra)

chỉnh sửa:

cũng có, bạn có thể thử thêm một mục tiêu ứng dụng mới và bổ sung ScreenSaverView của bạn vào một cửa sổ trong IB, bạn có thể phải cấu hình thủ công các công cụ như cài đặt, nhưng nó có thể giúp một số và có thể làm việc OK khi ScreenSaverView là một lớp con của NSView

+0

Tôi đã cố gắng tránh điều này chỉ vì thiếu khả năng của một máy khác ... –

6

Bạn có thể gỡ lỗi bằng cách thực thi ứng dụng sẽ tải phích cắm trong.

Vì vậy, để gỡ lỗi trình bảo vệ màn hình, hãy mở dự án plugin của bạn, chọn New Custom Executable từ trình đơn Dự án và đặt ứng dụng làm công cụ bảo vệ màn hình.

Để gỡ lỗi trình bảo vệ màn hình, bạn cũng có thể muốn sử dụng máy Mac thứ hai và sử dụng remote debugging để hành động giao diện người dùng của bạn không ảnh hưởng đến trình bảo vệ màn hình.

+0

Trên Lion với XCode4, tôi thấy điều này được thực hiện bằng cách thay đổi thực thi của lược đồ thành /System/Frameworks/ScreenSaver.framework/ Tài nguyên/ScreenSaverEngine.app – iforce2d

+0

Tôi cũng tìm thấy bạn vẫn cần phải cài đặt bảo vệ màn hình vào các tùy chọn hệ thống như bình thường mỗi khi bạn thay đổi nó, nhưng đó vẫn là một cảnh darn tốt hơn so với chờ đợi 3 phút mỗi lần. – iforce2d

+0

>>> không thể định dạng văn bản tại đây; di chuyển đến câu trả lời mới <<< – geowar

2

Như Peter nói, bạn có thể gỡ lỗi plugin bằng cách thực hiện một ứng dụng sẽ tải plugin.

Tuy nhiên, thay vì sử dụng công cụ bảo vệ màn hình, bạn cũng có thể sử dụng các tùy chọn hệ thống. Khi tùy chọn xuất hiện, hãy điều hướng đến trình bảo vệ màn hình của bạn trong "Desktop & Trình bảo vệ màn hình" để tải plugin của bạn.

Không hoàn hảo vì chế độ xem của bạn sẽ không có kích thước đầy đủ nhưng có thể dễ dàng hơn việc thiết lập gỡ lỗi từ xa.

+0

Tôi đã sử dụng phương pháp này. Hoạt động tốt cho mục đích của tôi. –

+0

Đây là những gì tôi sử dụng (tôi cũng sử dụng đăng nhập vào các tệp, từ các ứng dụng thử nghiệm độc lập, để lấy một số mã lõi chuyên sâu dữ liệu). Trên các phiên bản mới hơn của Mac OS X và Xcode (ví dụ, 10.10 và Xc 7), lưu ý rằng bạn chỉ cần bật các điểm ngắt, "đính kèm" vào System Preferences (trình đơn gỡ rối Xc), nhấp vào trình bảo vệ màn hình trong danh sách và voila , bạn có thể bước qua nguồn của bạn (giả sử bạn đã cài đặt bản dựng gỡ lỗi). Bạn không thể dễ dàng sử dụng tính năng xem trước để gỡ lỗi các trường hợp lớn hơn của trình bảo vệ màn hình của bạn, vì nó bao gồm toàn bộ màn hình. – jarFlooby

2

Có một vài ứng dụng Mac OS X sẽ chạy trình bảo vệ màn hình: SaverLab, Screenalicious, v.v. Chỉ cần tìm một trong số chúng trên web và tải xuống và sau đó đặt nó làm mục tiêu thực thi (như Peter N Lewis đã nói) .

Để tránh sao chép sản phẩm xây dựng thành '~/Library/Screen Savers /' sau mỗi lần xây dựng, bạn có thể thêm tập lệnh tạo tùy chỉnh (lưu ý: Tôi đang sử dụng '/ bin/tcsh -x' cho trình bao):

#remove the old screen saver or link 
rm -Rf "${SCRIPT_OUTPUT_FILE_0}" 

#if this is a debug build… 
if ("${CONFIGURATION}" == "Debug") then 

# create a symbolic link from our screen saver to this users screen saver directory 
ln -sfv "${SCRIPT_INPUT_FILE_0}" "${SCRIPT_OUTPUT_FILE_0}" 

#if this is a release build… 
else if ("${CONFIGURATION}" == "Release") then 

# copy our screen saver to this users CMM directory 
cp -Rfv "${SCRIPT_INPUT_FILE_0}" "${SCRIPT_OUTPUT_FILE_0}" 

endif 

Sau đó thiết lập tập tin đầu vào của nó thành "$ {BUILT_PRODUCTS_DIR}/$ {FULL_PRODUCT_NAME}" và tập tin đầu ra của mình để "$ {HOME}/Library/Screen Savers/$ {FULL_PRODUCT_NAME}".

Bây giờ, khi bạn xây dựng/chạy dự án của bạn, nó sẽ tự động liên kết ma thuật đến bản dựng gỡ lỗi của bạn hoặc sao chép bản phát hành bản phát hành của bạn.

3

Bạn cũng có thể làm cho trình bảo vệ màn hình ('/System/Library/Frameworks/ScreenSaver.framework/Resources/ScreenSaverEngine.app') đích thực thi và chuyển nó thành cờ -background trước mọi thứ).

+2

Thật không may, điều này không hoạt động trên 10,11 El Capitan vì bảo vệ toàn vẹn hệ thống ngăn chặn chạy ScreenSaverEngine trong trình gỡ lỗi. –

+1

Nó làm việc cho tôi ở đây ... có lẽ vì tôi đã vô hiệu hóa SIP? – geowar

+2

Phải, tắt SIP cho phép bạn gỡ lỗi/Ứng dụng hệ thống như ScreenSaverEngine. Tuy nhiên, tôi đã tìm ra cách giải quyết: tạo một bản sao của ScreenSaverEngine.app bằng cách sao chép nó ra khỏi hệ thống phân cấp thư mục/System, và sau đó thiết lập bản sao đó làm thực thi đích. Bản sao của ứng dụng không còn bị SIP, vì vậy nó có thể được gỡ lỗi bởi Xcode. –

4

Vì OS X 10.11 Tính năng Bảo vệ tính toàn vẹn hệ thống của Capitan, trình gỡ lỗi không thể đính kèm vào bất kỳ thứ gì chạy từ /System/. Ngoài ra, thông tin khác ở đây áp dụng cho các phiên bản cũ của Xcode.

Đây là cách tôi đã nhận nó làm việc trên El Capitan với Xcode 7.2:

  1. Sao chép /System/Library/Frameworks/ScreenSaver.framework/Versions/A/Resources/ScreenSaverEngine.app/-/tmp/. (Kể từ khi .xcscheme tham chiếu đường dẫn đầy đủ tiêu chuẩn, sao chép nó vào một nơi nào đó thường là tốt nhất cho sự hợp tác, thay vì vào nơi nào trong thư mục chính của người dùng cụ thể.)
  2. Chỉnh sửa của dự án .xcscheme:
    • Đặt Executable cho hành động Chạy của ứng dụng đã sao chép và thêm đối số: -debug-background-module "<product-name>" (trong đó <product-name> là tên nhóm không có tiện ích mở rộng .saver).
    • Thêm tập lệnh Pre-action (nguồn bên dưới), với bộ vỏ được đặt thành /bin/bash và cài đặt bản dựng của nó xuất phát từ lược đồ. Nó tạo ra một liên kết tượng trưng đến xây dựng .saver bó trong ~/Library/Screen Savers/

Nguồn:

SCREEN_SAVER_PATH="${HOME}/Library/Screen Savers/${FULL_PRODUCT_NAME}" 
if [[ -d "${SCREEN_SAVER_PATH}" || -f "${SCREEN_SAVER_PATH}" || -L "${SCREEN_SAVER_PATH}" ]]; then 
    rm -Rf "${SCREEN_SAVER_PATH}" 
fi 
ln -s "${BUILT_PRODUCTS_DIR}/${FULL_PRODUCT_NAME}" "${SCREEN_SAVER_PATH}" 

Bây giờ, khi bạn nhấn nút Run Xcode của, màn hình tiết kiệm sẽ chạy ở chế độ nền trên Desktop của bạn và bạn có thể sử dụng trình gỡ rối.

0

Nếu bạn tạo một bản sao của ứng dụng ScreenSaverEngine, và ký nó với ID nhà phát triển của bạn, nó sẽ khắc phục tình huống mà tính năng Bảo vệ toàn vẹn hệ thống ngăn chặn đính kèm trình gỡ rối. Chỉ cần đảm bảo đặt tệp thực thi thành bản sao đã ký của riêng bạn.

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