2017-08-31 44 views
6

Trong Xcode 7 và 8, tôi đã có thể gỡ lỗi một khung công tác mà tôi đang phát triển bằng cách chạy ứng dụng có chứa trong một xcworkspace cũng chứa dự án khung công tác. Nếu tôi đặt các điểm ngắt trong khung công tác, chúng sẽ được kích hoạt khi chạy.Xcode 9 - Các điểm ngắt khung

Trong Xcode 9 beta 6, điều này không còn là trường hợp. Cho đến nay, việc thực hiện chỉ dừng lại ở các điểm ngắt khung khi gỡ lỗi trên trình giả lập. Khi tôi gỡ lỗi trên một thiết bị vật lý, các điểm ngắt khung không ngừng thực thi và có vẻ như chúng bị bỏ qua hoàn toàn.

Làm cách nào để có được các điểm ngắt khung hoạt động đúng cách để gỡ lỗi khung của tôi trên iOS 11 trong Xcode 9?

FWIW: Không gian xcwork được tạo bằng cách chạy pod install bên trong thư mục gốc của khung công tác. Sau đó tôi đã thêm xcodeproj của ứng dụng mẫu vào xcworkspace. Tính năng này đã hoạt động cho đến khi thử nghiệm trên Xcode 9 beta 6.

Chỉnh sửa: Xác nhận rằng hành vi này vẫn diễn ra trên hạt giống GM của Xcode 9.0.

+0

Bạn tối ưu hóa cờ tối ưu hóa/objc nào? Nếu bạn sử dụng một số, tôi khuyên bạn nên xóa chúng khỏi cấu hình dev của bạn cho dự án và khung công tác của bạn và xem liệu trình gỡ lỗi của bạn có hoạt động tốt hơn sau đó hay không. – trupin

+0

Làm việc tốt trong xcode 9 beta 6. đảm bảo dự án của bạn được chạy trong DEBUG – amar

Trả lời

1

TL; DR - Tôi cần thay đổi thư mục mà tập lệnh lưu trữ của tôi đọc từ khi gỡ lỗi hoặc khi chuẩn bị bản phát hành. Bây giờ khi gỡ lỗi, tôi cần phải chắc chắn thiết lập cấu hình lưu trữ của lược đồ khung công tác của tôi thành "Gỡ lỗi" nếu tôi muốn các điểm ngắt hoạt động chính xác khi chạy. Tôi chỉ sử dụng "Release" khi chuẩn bị một sản phẩm sẵn sàng.

Tôi đã liên hệ với bộ phận hỗ trợ nhà phát triển của Apple thông qua báo cáo lỗi. Tôi sẽ dán câu trả lời dưới đây. Khi ông đề cập đến "lipo", ông đang đề cập đến một cuộc gọi tôi thực hiện trong một kịch bản hậu lưu trữ, tạo ra một khung phổ quát từ trình mô phỏng và xây dựng thiết bị vật lý.

Xcode phải khớp với nhị phân đang chạy với các biểu tượng gỡ lỗi vẫn còn trên máy của bạn.Xcode nên làm điều đó tự động, nhưng có vẻ như một số thứ được di chuyển xung quanh phía sau lưng của Xcode. Để biết thông tin gỡ lỗi có phù hợp với bạn hay không, bạn có thể xem kết quả của danh sách hình ảnh (lldb) và /Mac/path/to/Build/Sản phẩm/Debug-iphoneos% dwarfdump --uuid iOS-App.app/iOS- Ứng dụng cũng sẽ hoạt động trên các dylib.

Khung của bạn có dấu ngoặc đơn xung quanh địa chỉ không? Đó là một dấu hiệu chắc chắn rằng lldb không thể tìm thấy biểu tượng của bạn.

nếu UUID trong danh sách hình ảnh không khớp với dwarfdump, thì có điều gì đó đã sửa đổi tệp thi hành trước khi nó chạy và không khớp với sản phẩm được tạo của bạn. Chúng tôi không chắc liệu lipo có thể làm điều đó hay không, điều tôi thấy trong kịch bản của bạn nhưng chắc chắn là kiểm tra. Không thể thực hiện được nhiều nếu thông tin gỡ rối không còn tồn tại nữa.

