Sau khi đọc tất cả các câu trả lời ở đây để tượng trưng cho một bản ghi sự cố (và cuối cùng thành công), tôi nghĩ rằng có một số điểm bị thiếu ở đây thực sự quan trọng để xác định lý do tại sao việc gọi biểu tượng hóa không tạo ra đầu ra tượng trưng.
Có 3 tài sản phải khớp với nhau khi tượng trưng cho nhật ký sự cố:
- Bản thân tệp nhật ký sự cố (nghĩa là
example.crash
), được xuất từ trình tổ chức của XCode hoặc nhận được từ iTunes Connect.
- Các
.app
gói (ví dụ example.app
) mà bản thân chứa nhị phân ứng dụng thuộc nhật ký sự cố. Nếu bạn có một .ipa
gói (tức là example.ipa
) thì bạn có thể giải nén .app
gói đó bằng cách giải nén .ipa
gói (tức là unzip example.ipa
). Sau đó .app
gói nằm trong Payload/
thư mục giải nén.
- Các
.dSYM
gói có chứa các ký hiệu gỡ lỗi (ví dụ example.app.dSYM
)
Trước khi bắt đầu ký hiệu, bạn nên kiểm tra xem tất cả các tạo phẩm đó có khớp hay không, điều đó có nghĩa là nhật ký sự cố thuộc về nhị phân bạn có và các ký hiệu gỡ lỗi là những ký tự được tạo ra trong quá trình xây dựng nhị phân đó.
Mỗi nhị phân được tham chiếu bởi một UUID có thể nhìn thấy trong tệp nhật ký sự cố:
...
Binary Images:
0xe1000 - 0x1f0fff +example armv7 <aa5e633efda8346cab92b01320043dc3> /var/mobile/Applications/9FB5D11F-42C0-42CA-A336-4B99FF97708F/example.app/example
0x2febf000 - 0x2fedffff dyld armv7s <4047d926f58e36b98da92ab7a93a8aaf> /usr/lib/dyld
...
Trong trích xuất này, nhật ký sự cố thuộc về hình ảnh nhị phân của ứng dụng có tên example.app/example với UUID aa5e633efda8346cab92b01320043dc3
.
Bạn có thể kiểm tra UUID của gói nhị phân bạn có với dwarfdump:
dwarfdump --uuid example.app/example
UUID: AA5E633E-FDA8-346C-AB92-B01320043DC3 (armv7) example.app/example
Sau đó, bạn nên kiểm tra xem các biểu tượng gỡ lỗi mà bạn có cũng thuộc về nhị phân đó không:
dwarfdump --uuid example.app.dSYM
UUID: AA5E633E-FDA8-346C-AB92-B01320043DC3 (armv7) example.app.dSYM/Contents/Resources/DWARF/example
Trong ví dụ này, tất cả các tài sản khớp với nhau và bạn sẽ có thể tượng trưng cho stacktrace của mình.
Tiếp tục với symbolicatecrash
kịch bản:
Trong Xcode 8.3, bạn sẽ có thể gọi tập lệnh thông qua
/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash -v example.crash 2> symbolicate.log
Nếu nó không ở đó, bạn có thể chạy một find . -name symbolicatecrash
thư mục Xcode.app để tìm nó.
Như bạn có thể thấy không có thêm thông số nào được đưa ra. Vì vậy, tập lệnh phải tìm các ký hiệu nhị phân và gỡ lỗi ứng dụng của bạn bằng cách chạy một tìm kiếm nổi bật. Nó tìm kiếm các biểu tượng gỡ lỗi với một chỉ mục cụ thể được gọi là com_apple_xcode_dsym_uuids
. Bạn có thể tự thực hiện tìm kiếm này:
mdfind 'com_apple_xcode_dsym_uuids = *'
tôn trọng.
mdfind "com_apple_xcode_dsym_uuids == AA5E633E-FDA8-346C-AB92-B01320043DC3"
Lệnh gọi spotlight đầu tiên cung cấp cho bạn tất cả các gói dSYM được lập chỉ mục và gói thứ hai cung cấp cho bạn các .dSYM
gói có UUID cụ thể. Nếu spotlight không tìm thấy .dSYM
gói của bạn thì symbolicatecrash
cũng không. Nếu bạn làm tất cả những thứ này, ví dụ như trong thư mục con của ~/Desktop
ánh đèn sân khấu của bạn sẽ có thể tìm thấy mọi thứ.
Nếu symbolicatecrash
tìm thấy .dSYM
gói của bạn , nên có một dòng như sau symbolicate.log
:
@dsym_paths = ( <SOME_PATH>/example.app.dSYM/Contents/Resources/DWARF/example )
Để tìm .app
gói của bạn, một tìm kiếm nổi bật như sau được gọi bởi symbolicatecrash
:
mdfind "kMDItemContentType == com.apple.application-bundle && (kMDItemAlternateNames == 'example.app' || kMDItemDisplayName == 'example' || kMDItemDisplayName == 'example.app')"
Nếu symbolicatecrash
tìm thấy .app
gói của bạn , nên có trích xuất sau symbolicate.log
:
Number of symbols in <SOME_PATH>/example.app/example: 2209 + 19675 = 21884
Found executable <SOME_PATH>/example.app/example
-- MATCH
Nếu tất cả các tài nguyên đó được tìm thấy bởi symbolicatecrash
nó sẽ in ra phiên bản tượng trưng của nhật ký sự cố của bạn.
Nếu không, bạn có thể chuyển trực tiếp các tệp dSYM và .app.
symbolicatecrash -v --dsym <SOME_PATH>/<App_URI>.app.dSYM/<APP_NAME>.app.dsym <CRASHFILE> <SOME_OTHER_PATH>/<APP_NAME>.app/<APP_NAME> > symbolicate.log
Lưu ý: Backtrace tượng trưng sẽ được xuất ra terminal, không symbolicate.log
.
symbolicatecrash
lệnh, cách sử dụng và cách tìm tệp dSYM cần thiết để thực hiện biểu tượng.