Xcode Debugger: xem giá trị của biến


107

Mã của tôi trong UITableViewController:

delegate.myData = [myData objectAtIndex:indexPath.row];

Làm cách nào tôi có thể xem các giá trị của delegate.myDatahoặc indexPath.rowtrong Trình gỡ lỗi? delegate.myDatanên là một mảng và indexPath.rowmột int. Tôi chỉ có thể thấy địa chỉ bộ nhớ của các đối tượng delegate, indexPathnhưng ở đâu myDatarow?

văn bản thay thế

Câu trả lời:


142

Đánh dấu vào mục này Làm cách nào để xem nội dung của biến NSDictionary trong trình gỡ lỗi Xcode?

Tôi cũng dùng

po variableName
print variableName

trong Bảng điều khiển.

Trong trường hợp của bạn, nó có thể thực thi

print [myData objectAtIndex:indexPath.row]  

hoặc là

po [myData objectAtIndex:indexPath.row]

Cảm ơn bạn! Tôi đã thử rất nhiều: "print [myData objectAtIndex: indexPath.row]", "po [myData objectAtIndex: indexPath.row]", "print indexPath.row", "po indexPath.row", ... Nhưng mỗi lần tôi nhận được thông báo "Không có thành viên có tên hàng." Điều này hoạt động: "print indexPath" và "po indexPath". Vì vậy, tôi đã thử sử dụng "[]" thay cho ".": "Po [indexPath row]" -> "Không thể in mô tả của đối tượng NIL." "po [indexPath getRow]" -> "Target không phản hồi bộ chọn thông báo này." :-(
Manni

4
thử print (int) [hàng indexPath]
Andriy

po [myData objectAtIndex: (int) [indexPath row]]
Andriy

@VanDuTran Tôi khá chắc chắn rằng tương đương với po objtrong nhanh là po print(obj).
Chris

Điều này cũng hoàn hảo để tìm kiếm các giá trị của thuộc tính được tính toán. Cảm ơn!
Paula Hasstenteufel

25

Tôi đồng ý với các áp phích khác rằng Xcode là một môi trường đang phát triển nên bao gồm một cách dễ dàng để gỡ lỗi các biến. Vâng, tin tốt, có một!

Sau khi tìm kiếm và không tìm thấy câu trả lời / hướng dẫn đơn giản về cách gỡ lỗi các biến trong Xcode, tôi đã đi khám phá với chính Xcode và thấy điều này (ít nhất là đối với tôi) khám phá rất hữu ích.

Cách dễ dàng gỡ lỗi các biến của bạn trong Xcode 4.6.3

Trong màn hình chính của Xcode, hãy đảm bảo bạn thấy Khu vực gỡ lỗi dưới cùng bằng cách nhấp vào nút góc trên bên phải được hiển thị trong ảnh chụp màn hình.

Nút Khu vực gỡ lỗi

Khu vực gỡ lỗi trong Xcode 4.6.3

Bây giờ, hãy đặt Điểm ngắt - dòng trong mã của bạn nơi bạn muốn chương trình của mình tạm dừng, bằng cách nhấp vào đường viền của Vùng mã của bạn.

Điểm ngắt

Bây giờ trong Khu vực gỡ lỗi, hãy tìm các nút này và nhấp vào nút ở giữa. Bạn sẽ nhận thấy khu vực của bạn bây giờ được chia làm hai.

Khu vực gỡ lỗi tách

Nên trông như thế này

Bây giờ hãy chạy ứng dụng của bạn.

Khi đạt đến Điểm ngắt đầu tiên trong quá trình thực hiện chương trình của bạn, bạn sẽ thấy ở bên trái tất cả các biến của bạn có sẵn tại điểm ngắt đó.

Trường tìm kiếm

Bạn có thể mở rộng các mũi tên bên trái trên biến để có chi tiết hơn. Và thậm chí sử dụng trường tìm kiếm để cô lập biến đó mà bạn muốn và xem nó thay đổi theo thời gian thực khi bạn "Bước vào" phạm vi của Breakpoint.

Bước vào

Ở phía bên phải của Vùng gỡ lỗi, bạn có thể gửi để in các biến như bạn muốn bằng cách nhấp chuột phải vào biến mong muốn.

Menu ngữ cảnh

Như bạn có thể thấy, menu ngữ cảnh đó có đầy đủ các tùy chọn gỡ lỗi rất thú vị. Chẳng hạn như Watch đã được đề xuất với các lệnh đã nhập hoặc thậm chí Chỉnh sửa Giá trị… thay đổi giá trị thời gian chạy của biến của bạn!


21

Bạn cũng có thể:

  1. Đặt một điểm ngắt để tạm dừng việc thực thi.
  2. Đối tượng phải nằm trong phạm vi thực thi
  3. Di chuyển con trỏ chuột qua đối tượng hoặc biến
  4. Chú giải công cụ màu vàng sẽ xuất hiện
  5. Di chuyển chuột qua chú giải công cụ
  6. Nhấp vào hai mũi tên nhỏ trỏ lên và xuống
  7. Một menu ngữ cảnh sẽ bật lên
  8. Chọn "Mô tả in", nó sẽ thực thi [mô tả đối tượng]
  9. Mô tả sẽ xuất hiện trong đầu ra của bảng điều khiển

IMHO hơi ẩn và rườm rà ...


Trong xcode "Print Description" của tôi không hoạt động, vậy làm cách nào để kích hoạt nó?
Kirtikumar A.

@kirtiavaiya ứng dụng phải tạm dừng và biến của bạn cần phải nằm trong phạm vi hiện tại mới được in. Ngoài ra, bạn không thể in trực tiếp "self.variable", nhưng bạn có thể sử dụng giải pháp Andriy để in _ <tên của biến>. Ví dụ: cho self.btnHello viết trong bảng điều khiển "po _btnHello" (điều này chỉ hoạt động nếu bạn chưa thay đổi tên của phương thức getter)
LightMan

@LightMan có, nó như bạn đã nói, nhưng sau đó nó cũng không hoạt động
Kirtikumar A.

10

Sự nhầm lẫn của bạn bắt nguồn từ thực tế là các thuộc tính được khai báo không (nhất thiết phải được đặt tên giống như) biến (instance).

Cuộc thám hiểm

indexPath.row

tương đương với

[indexPath row]

và nhiệm vụ

delegate.myData = [myData objectAtIndex:indexPath.row];

tương đương với

[delegate setMyData:[myData objectAtIndex:[indexPath row]]];

giả sử đặt tên tiêu chuẩn cho các thuộc tính tổng hợp.

Hơn nữa, delegatecó lẽ được khai báo là thuộc loại id<SomeProtocol>, tức là, trình biên dịch không thể cung cấp thông tin về loại thực tế delegatetại thời điểm đó và trình gỡ lỗi đang dựa vào thông tin được cung cấp tại thời điểm biên dịch. Vì idlà kiểu chung nên không có thông tin thời gian biên dịch về các biến phiên bản trong delegate.

Đó là những lý do tại sao bạn không thấy myDatahoặc rowdưới dạng các biến.

Nếu bạn muốn kiểm tra kết quả của việc gửi -rowhoặc -myData, bạn có thể sử dụng các lệnh phoặc po:

p (NSInteger)[indexPath row]
po [delegate myData]

hoặc sử dụng cửa sổ biểu thức (ví dụ: nếu bạn biết của mình delegatethuộc loại thực tế MyClass *, bạn có thể thêm biểu thức (MyClass *)delegatehoặc nhấp chuột phải delegate, chọn View Value as…và nhập loại thực tế của delegate(ví dụ MyClass *).

Điều đó đang được nói, tôi đồng ý rằng trình gỡ lỗi có thể hữu ích hơn:

  • Có thể có một tùy chọn để thông báo cho cửa sổ trình gỡ lỗi sử dụng thông tin loại thời gian chạy thay vì thông tin thời gian biên dịch. Nó sẽ làm chậm trình gỡ lỗi, nhưng sẽ cung cấp thông tin hữu ích;

  • Các thuộc tính đã khai báo có thể được hiển thị trong một nhóm được gọi là thuộc tính và cho phép kiểm tra (tùy chọn) trực tiếp trong cửa sổ trình gỡ lỗi. Điều này cũng sẽ làm chậm trình gỡ lỗi vì yêu cầu gửi thông báo / thực thi một phương thức để lấy thông tin, nhưng cũng sẽ cung cấp thông tin hữu ích.


Cảm ơn bạn đã giải thích của bạn! Điều này đã giúp tôi rất nhiều! :-)
Manni

7

Bạn có thể in các giá trị lên cửa sổ bảng điều khiển tại thời điểm chạy. Dưới đây là các bước:

  1. Đặt một điểm ngắt mà bạn muốn nhận các giá trị
  2. Bây giờ thực hiện gỡ lỗi từng bước.
  3. Đặt con trỏ vào biến / đại biểu có giá trị sẽ được kiểm tra tại thời điểm chạy.
  4. Bây giờ nó sẽ hiển thị mô tả về biến / ủy nhiệm
  5. Nhấp vào "i" sẽ hiển thị mô tả chi tiết
  6. Thao tác này cũng sẽ in chi tiết lên cửa sổ giao diện điều khiển.

Ảnh chụp màn hình để in chi tiết trên cửa sổ bảng điều khiển


1
Điều này có hoạt động nhanh chóng không, tôi mới làm quen với nhanh chóng không thể nhìn thấy các giá trị của đối tượng như chúng ta sử dụng để xem trong obj c.
umairhhhs

1
@umairhhhs Bài đăng này chỉ dành cho Objective-C.
Jayprakash Dubey

1
Tôi tự hỏi tại sao điều này không có trong trình chỉnh sửa nhanh vì đó là tính năng rất hữu ích và tiết kiệm thời gian.
umairhhhs

1

Điều này hơi phức tạp. Các đối tượng này là các lớp hoặc cấu trúc tùy chỉnh và việc nhìn vào bên trong chúng không dễ dàng trên Xcode như trong các môi trường phát triển khác.

Nếu tôi là bạn, tôi sẽ NSLog những giá trị bạn muốn thấy, với một số mô tả.

I E:

NSLog(@"Description of object & time: %i", indexPath.row);

11
Có, NSLog là một khả năng nhưng không phải là một sự thay thế thoải mái cho việc gỡ lỗi. Tôi rất ngạc nhiên rằng không có cách nào để hiển thị các giá trị mong muốn. Điều đó thuộc về chức năng cơ bản của môi trường phát triển.
Manni

2
Điều tức giận nhất về XCode. Thật đáng thương.
ryan0

1

Thử Run-> Show-> Expressions

Nhập tên của mảng hoặc bất kỳ tên nào bạn đang tìm kiếm.


Cảm ơn bạn! Tôi đã nhập "indexPath.row" và "Delegate.myData" trong cửa sổ biểu thức nhưng lần nào cũng xuất hiện "ngoài phạm vi" trong cột "Tóm tắt" :-(
Manni

np, tôi đã gặp vấn đề tương tự cho đến khi tôi tìm thấy nó;)
tbone

1
đặt một điểm ngắt ngay sau khi bạn đặt mảng của mình hoặc bất cứ thứ gì và bạn sẽ tìm thấy giá trị trong Biểu thức. Chúc may mắn
tbone
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.