2009-02-18 12 views
6

Właśnie napotkałem problem, w którym przepełnienie stosu w wątku programu C++ na HPUX spowodowało SEGV_MAPERR, gdy obiekt lokalny próbował wywołać bardzo prostą procedurę. Przez chwilę byłem zaskoczony, ale na szczęście rozmawiałem z kimś, kto rozpoznał to jako problem z wielkością stosu i mogliśmy rozwiązać problem, zwiększając rozmiar stosu dostępny dla wątków.Jakie są objawy przepełnienia stosu w programie C++?

Jak rozpoznać, kiedy stos przepełnia się? Czy objawy różnią się w Windows/Linux/hpux?

+0

To zabawne ... tag stackoverflow byłby odpowiedni, ale nikt nie używa go do rzeczywistego przepełnienia stosu. –

+0

Tak, zastanawiałem się, kto był jokerem, który umieścił tag stackoverflow. :-) –

+1

Trudno jest znaleźć prawdziwe informacje o przepełnieniu stosu na tej stronie ... – Plasmer

Odpowiedz

2

Jak rozpoznać, kiedy przepełnienie stosu?

Jeżeli znasz rozmiar stosu, w którym rozpoczyna się stosu i kierunek rośnie w pamięci, można po prostu sprawdzić adres stack pointer i sprawdzić, czy poza koniec stosu. C++ nie zezwala na bezpośredni dostęp do wskaźnika stosu. Możesz łatwo napisać małą funkcję w zespole, aby wykonać tę analizę i połączyć ją z programem.

+0

Sprawdzenie wskaźnika stosu wydaje się przydatne, aby stwierdzić, czy omawiany błąd jest przepełnieniem stosu, czy innego rodzaju uszkodzeniem pamięci. Dzięki! – Plasmer

10

Zakładając, że nie korzystasz z platformy, która zatrzyma Twoją aplikację i powie "przepełnienie stosu", podejrzewam, że zobaczysz to samo zachowanie, które można zaobserwować po przepełnieniu bufora. Stos jest po prostu kolejnym, wstępnie przydzielonym fragmentem pamięci dla twojego programu, a jeśli przekroczysz te granice ... powodzenia! Kto wie, na co się natkniesz!

Można napisać odczyt temperatury z procesora, może to być adres e-mail wpisany przez Larry'ego, może to oznaczać, że jądro jest zablokowane, co powoduje zabawne zakleszczenie! Kto wie.

Jeśli chodzi o C++, nic nie mówi o tym, jak należy układać stos w stosunku do innych rzeczy w pamięci lub że ta rzecz musi być nawet stosem!

0

Kod wyjątku 0xC00000FD w systemie Windows.

Zwykle łatwiej jest zdiagnozować, kiedy zdajesz sobie sprawę, że SEH przestaje działać.

0

Być może nieco nie na temat, ale analityczny problem w Adzie (brak miejsca na stosie w zadaniach) to dość powszechny "niecodzienny" błąd. Wiele kompilatorów zatrzyma zadanie (ale nie główne zadanie) z wyjątkiem PROGRAM_ERROR.

W pewnym sensie, prawie musisz być w stanie wywęszyć ten. Zaczyna się od czegoś w rodzaju: "Przeniosłem tę dużą tablicę do mojego zadania i nagle przestało działać".

-1

Tekst wyjściowy do ekranu zmieszano z liniami kodu z testowanego programu. Obecne były również poprzednie polecenia basha i inny tekst o niezidentyfikowanym pochodzeniu. Dodano do wszystkich, że tekst programu został uszkodzony.

Powiązane problemy