Cách sử dụng điểm dừng để gỡ lỗi


9

Điểm dừng là một cách tuyệt vời để xem trình biên dịch chạy đến mã của bạn. Bây giờ câu hỏi của tôi là, có khả năng sử dụng các điểm dừng khi bạn gỡ lỗi mã của mình không?

Câu trả lời:


9

Như đã lưu ý trong câu trả lời của Majenko, Arduino IDE không cung cấp cơ chế điểm dừng nhưng Atmel Studio không hỗ trợ các điểm dừng . [*]

Tuy nhiên, nếu bạn có công tắc và đèn LED, bạn có thể theo dõi tiến trình của chương trình theo cách cung cấp một số lợi ích của điểm dừng. Bạn sẽ thêm một chương trình con, BPReport()thông qua đầu ra nối tiếp hoặc màn hình LCD báo cáo các giá trị của các biến quan trọng, sau đó bật đèn LED và đợi cho đến khi công tắc được nhấn và nhả ra, cùng với việc gỡ lỗi. Gọi cho BPReport()thói quen của bạn bất cứ nơi nào bạn muốn một điểm dừng vô điều kiện. Đối với các điểm dừng có điều kiện, bạn có thể có một thói quen BPReportIf(cond)gọi BPReport()nếu condlà đúng. Nếu bạn không muốn xuất qua nối tiếp, bạn có thể sử dụng một số đèn LED hoặc LCD và bạn có thể sử dụng một số công tắc nếu bạn muốn điều khiển ngắt ngoài (ví dụ: condcó thể là một thử nghiệm của một trong các công tắc phụ).

[*] Một số trình gỡ lỗi phần cứng sửa đổi mã đã tải xuống mỗi lần điểm dừng được thêm, thay đổi hoặc xóa. Việc sử dụng đó sẽ làm hao mòn bộ nhớ flash nhanh hơn so với việc thỉnh thoảng tải xuống nó. Nếu một con chip đã được sử dụng nhiều cho việc gỡ lỗi như vậy, đừng sử dụng con chip đó trong một hệ thống sản xuất.


4

Mặc dù Majenko câu trả lời của ông là đúng, có một số lựa chọn khác.

Đối với việc gỡ lỗi phần cứng thực sự như đã nêu của majenko tôi sẽ nói:

  1. Cài đặt và sử dụng một IDE thực, chẳng hạn như Atmel Studio hoặc plugin nhật thực arduino có tên là sloeber (Tôi là tác giả) và
  2. Sử dụng trình gỡ lỗi phần cứng hoặc phần cứng đầy đủ có trên bo mạch như Arduio zero hoặc phần cứng sử dụng công nghệ gỡ lỗi khác như ESP8266 cho phép gỡ lỗi USB

Một tùy chọn gỡ lỗi khác từ một danh mục hoàn toàn khác là tổ chức mã của bạn sao cho logic quyết định (độc lập với phần cứng) và hành động (phụ thuộc vào phần cứng) được tách biệt hoàn toàn.

Sau đó biên dịch bản phác thảo của bạn dưới dạng một chương trình cục bộ và gỡ lỗi "logic quyết định" trên máy cục bộ của bạn. Phương pháp này không cho phép "gỡ lỗi phần cứng". Phương pháp này cũng cho phép thử nghiệm đơn vị.

Lưu ý rằng máy cục bộ của bạn có thể là 32 hoặc 64 đắng và hầu hết Arduino là 8 lỗi, điều này sẽ dẫn đến sự khác biệt về kiểu dữ liệu là một điểm chú ý thêm khi sử dụng phương pháp này.


4

Các Arduino-Debug thư viện cung cấp một đơn giản trên mục tiêu debugger cho bản phác thảo Arduino. Lệnh gỡ lỗi được thêm trực tiếp vào bản phác thảo. Một shell lệnh gỡ lỗi được bắt đầu trên các điểm dừng và xác nhận.

nhập mô tả hình ảnh ở đây

Ảnh chụp màn hình ở trên cho thấy bản phác thảo ví dụ chạy trên Arduino Mega với màn hình đầu ra Nối tiếp được sử dụng bởi ứng dụng và Serial1 được sử dụng cho trình gỡ lỗi.

