Làm cách nào để kiểm tra lỗi tràn Stack trong ứng dụng nhúng?


8

Tôi đã gặp phải một vấn đề mà tôi tin rằng ngăn xếp của tôi đang tràn ra. Lý do tôi có khuynh hướng nghĩ theo cách này, là do những điều sau đây:

1) Biên dịch mã, đổ vào thiết bị: - không có hoạt động nào từ thiết bị (Tôi đang mong đợi thông báo 'Tôi còn sống')
2) Trong tình huống này, tôi đã tăng kích thước ngăn xếp thêm 10 byte, được biên dịch lại và đổ vào thiết bị, và vấn đề đã biến mất
3) Đã thử hai bước trên 10 lần, qua lại và có thể tái tạo vấn đề một cách đáng tin cậy và khắc phục nó một cách đáng tin cậy.

Tôi muốn xem ngăn xếp rơi xuống, làm thế nào để tôi làm điều này?

Tôi hiện đang sử dụng Vi điều khiển M16, với RAM 2K (còn lại 30 byte), kích thước ngăn xếp 256 byte. Bàn làm việc IAR mà tôi đang sử dụng, không có tiện ích biểu đồ cuộc gọi.

Có những cách khác để làm điều này - kiểm tra ngăn xếp rơi xuống và bao nhiêu trong mã?

Bất kỳ trợ giúp sẽ thực sự được đánh giá cao.

Cảm ơn!


Bạn có một trình giả lập cho chip mà bạn có thể (bước) chạy mã trong không?
XtL

Câu trả lời:


7

Một cách phổ biến để kiểm tra việc sử dụng bộ nhớ là nạp trước bộ nhớ với giá trị không đổi trước khi chương trình của bạn chạy. ví dụ: một chuỗi 0xde 0xad có thể được ghi ra khu vực ngăn xếp của bạn bằng mã khởi động của bạn. Trong quá trình hoạt động của chương trình, ngăn xếp sẽ phát triển và viết lên các chuỗi này. Nếu sau đó bạn có khả năng kiểm tra bộ nhớ, thì bạn có thể dễ dàng thấy các byte 0xde 0xad chưa được xử lý trong bộ nhớ và do đó xác định số lượng ngăn xếp đã được sử dụng.

Thông thường rất khó để phát hiện tràn vì nó xảy ra do các địa chỉ trả lại cuộc gọi chức năng được lưu trữ trên ngăn xếp và bất kỳ trả về chức năng nào sẽ gửi chương trình đi vào đám cỏ dại. Trong trường hợp này, nếu cơ quan giám sát của bạn được bật và bạn có thể đặt điểm dừng ở vectơ đặt lại, bạn vẫn có thể kiểm tra bộ nhớ và tìm các byte tiền xử lý của mình để xác định xem đây có phải là nguyên nhân gây ra thiết lập lại không.


1
Đó sẽ không phải là 'Cảm ơn ngăn xếp'? ;)
ducksauz

hahaha Đúng rất đúng. : P
IntelliChick

3

Tạo một biến nằm ở trên cùng (hoặc dưới cùng) của ngăn xếp của bạn. Khởi tạo biến ở đầu chính. Bạn có thể kiểm tra giá trị của biến trong vòng lặp chính để xem thực tế là ngăn xếp đã bị tràn. Hoặc nếu trình gỡ lỗi của bạn cho phép, hãy đặt điểm dừng khi biến đó được viết. Nó chỉ nên được viết khi nó được khởi tạo.


0

Có một số chương trình có thể làm phân tích tĩnh. Bạn có thể nhận được một số thông tin bằng Splint , vì nó kiểm tra các vấn đề khi sử dụng mã nguồn của bạn. Tôi nghĩ rằng nó không kiểm tra các vấn đề ngăn xếp, nhưng có thể cung cấp cho bạn một số hiểu biết về vấn đề.

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.