2012-06-20 9 views
6

Gần đây, tôi đã gặp sự cố khi cố biểu tượng nhật ký sự cố của một ứng dụng iOS. Vì một số lý do, UUID của dSYM không được lập chỉ mục trong Spotlight. Sau một số tìm kiếm thủ công và một liều câu thần chú dòng lệnh lành mạnh, tôi đã cố gắng biểu tượng một phần bản ghi sự cố. Lúc đầu, tôi nghĩ rằng dSYM có thể không đầy đủ hoặc một cái gì đó như thế, nhưng sau đó tôi nhận ra rằng các cuộc gọi phương thức thiếu là những cái xảy ra trong mã C++: dự án này là một ứng dụng Objective-C gọi vào thư viện C++ (thông qua Objective-C++) gọi lại mã Objective-C (một lần nữa, thông qua mã Objective-C++). Các cuộc gọi mà tôi đang thiếu là, cụ thể, những cái xảy ra trong đất C++.Có thể tượng trưng cho mã C++ không?

Vì vậy, câu hỏi của tôi là: có cách nào mà quá trình biểu tượng có thể giải quyết các cuộc gọi hàm của mã C++ không? Tôi cần đặt những tùy chọn đặc biệt nào nếu có?

+0

Nó chỉ đơn giản là để lại địa chỉ hoặc nó cung cấp cho bạn một cái gì đó như _ZN7 ...? – C0deH4cker

+0

không, chúng không phải là tên có chức năng bị xáo trộn nếu bạn đề cập đến điều đó. Đó là một địa chỉ cơ sở và một bù đắp: 14 MyApp \t 0x001001bc 0xfe000 + 8636 15 MyApp \t 0x00100174 0xfe000 + 8564 –

+0

nếu bạn 'lldb' ứng dụng của bạn, bạn có thể tháo rời bất kỳ C++ phương pháp theo tên? Bạn có một thư viện tĩnh nhị phân hoặc là bạn biên dịch tất cả mọi thứ trong dự án của bạn? – nielsbot

Trả lời

0

Một chương trình hữu ích đi kèm với sdk táo là atos (địa chỉ biểu tượng). Về cơ bản, đây là những gì bạn muốn làm:

atos -o myExecutable -arch armv7 0x(address here) 

Nó sẽ in tên của biểu tượng tại địa chỉ đó.

+0

Điều đó phù hợp với ObjC. Đối với C + +, tôi nhận được một cái gì đó như: 0x00261588 (trong MyApp) + 465932 –

+0

Đợi, có cách để làm điều đó với gdb ... – C0deH4cker

+0

cảm ơn, nhưng tôi đang sử dụng LLVM mặc dù –

0

Tôi không thạo trong Objective-C, nhưng tôi chắc chắn rằng mã C++ đang được biên dịch bằng các ký hiệu. Đặc biệt, bạn có chắc chắn bao gồm -rdynamic và/hoặc -g khi biên dịch mã C++ không?

+0

Những hình như cờ cho gcc. Bạn có biết cách thực hiện tương tự trong LLVM không? –

+1

Apple sử dụng LLVM làm phụ trợ cho gcc và clang. clang về cơ bản có cùng cờ với gcc. Đảm bảo rằng tất cả các mã của bạn được biên dịch với cấp độ gỡ rối được bật lên đến 3. Sử dụng '-g3'. Bạn cũng có thể muốn vô hiệu hóa tối ưu hóa ('-O0'). – sfstewman

+0

@ sfstewman mức tối ưu hóa không có gì để làm -AFAIK- với biểu tượng sau một vụ tai nạn, mà muốn được tước. Không có '-g3' trong clang, chỉ' -g' –

0

thử

dwarfdump --lookup = 0xYOUR_ADRESS YOUR_DSYM_FILE

bạn sẽ phải tìm kiếm từng địa chỉ bằng tay (hoặc viết một kịch bản để làm điều này) nhưng nếu những biểu tượng là ok (file dSym bạn lớn hơn 20MB) điều này sẽ thực hiện công việc.