2012-05-14 20 views
13

Tôi gặp sự cố khi kết hợp bù trừ trong dấu vết ngăn xếp của các bãi tai nạn iOS với bù đắp trong việc tháo gỡ nhị phân dưới dạng đầu ra bởi otool.Kết hợp bù đắp trong vùng đổ vỡ iOS để tháo rời nhị phân

Ai đó có thể xác nhận về nguyên tắc tôi khớp với những nguyên tắc này. Ví dụ, nếu tôi nhận được một dòng trong đổ sụp đổ:

0 myapp 0x00005b0a 0x1000 + 19210 

Tôi mong chờ sự bù đắp của lệnh vi phạm trong file nhị phân là 0x5b0a, 0x4b0a .... hay cái gì khác?

Trong giải mã của các thông tin tiêu đề, otool cũng đưa ra, ví dụ, thông tin này (mã thực sự bắt đầu tại 0x0000224c bù đắp trong file):

Section 
    sectname __text 
    segname __TEXT 
     addr 0x0000224c 
     size 0x00063ad2 
    offset 4684 
    align 2^2 (4) 
    reloff 0 
    nreloc 0 
     type S_REGULAR 
attributes PURE_INSTRUCTIONS SOME_INSTRUCTIONS 
reserved1 0 
reserved2 0 

Vì vậy, tôi đã không chắc chắn 100% Tôi đã giải thích điều này một cách chính xác, nhưng có vẻ như đang nói rằng mã, tại + 0x224c trong tệp, kết thúc ở độ lệch 0x124c trong bộ nhớ, nhưng sau đó tôi đã không chắc chắn chính xác cách trang bị này, ví dụ, vị trí 0x1000.

Vấn đề tôi đưa ra là 0x5b0a, không có lệnh 0x4b0a hay 0x6b0a như hướng dẫn thực tế trong câu hỏi (kể cả thực tế ví dụ: 't trỏ đến hướng dẫn chi nhánh).

(Tôi biết rằng, ít nhất là trên các hóa thân trước đó của ARM, có sự khác biệt giữa giá trị của máy tính và địa chỉ bộ nhớ tương ứng do đường ống dẫn. Tôi đã giả định. vào tài khoản trong các lỗi được báo cáo trong bãi đổ vỡ, hoặc ở bất kỳ mức nào, tôi sẽ thấy lệnh chi nhánh được đề cập đến một vài hướng dẫn ở hai bên đã chỉ ra nếu sự khác biệt đó không được tính đến ...)

Ai có thể làm sáng tỏ không?

+0

Có lý do nào bạn không thể chỉ đơn giản là biểu tượng không? http://stackoverflow.com/questions/3832900/how-to-manually-symbolicate-ios-crash-to-view-crash-logs/8648232#8648232 –

+2

Tôi không thể * đơn giản * biểu tượng vì tôi không có tệp biểu tượng (mã được biên soạn bởi bên thứ ba). Tuy nhiên, nếu đó là lựa chọn duy nhất thì tôi đoán tôi sẽ phải hỏi xem họ có thể cung cấp tệp biểu tượng hay không. Vì vậy, nó là nhiều hơn rằng nếu có một cách để tôi tính toán bù đắp, đó là một quá trình nhanh hơn cho tôi trong trường hợp cụ thể này. –

Trả lời

2

Với điều kiện myapp không loại bỏ các biểu tượng, bạn sẽ có thể sử dụng atos.

Bạn có thể luôn man atos để biết thêm chi tiết nhưng điều này nên là đủ cho vấn đề của bạn:

-o symbol_file # debugging information output by the compiler this may be a dSYM or the binary itself depending on who you saved symbol information 
-l load address # the base address in the process space at which your library is loaded into the springboard process (Looks like 0x1000) 
Also a list of addresses you wish to symbolicate 

Usage: 
    atos -o myapp -l 0x1000 0x00005b0a 0x0005bca ... etc 

Đó đầu ra phải là một danh sách tên biểu tượng để các thiết bị đầu cuối. Một lần nữa, điều này yêu cầu rằng myapp không có biểu tượng bị tước.

+0

Cảm ơn bạn - điều này đã làm việc một điều trị chỉ với nhị phân (mà thực sự không có biểu tượng bị loại bỏ). –

4

Thêm địa chỉ ảo của đoạn __TEXT vào địa chỉ tương đối được đưa ra trong vùng đổ sụp. Kết quả là địa chỉ tìm kiếm trong quá trình tháo gỡ. Dưới đây là các bước:

  1. Sử dụng otool -lv <application-binary> để đổ các lệnh tải từ ứng dụng nhị phân. Tìm lệnh tải cho phân đoạn __TEXT và giá trị được liên kết cho vmaddr, thường là 0x1000. Bạn không cần thông tin về phần __text được hiển thị ở trên, chỉ thông tin về phân đoạn .

  2. Trong bãi chứa sự cố, địa chỉ trong ngăn xếp cuộc gọi được cung cấp theo biểu mẫu 0x00124ff4 0xf4000 + 200692. Phần cuối cùng là phần bù trong số nhị phân trong số thập phân. Thêm giá trị này vào giá trị thu được trong bước 1 và chuyển đổi sang thập lục phân. Trong ví dụ này, chúng tôi sẽ tính toán 0x1000 + 200692 trong đó là 0x31ff4 trong hex.

  3. Sử dụng otool -tV <application-binary> để hủy phân tách cho ứng dụng nhị phân. Xác định địa chỉ thu được ở bước 2 (0x31ff4 trong ví dụ này). Đối với khung trên cùng của ngăn xếp cuộc gọi, đây là nơi ứng dụng bị lỗi. Đối với tất cả các cấp khác, tại địa chỉ được tính toán phải là lệnh chi nhánh tương ứng với cấp cao hơn tiếp theo trong ngăn xếp.