2016-01-13 33 views
5

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:

  1. Wykonuj dzikie domysły, dopóki nie podniesiono STORAGE_ERROR. Jest to mniej więcej to, co OP sugeruje here.
  2. Tutaj można podać wyjście -fstack-usage.
  3. Użyj pewnych rozszerzeń dla gomnów, jak opisano here (jak to technicznie różni się od pozycji # 2?).
  4. 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.

+1

Dobre pytanie z dobrymi badaniami w tle! –

+0

Domyślny rozmiar stosu podano w 'System.Parameters.Default_Stack_Size' (file' s-parame.adb'). –

+0

@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 ... –

Odpowiedz

1

Ogólnie można sprawdzić ilość miejsca stosu wymaganą przez poszczególne typy za pomocą atrybutu 'Storage_Size (który liczy się w bitach).

Po zestawieniu tego (może być konieczne zaokrąglenie go do całych słów/podwójnych słów), można dodać, ile miejsca stosu jest używane przez każdy region deklaratywny, a następnie przechodzić przez połączenia, aby znaleźć maksymalną liczbę użycie stosu.

+0

Sugerujesz zrobienie tego ręcznie? To brzmi jak żmudne przedsięwzięcie ... Czy jest jakieś wsparcie dla tego narzędzia? – morido

+1

Dosłownie sugerowałem, że robisz to ręcznie. Wątpię, byś mógł to zrobić za pomocą analizy statycznej, chyba że ograniczysz się do korzystania z rekursji. Jeśli nie używasz rekursji, powinno być możliwe napisanie małego narzędzia ASIS do wykonania pracy. –