Nếu bạn có thể tìm thấy tệp thực thi phù hợp với UUID phù hợp trên đĩa, bạn có thể chỉ cần (lldb) hình ảnh thêm /Mac/path/to/DerivedData-asdfasdfadf/Products/Debug-iphoneos/iOS-App.app/Frameworks/Framework

Ngoài ra, Xcode sử dụng Tiêu điểm để tìm các ký hiệu trên máy của bạn. Để tránh liên tục lập chỉ mục lại khi đang xây dựng, thư mục Intermediates/chứa các tệp .o và một nơi khác nơi thông tin gỡ lỗi được lưu trữ bị liệt vào danh sách đen. Điều này xảy ra khá muộn trong Xcode 9.0 vì vậy có thể là lý do công cụ của bạn đã hoạt động trước đó.

Khi tôi chạy (lldb) image list khi chạy, tôi thấy rằng UUID của khuôn khổ của tôi không phù hợp với điều mà đã được báo cáo bởi dwarfdump tại /Mac/path/to/Build/Products/Debug-iphoneos.

Tôi đã kết thúc việc sửa đổi tập lệnh hậu lưu trữ của mình để thay đổi thư mục xây dựng mà nó đọc từ khi tạo khung. Khi tôi đặt cấu hình lưu trữ của mình thành "Gỡ lỗi", nó sẽ đọc từ Debug-iphoneos ngay bây giờ. Khi tôi đặt nó thành "Phát hành", nó đọc từ ${BUILD_DIR}/${CONFIGURATION}${EFFECTIVE_PLATFORM_NAME}

# NOTE: This script creates a universal framework (device and simulator). However, *** for this to work: a Simulator target must be built first, and then Archive on the Device *** 

BUILD_PRODUCTS="${SYMROOT}/../../../../Products" 
SIM_PATH="${BUILD_PRODUCTS}/Debug-iphonesimulator/${TARGET_NAME}.framework" 
if [ "${CONFIGURATION}" = "Debug" ]; then 
DEV_PATH="${BUILD_PRODUCTS}/Debug-iphoneos/${TARGET_NAME}.framework" 
elif [ "${CONFIGURATION}" = "Release" ]; then 
DEV_PATH="${BUILD_DIR}/${CONFIGURATION}${EFFECTIVE_PLATFORM_NAME}/${TARGET_NAME}.framework" 
fi 
DEST_PATH="${PROJECT_DIR}/../Frameworks/${TARGET_NAME}.framework" 

rm -rf "${DEST_PATH}" 
mkdir "${DEST_PATH}" 
cp -r "${DEV_PATH}/" "${DEST_PATH}/" 
rm -f "${DEST_PATH}/${TARGET_NAME}" 
cp -Rn "${SIM_PATH}/Modules/" "${DEST_PATH}/Modules/" 

lipo -create "${SIM_PATH}/${TARGET_NAME}" "${DEV_PATH}/${TARGET_NAME}" -output "${DEST_PATH}/${TARGET_NAME}" 

Nếu đường dẫn khó hiểu, tôi không đổ lỗi cho bạn. Về cơ bản, không gian làm việc trông giống như:

RootDirectory 
|__SampleApp 
    |__SampleApp.xcodeproj 
|__Frameworks 
    |__MyFramework.framework 
    |__AnotherFramework.framework 
|__MyFramework 
    |__MyFramework.xcworkspace 
    |__MyFramework.xcodeproj 
    |__Podfile (etc..) 
0

kịch bản của tôi là:

Tôi có khuôn khổ của tôi trong con đường khác. Thông thường, tôi nhận được .framework khi tôi tạo. Và sau đó tôi thêm tệp khung (MyFramework.framework) vào dự án của tôi.

Đề nghị của tôi là:

  1. Thêm một điểm break mới trước khi gọi khuôn khổ. như thế này

enter image description here

  1. Nhấn này Bước Into nút, khi thực hiện chương trình đạt breakpoint.

enter image description here

Bây giờ thực hiện sẽ đi vào khu vực nguồn khuôn khổ của bạn, Trong thời điểm đó bạn phải thêm New Breakpoints cứ nơi nào bạn muốn trong khuôn khổ của bạn.

Đây là giải pháp làm việc trong Xcode 9 và iOS 11. Tôi hy vọng điều này sẽ giúp bạn. Chúc may mắn.

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