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..)
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
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