Piszę program Ada przy użyciu podzbioru Ravenscar (w ten sposób jestem świadomy liczby uruchomionych zadań w czasie wykonywania). Kod jest kompilowany przez gcc z włączonym przełącznikiem -fstack-check
. To powinno spowodować, że program podniesie STORAGE_ERROR w środowisku wykonawczym, jeśli jakiekolwiek z moich zadań przekroczy ich stos.Najlepsze praktyki do określenia użycia stosu w programie Ravenscar
Ada pozwala ustawić górny limit dla tych (zadanie specyficzne) stosy podczas specyfikacji danego zadania tak:
pragma Storage_Size (Some_Value);
teraz zastanawiałem się, jakie opcje mam do określenia Some_Value
. O czym słyszałem do tej pory:
- Wykonuj dzikie domysły, dopóki nie podniesiono STORAGE_ERROR. Jest to mniej więcej to, co OP sugeruje here.
- Tutaj można podać wyjście
-fstack-usage
. - Użyj pewnych rozszerzeń dla gomnów, jak opisano here (jak to technicznie różni się od pozycji # 2?).
- Uzyskaj analizator stosu, taki jak gnatstack i pozwól mu wykonać pracę za Ciebie.
Jeśli dobrze rozumiem to poprawnie wszystkie powyższe techniki są dynamiczny (to wymagają one, aby uruchomić program w celu podjęcia pracy). Czy możliwe są również podejścia statyczne? Na przykład. ograniczając się dalej poprzez niektóre z opcji wysokiej integralności Ada (takich jak No_Recursion, co jeszcze?).
Być może każdy z was może wymienić najlepsze praktyki, aby rozwiązać ten problem i/lub rozszerzyć/skomentować moją (na pewno niekompletną) listę.
Pytanie dodatkowe: Jaki jest domyślny rozmiar stosu zadania, gdy powyższa pragma nie jest określona? GCC w wersji docs określa tylko tę wartość w zależności od środowiska wykonawczego, nie podając żadnych konkretnych liczb.
Dobre pytanie z dobrymi badaniami w tle! –
Domyślny rozmiar stosu podano w 'System.Parameters.Default_Stack_Size' (file' s-parame.adb'). –
@Simon: czy rozmiar tego stosu odnosi się do zadania środowiska, zadeklarowanych zadań lub wszystkich zadań? Pytam, ponieważ natknąłem się na opcję "ustawionego rozmiaru stosu", która nie miała wpływu na zadanie środowiska - co najwyraźniej nie dało się ustawić w żaden sposób za pomocą tego konkretnego wydania kompilatora, które również nie przestrzegało ustawień ulimit. Pracowałem nad tym, przenosząc cały program do nowego zadania ... –