Các lệnh gỡ lỗi phác thảo

  • ASSERT (cond) Kiểm tra điều kiện khẳng định. Nếu sai, vỏ gỡ lỗi được gọi. Bản phác thảo không thể tiếp tục.
  • BREAKPOINT () Vỏ gỡ lỗi được gọi.
  • BREAK_IF (cond) Shell gỡ lỗi được gọi nếu điều kiện là đúng.
  • CHECK_STACK (phòng) Kiểm tra xem có phòng (byte) trên ngăn xếp không. Nếu sai, vỏ gỡ lỗi được gọi.
  • DEBUG_STREAM (dev) Sử dụng thiết bị luồng đã cho cho phiên gỡ lỗi. Điển hình là nối tiếp.
  • OBSERVE (expr) In biểu thức sang luồng gỡ lỗi.
  • OBSERVE_IF (cond, expr) In biểu thức sang luồng gỡ lỗi nếu điều kiện là đúng.
  • ĐĂNG KÝ (var) Đăng ký một biến để truy cập từ trình gỡ lỗi. Lệnh gỡ lỗi Shell

Lệnh gỡ lỗi Shell

  • ? BIỂU TƯỢNG In địa chỉ và giá trị biến.
  • @VARIABLE In địa chỉ biến con trỏ và giá trị tham chiếu.
  • backtrace In ngăn xếp cuộc gọi đơn giản.
  • lệnh In danh sách các lệnh (xem thêm trợ giúp).
  • dữ liệu In nội dung của vùng dữ liệu, tức là các biến toàn cục.
  • đi Để lại vỏ gỡ lỗi và tiếp tục thực hiện bản phác thảo.
  • heap In nội dung của heap, tức là dữ liệu được phân bổ động.
  • trợ giúp In danh sách các lệnh.
  • bộ nhớ In trạng thái bộ nhớ.
  • bỏ bản phác thảo.
  • stack In nội dung của stack, tức là gọi khung, đối số, trả về địa chỉ.
  • biến in Danh sách các biến đã đăng ký.
  • trong đó In tệp mã nguồn và dòng nơi trình gỡ lỗi được gọi.

Tất cả các lệnh shell gỡ lỗi có thể được viết tắt thành các lệnh ký tự đơn. Vui lòng xem README để biết thêm chi tiết; chi tiết cài đặt, ví dụ phác thảo và điểm chuẩn.


1
Thư viện được tặng của Mikael cho phép bạn đặt các điểm dừng có điều kiện, in các giá trị của biến, trạng thái bộ nhớ, theo dõi cuộc gọi và kiểm tra các biến và thay đổi ở điểm dừng. Pro: Không cần phần cứng ($$), không quá khó với Flash (như cài đặt và xóa các điểm dừng với trình gỡ lỗi phần cứng sẽ). ....
JRobert

1
.... Con: Tác động cao hơn đến không gian mã của chương trình, một số dung lượng RAM và có thể là thời gian chạy, nếu kiểm tra mã thời gian quan trọng; một số đường cong học tập để biên dịch (và sau đó, loại bỏ) các cuộc gọi thư viện; sự cần thiết phải dự đoán các vị trí điểm dừng hoặc biên dịch lại chúng khi bạn khám phá nơi bạn cần chúng. Nhược điểm không phải là một chỉ trích về công việc của Mikael; họ đi kèm với kỹ thuật này.
JRobert

1
@JRobert Tóm tắt Pro-Con đẹp! Tôi đã cố gắng giải quyết một số Nhược điểm bằng cách cho phép trình gỡ lỗi được điều chỉnh. Có một bộ định nghĩa sẽ cho phép các ứng dụng nhạy cảm với dấu chân giảm mức độ gỡ lỗi xuống mức tối thiểu. Vì bất kỳ trình gỡ lỗi nào cho các hệ thống nhúng, rất khó để gỡ lỗi mã thời gian quan trọng (liên tục) với các điểm dừng. Thay thế duy nhất là các điểm quan sát. Chúng có thể được tối ưu hóa bằng cách sử dụng bộ đệm theo dõi và loại bỏ đầu ra nối tiếp trong mã thời gian quan trọng.
Mikael Patel

3

Không có trong Arduino IDE.

Bạn cần phải:

  1. Cài đặt và sử dụng một IDE thực, chẳng hạn như Atmel Studio, và
  2. Sử dụng trình gỡ lỗi phần cứng đầy đủ

Không có điều khoản để gỡ lỗi thông qua giao diện UART / USB bằng bộ tải khởi động.

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.