2011-01-28 55 views
45

Tôi đang làm việc trên một ứng dụng iPhone. Tôi là một nhà phát triển Java toàn thời gian và tôi đã quen với việc sử dụng Eclipse, nơi tôi có thể đặt một điểm ngắt và dừng quá trình. Sau đó, tôi có thể gõ vào bất kỳ biểu thức nào mà tôi muốn và Eclipse sẽ đánh giá nó bằng cách sử dụng các giá trị từ điểm đó trong tiến trình.Xcode đánh giá các biểu thức trong khi gỡ lỗi

Có cách nào để thực hiện điều đó trong Xcode không? Tôi muốn có thể dừng lại ở điểm ngắt và sau đó nhập một số mã để đánh giá nó. Bàn điều khiển gdb sẽ cho phép tôi làm po (print-object), nhưng nó thực sự bị hạn chế. Bất kỳ giúp đỡ?

+0

"po" là gì? Bảng điều khiển gdb sẽ cho phép bạn đánh giá một tập hợp lớn các hàm tùy ý. Điều gì đặc biệt mà bạn đang cố gắng làm? –

+3

"po" là đối tượng in. Đó là phần mở rộng của Apple cho gcc mà kết quả trong thông điệp * description * được gửi tới một cá thể ObjC để nó trả về mô tả của nó. – diciu

+0

Ah, đó là lý do tại sao tôi không nghe nói về nó. Vui vẻ. –

Trả lời

40

thực hành của tôi:

po [NSUserDefaults standardUserDefaults]

hiển thị: < NSUserDefaults: 0x6143040>

po [[NSUserDefaults standardUserDefaults] stringForKey:@"Currency"]

hiển thị: "CHF"

+3

Đây là câu trả lời duy nhất thực sự trả lời câu hỏi. Peter đang đề nghị bạn sử dụng lệnh 'po' tại dấu nhắc' (lldb) 'có sẵn trong bảng điều khiển gỡ rối khi việc thực thi bị dừng bởi điểm ngắt trình gỡ lỗi. Các poster ban đầu chỉ ra rằng họ đã sử dụng 'po', nhưng ít nhất đây là một nỗ lực trả lời câu hỏi. –

+1

Ít nhất đây là câu trả lời –

3

Không một đặt câu hỏi về Xcode, nhưng Mã số Ứng dụng của JetBrains thực hiện điều này theo cách IDE chuẩn mà hầu hết chúng ta đều biết từ các nền tảng khác.

+0

Điều này không trả lời câu hỏi về Xcode, nhưng không có gì sai với một khách hàng tiềm năng trên một IDE khác. Cảm ơn bạn. –

14

Sử dụng lệnh "biểu thức" trong trình gỡ lỗi. Sử dụng nó tương đối đơn giản. Chỉ cần gõ biểu thức lệnh và nhấn Enter. Sau đó bạn sẽ được nhắc nhập một biểu thức. Dưới đây là ví dụ

(lldb) expression 
Enter expressions, then terminate with an empty line to evaluate: 
2+2 

(int) $2 = 4 

Tôi cũng đính kèm thông tin trợ giúp cho lệnh biểu thức bên dưới. Hi vọng điêu nay co ich.

Đánh giá biểu thức C/ObjC/C++ trong ngữ cảnh chương trình hiện tại, sử dụng người dùng các biến và biến được xác định hiện có trong phạm vi. Lệnh này mất đầu vào 'thô' (không cần trích dẫn nội dung).

Cú pháp: biểu hiện -

lệnh Tùy chọn Cách sử dụng: biểu [-f] [G] [-a] [-d] [-t] [-u] - biểu [-o ] [-a] [-d] [-t] [-u] - biểu

-G <gdb-format> (--gdb-format <gdb-format>) 
     Specify a format using a GDB format specifier string. 

    -a <boolean> (--all-threads <boolean>) 
     Should we run all threads if the execution doesn't complete on one 
     thread. 

    -d <boolean> (--dynamic-value <boolean>) 
     Upcast the value resulting from the expression to its dynamic type 
     if available. 

    -f <format> (--format <format>) 
     Specify a format to be used for display. 

    -o (--object-description) 
     Print the object description of the value resulting from the 
     expression. 

    -t <unsigned-integer> (--timeout <unsigned-integer>) 
     Timeout value for running the expression. 

    -u <boolean> (--unwind-on-error <boolean>) 
     Clean up program state if the expression causes a crash, breakpoint 
     hit or signal. 

Timeouts: Nếu biểu thức có thể được đánh giá tĩnh (không runnning code) sau đó nó sẽ được. Nếu không, theo mặc định, cụm từ sẽ chạy trên chuỗi hiện tại với thời gian chờ ngắn: hiện tại là 0,25 giây. Nếu nó không trở lại trong thời gian đó, việc đánh giá sẽ bị gián đoạn và tiếp tục với tất cả các chuỗi đang chạy. Bạn có thể sử dụng tùy chọn -a để tắt tính năng thử lại trên tất cả các chủ đề . Bạn có thể sử dụng tùy chọn -t để đặt thời gian chờ ngắn hơn.

Biến do người dùng xác định: Bạn có thể xác định các biến của riêng mình để thuận tiện hoặc được sử dụng trong các biểu thức tiếp theo. Bạn xác định chúng giống như cách bạn định nghĩa biến trong C. Nếu ký tự đầu tiên của biến do người dùng xác định là $, thì giá trị của biến sẽ có sẵn trong các biểu thức trong tương lai, nếu không nó sẽ chỉ có sẵn trong biểu thức hiện tại .

Ví dụ:

expr my_struct->a = my_array[3] 
    expr -f bin -- (index * 8) + 5 
    expr unsigned int $foo = 5 
    expr char c[] = "foo"; c[0] 

LƯU Ý QUAN TRỌNG: Bởi vì lệnh này có đầu vào 'thô', nếu bạn sử dụng bất kỳ tùy chọn lệnh bạn phải sử dụng '-' giữa cuối các tùy chọn lệnh và đầu của đầu vào thô.

63

Trong XCode 4.0, đây là loại ẩn trong GUI. Khi bạn đang ở một điểm ngắt, bạn có thể thấy Chế độ xem biến bên trong Vùng gỡ lỗi; đó là cửa sổ hiển thị các biến cục bộ và như vậy. Nhấp chuột phải vào Chế độ xem biến và chọn "Thêm biểu thức ..."

Tôi nhận thấy đây là một chuỗi cũ nhưng nó vẫn là một hit Google hàng đầu nên tôi nghĩ nó đáng trả lời.

+0

Đây là câu trả lời có liên quan ngay bây giờ. Cảm ơn –

+0

Rất tuyệt! Không thể tin rằng tùy chọn này bị ẩn quá sâu –

+2

Điều này xứng đáng được nhiều phiếu bầu hơn! –

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