Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Stackoverflow erkennen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] > 2 < [ 3 ] [ 4 ]
010
09.11.2005, 11:21 Uhr
ao

(Operator)


Also, erstens hat eine DLL *keinen* eigenen Stack. Die Applikation hat einen Stack, oder, wenn die App mehrere Threads startet, dann hat jeder Thread einen eigenen. Funktionen aus DLLs laufen auf dem Stack, auf dem ihr Aufrufer läuft, und für einen Stack ist es bedeutungslos, ob eine aufgerufene Funktion direkt von der App mitgebracht oder aus einer DLL geladen wird.

Falls in der DLL ein Thread gestartet wird, hat der demnach einen eigenen Stack, aber nicht wegen der DLL, sondern weil es ein Thread ist.


Zitat:
Ich kann ja einfach die Adressen der lokalen Variablen hernehmen und habe damit die aktuellen Speicheradressen des Stacks..

Ich versteh nicht, wie dir das weiterhilft. Du hast die Adressen der lokalen Objekte und kannst dadurch abschätzen, wieviel Stack ein rekursiver Aufruf belegt, aber du weißt noch nicht, wie viele Aufrufe noch auf dem verbleibenden Stack Platz haben.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
09.11.2005, 11:57 Uhr
~Sponge
Gast


ok das mit dem Stack hatte ich mir gedacht, war mir allerdings nicht sicher....

Naja das mit den Adressen hilft mir soviel, dass ich mir am Anstiegspunkt die Adresse merken kann und mich dann immer wieder auf die erste Adresse referenzierne kann und somit weiss wieviel Bytes der Stack seit dem Einstieg verbrät.. allerdings weiss ich ja nun nicht wann es zu einem Crash kommt.. wenn es eine alleinstehende Anwendung wäre.. einfach im Main die oberste Stackadresse speichern und in der Rekursion prüfen ob man der Stackgrenze schon nahe ist und ggf. vorher abbrechen und eine Fehlerroutine anstossen (die z.B. ein Log schreibt oder so)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
09.11.2005, 12:49 Uhr
ao

(Operator)



Zitat von ~Sponge:
einfach im Main die oberste Stackadresse speichern

Und wie erfährst du die? Das wäre nämlich in der Tat *der* entscheidende Hinweis.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
09.11.2005, 12:59 Uhr
~Sponge
Gast


angenommen ich habe eine "normale Anwenung", dann kann man doch &argv benutzen, ein bissl was fehlt da glaub ich, aber im groben sollte das hinhauen .. und auf ein paar bye mehr oder weniger kommt das doch ned an.. oder übersehe ich mal wieder etwas grobes

(muss gestehen ... setze mich das erstemal genauer mit dem Speicherhandling auseinander)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
09.11.2005, 13:53 Uhr
ao

(Operator)



Zitat von ~Sponge:
angenommen ich habe eine "normale Anwenung", dann kann man doch &argv benutzen

Das wäre der Stackanfang. Um zu erfahren, wie weit du gehen kannst, musst du das Ende ermitteln. Wie machst du das?

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
015
09.11.2005, 14:02 Uhr
~Sponge
Gast


haha .. ja da liegt wohl der Hase im Pfeffer vergraben *mist dabei Hunger bekomm*
das Problem habe ich noch ... also bei einer einfachen Anwendung hätte ich einfach ein oberes StackLimit beim kompilieren reingehauen .. z.B. 10 MB.. dann kann du mit hilfe des Offsets ausrechnen wieweit du noch bis zum Ende hast .. wie ich das nun mit der DLL mache weiss ich noch nicht so genau ....
in 3 stunden is feierabend.. da hab ich immer die besten Ideen.. hoffen wir mal
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
016
10.11.2005, 10:07 Uhr
~Sponge
Gast


Neuer Tag neues Glück,
also mir ist gestern nichts wirklich sinnvolles dazu eingefallen, wenn ich aber nicht auf einen grünen Zweig kommen sollte habe ich mir ein etwas aufwendigeren work-around überlegt. Anstatt einfach die DLL Funktion aufzurufen, ruft man eine Funktion innerhalb der DLL auf (wie z.B. startup), die die eigentliche Prozedur startet und zwar in einen eigenem Thread, der dann auch seinen eigenen Stack hat, den man ja in der Größe begrenzen / definieren kann und dann kann ich mit der Stackanfangsadresse arbeiten. Es ist ein umständlicher, steiniger Weg, der zugegeben nicht der feinen englischen Art entspricht, aber ich finde einfach keine Funktion die mir die Stackgröße zurückliefert.
Kommentare, Bemerkungen (auch ob ich denn komplett verrückt sei) sind gerne gehört bzw. gelesen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
017
10.11.2005, 12:19 Uhr
~cdw
Gast


mal auf die Schnelle: was hindert euch denn den benötigten Speicher für die Rekursion zur Laufzeit zu berechnen (ich nehme an, euer algo ist terminierend )? Und dann eine Fehlermeldung auszugeben - oder man kann auch einen eigenen Stack "implementieren" (also benötigten Speicher allozieren und dann damit arbeiten - zumindest für die DLL bietet es sich an, bei "normalen" Programmen kann man das ja noch beim Compilieren bzw. Linken angeben).
Imho ist so eine Fehlermeldung besser als Programmabsturz - und eine eigenimplemenitierung des Stacks läuft nicht langsammer, als wenn man alle paar Anweisungen die Adressen der lok. Variablen checkt
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
018
10.11.2005, 12:39 Uhr
ao

(Operator)



Zitat von ~cdw:
mal auf die Schnelle: was hindert euch denn den benötigten Speicher für die Rekursion zur Laufzeit zu berechnen (ich nehme an, euer algo ist terminierend )?

Es geht um Spline-Berechnungen, siehe Posting 4. Bei Näherungsrechnungen kann man in der Regel eben nicht vorhersagen, wie viele Umläufe es braucht, bis die angenäherte Lösung die geforderte Fehlerschranke unterschreitet.

Zitat:
oder man kann auch einen eigenen Stack "implementieren"

... auf dem auch die rekursiven Aufrufe gestapelt werden? Ein reiner Datenstack ginge ja noch, aber ein eigener Call-Stack, na ja ....

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
019
10.11.2005, 13:17 Uhr
~Sponge
Gast


genau das is das Problem, man kann nicht sagen, wann das Ding beendet ist.. das eigentlich ärgerliche ist, dass ich gern einen Sicherheitsmechanismus hätte .. wie oft er wirklich gebraucht wird.. ich schätze mal bei unter einem Prozent der Fälle, aber der Gesichtsausdruck des Kundens, wenn da auf einmal ein kleines Kästchen mit einem weissen Kreis auf roten Hintergrund auftaucht seh ich nicht gern .. sprich das Programm muss mit jedem auftretendem Fehler sauber umgehen.. sich selbst schliessen und eine eigene Fehlermeldung produzieren..
obwohl man sicherlich den StackOverflow (wenn man ihn denn über einen Thread abfangen kann) auch verhindern kann, indem man einen weiteren Thread (mit frischem Stack) für die nächsten rekursionschritte schafft..
Es ist leider die einzige Möglichkeit die mir einfällt...

*mal feststellt, dass dieses Forum wirklich Leute beherrbergt, die sich für solche Sachen begeistern können --- ich glaub ich werde die Tage mal die Tilde (~) vor meinem Namen beseitigen ....
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] > 2 < [ 3 ] [ 4 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: