2009-02-18 36 views
6

Tôi vừa gặp sự cố trong đó tràn ngăn xếp trong chương trình C++ có luồng trên HPUX đã gây ra SEGV_MAPERR khi đối tượng địa phương cố gọi một thủ tục rất đơn giản. Tôi đã bối rối một lúc, nhưng may mắn là tôi đã nói chuyện với một người nhận ra đây là vấn đề kích thước ngăn xếp và chúng tôi có thể khắc phục sự cố bằng cách tăng kích thước ngăn xếp có sẵn cho chuỗi.Các triệu chứng của tràn ngăn xếp trong chương trình C++ là gì?

Làm thế nào tôi có thể nhận ra khi ngăn xếp tràn? Các triệu chứng có khác nhau trên windows/linux/hpux không?

+0

Điều đó thật thú vị ... thẻ stackoverflow sẽ phù hợp, ngoại trừ không ai sử dụng thẻ đó cho các luồng tràn thực tế. –

+0

Vâng, tôi đã tự hỏi ai là joker người đã đưa lên thẻ stackoverflow. :-) –

+1

Thật khó để tìm kiếm thông tin tràn ngăn xếp thực tế trên trang này ... – Plasmer

Trả lời

2

Làm thế nào tôi có thể nhận ra khi ngăn xếp tràn?

Nếu bạn biết kích thước ngăn xếp, nơi ngăn xếp bắt đầu và hướng nó phát triển trong bộ nhớ, bạn có thể chỉ cần kiểm tra địa chỉ của stack pointer và xem liệu nó có kết thúc ngăn xếp hay không. C++ không cho phép truy cập trực tiếp vào con trỏ ngăn xếp. Bạn có thể dễ dàng viết một hàm nhỏ trong assembly để thực hiện phân tích này và liên kết nó vào chương trình của bạn.

+0

Kiểm tra con trỏ ngăn xếp có vẻ hữu ích khi biết liệu lỗi được đề cập là tràn ngăn xếp hay một loại tham nhũng bộ nhớ khác. Cảm ơn! – Plasmer

10

Giả sử bạn không ở trên nền tảng sẽ dừng ứng dụng của bạn và nói "tràn ngăn xếp" Tôi nghi ngờ bạn sẽ thấy cùng một hành vi mà bạn sẽ thấy từ bất kỳ loại tràn bộ đệm nào. Ngăn xếp này chỉ là một đoạn bộ nhớ khác cho chương trình của bạn, và nếu bạn đi ra ngoài những giới hạn đó ... chúc may mắn! Ai biết những gì bạn sẽ dẫm lên!

Bạn có thể ghi đè lên nhiệt độ đọc từ CPU, nó có thể là email bạn đang nhập vào Larry, có thể là bit nói rằng hạt nhân bị khóa, gây ra tình trạng bế tắc thú vị! Ai biết.

Đối với C++, không có gì nói cách ngăn xếp nên được đặt ra liên quan đến những thứ khác trong bộ nhớ hoặc điều này thậm chí cần phải là một ngăn xếp!

0

Mã ngoại lệ 0xC00000FD trên Windows.

Thường thì dễ chẩn đoán hơn khi bạn nhận ra SEH của mình ngừng hoạt động.

0

Có lẽ một chút tắt chủ đề, nhưng vấn đề analagous trong Ada (chạy ra khỏi không gian ngăn xếp trong nhiệm vụ) là một lỗi phổ biến "không phổ biến". Nhiều trình biên dịch sẽ ngừng nhiệm vụ (nhưng không phải là nhiệm vụ chính) với ngoại lệ PROGRAM_ERROR.

Nói cách khác, bạn hầu như phải có khả năng ngửi cái này. Nó có xu hướng bắt đầu với một cái gì đó như, "Tôi di chuyển mảng lớn này bên trong nhiệm vụ của tôi, và đột nhiên nó bỏ làm việc".

-1

Văn bản đầu ra thành màn hình được trộn lẫn với các dòng mã từ chương trình đang thử nghiệm. Ngoài ra còn có các lệnh bash trước đó và các văn bản không rõ nguồn gốc khác. Thêm vào tất cả các văn bản chương trình đã bị hỏng.

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