wieviel liegt auf meinem stack?

dettus

Bicycle User
kennt jemand von euch ein tool welches ein executable laufen laesst und mir sagen kann wieviele bytes auf meinem stack liegen?

hab irgendwie keine lust die einzelnen bytes zu zaehlen... :D
 
Was willst du wissen? Wieviele Bytes die an Parameter übergeben wurden? Die Größe des "Stacksegments"? Die Differenz zwischen dem Stackpointer nach main() und dem aktuellen Wert?
 
letzteres.
und eigentlich interessiert mich davon auch nur der "maximalausschlag".

zur erklaerung: jedes mal, wenn du eine funktion parameter definiert, werden die auf dem stack angelegt. also sowas wie das hier:

Code:
void blubb()
{
  int x;
*(2)
}
void bla()
{
    char eins[1024];
    char zwei[2048];
*(1)
    blubb();
}

int main(void)
{
  bla();
}

hat bei *(1) ja 1024+2048=3096 bytes auf dem stack, bei *(2) 3096+sizeof(int)=3100.
plus vielleicht noch die ruecksprungadressen.
 
Hallo dettus

kennt jemand von euch ein tool welches ein executable laufen laesst und mir sagen kann wieviele bytes auf meinem stack liegen?

hab irgendwie keine lust die einzelnen bytes zu zaehlen... :D

Hach, diese Jugend :D

(1) Ein Debugger kann dir das mitteilen, indem Du die Stackpointer beobachtest und die Werte voneinander subtrahierst
(2) Oder, wenn Du selber der Autor bis, dann kannst Du das [1] hier einfügen:
Code:
inline unsigned int getStackpointer()
{
unsigned int stackpointer;
__asm__ __volatile__("mov %%ebp, %%eax":"=a" (stackpointer));
return stackpointer;
}
Der Kode ermittelt den aktuellen Stackpointer und funktioniert allerdings nur bei i386. Wenn Du das gezielt plazierst und die Stackpointer voneinander subtrahierst hast Du das gewünschte Ergebnis.

[1] Das habe ich vor langer Zeit, als ich noch richtig aktiv programmiert habe, irgendwo in einem Heft gefunden. Ich weiß bloß nicht mehr, in welchem Heft.;'(
Ich glaube es war in einer alten Toolbox...

Viele Grüße

JueDan
 
@juedan:
bei moderen prozies heisst das register scheinbar rbp oder rsp.

@oneone:
ja, gdb kann das auch.
Code:
% ( echo "start" ; while (true) ; do echo "info register rbp" ; echo "info register rsp" ; echo "s" ; done ) | gdb testme >stacklog.txt
gibts noch eine "saubere" loesung?
 
@juedan:
bei moderen prozies heisst das register scheinbar rbp oder rsp.
Das liegt daran, weil das hier 64 Bit Register sind: zB rax und bei 32 Bit waere es eax.

In den seltenen Faellen, wo ich mal die Stackgroesse gebraucht habe, habe ich auch immer gdb benutzt. Ein Breakpoint am Anfang und da wo gemessen werden soll und jeweils: "i r".
 
@juedan:
bei moderen prozies heisst das register scheinbar rbp oder rsp.

@oneone:
ja, gdb kann das auch.
Code:
% ( echo "start" ; while (true) ; do echo "info register rbp" ; echo "info register rsp" ; echo "s" ; done ) | gdb testme >stacklog.txt
gibts noch eine "saubere" loesung?

Moin Du meinst hier explizit 64 Bit und in diesem Kontext AMD ja da kommt man dann, nicht ganz ohne etwas Assembler- kenntnisse aus.

Dann es gibt hier auch wesentliche Unterschiede zwischen Linux und der Unix Konvention, gehe hier aber davon aus das Du OpenBSD nutzt. Nun weiss ich nicht genau wie es da der Theo und seine Mannen handhaben oder ob Sie genau so tolerant wie die FreeBSD Entwickler sind, die beide Konventionen ermöglichen.

Im Zweifelsfall würde ich Dir zur Unix Konvention raten, allerdings sieht das ganz anders aus falls Deine sich deine Frage auf Linux und AMD bezieht denn Du schreibst explizit nicht welches OS....

Schau hierzu mal in meine Signatur der erste Link da wird Dir geholfen

Dann etwas graue Theorie >

# http://en.wikipedia.org/wiki/CPUID

MFG
 
Zuletzt bearbeitet:
Zurück
Oben