stackdump



  • Hallo, ich habe mal eine grundsaetzliche Frage, ich habe beim rumprobieren ein kleines Programm geschrieben, dieses hat einen Fehler, anscheinend ein Pointer irgendwie falsch gesetzt. Ich habe das "Projekt" per gcc auf mingw compiliert und erhalte bei der Ausfuehrung folgende Fehlermeldung:

    ...
    item added..
          7 [main] List 5028 _cygtls::handle_exceptions: Error while dumping state (
    probably corrupted stack)
    Segmentation fault (core dumped)
    

    Ich bekam ein neues File "List.exe.stackdump":

    $ cat List.exe.stackdump
    Exception: STATUS_ACCESS_VIOLATION at eip=004012E8
    eax=00660590 ebx=00000000 ecx=006605A1 edx=00000000 esi=611001A0 edi=00401860
    ebp=0022CC88 esp=0022CC70 program=d:\data\programming\List\List.exe, pid 3212,
    thread main
    cs=001B ds=0023 es=0023 fs=003B gs=0000 ss=0023
    Stack trace:
    Frame     Function  Args
    0022CC88  004012E8  (0022CCD0, 00000000, 00401050, 00401075)
    0022CCE8  004010DF  (00000001, 61169690, 00660090, 0022CC70)
    0022CD98  61006198  (00000000, 0022CDD0, 61005510, 0022CDD0)
    61005510  61004416  (0000009C, A02404C7, E8611001, FFFFFF48)
      12509 [main] List 3212 _cygtls::handle_exceptions: Error while dumping state (probably corrupted stack)
    

    Nun meine Frage, wie liest man diesen Zahlenhaufen eigentlich? Bzw wie kann man diesen auswerten - hat da jemand evtl einen brauchbaren Link zu einem Tutorial oder etwas aehnlichem?
    TIA 🙂



  • Fabeltier schrieb:

    $ cat List.exe.stackdump
    Exception: STATUS_ACCESS_VIOLATION at eip=004012E8
    eax=00660590 ebx=00000000 ecx=006605A1 edx=00000000 esi=611001A0 edi=00401860
    ebp=0022CC88 esp=0022CC70 program=d:\data\programming\List\List.exe, pid 3212,
    thread main
    cs=001B ds=0023 es=0023 fs=003B gs=0000 ss=0023
    Stack trace:
    Frame     Function  Args
    0022CC88  004012E8  (0022CCD0, 00000000, 00401050, 00401075)
    0022CCE8  004010DF  (00000001, 61169690, 00660090, 0022CC70)
    0022CD98  61006198  (00000000, 0022CDD0, 61005510, 0022CDD0)
    61005510  61004416  (0000009C, A02404C7, E8611001, FFFFFF48)
      12509 [main] List 3212 _cygtls::handle_exceptions: Error while dumping state (probably corrupted stack)
    

    also oben werden die ganzen register (eax, ebx usw) und ihre werte aufgezählt
    und danach folgt eine auflistung des Stacks.



  • Fabeltier schrieb:

    eax=00660590 ebx=00000000 ecx=006605A1 edx=00000000 esi=611001A0 edi=00401860
    ebp=0022CC88 esp=0022CC70 program=d:\data\programming\List\List.exe, pid 3212,
    ...
    cs=001B ds=0023 es=0023 fs=003B gs=0000 ss=0023
    Stack trace:
    Frame     Function  Args
    0022CC88  004012E8  (0022CCD0, 00000000, 00401050, 00401075)
    0022CCE8  004010DF  (00000001, 61169690, 00660090, 0022CC70)
    0022CD98  61006198  (00000000, 0022CDD0, 61005510, 0022CDD0)
    61005510  61004416  (0000009C, A02404C7, E8611001, FFFFFF48)
    

    das erste sind die registerinhalte beim crash. darunter sind die sogenannten 'segmentregister' (eine spezialität des X86, um den adressbereich aufzuteilen etc.) die stack tabelle darunter: ganz links der inhalt des ebp-registers (stack frame z.b. für lokale variablen) der jeweiligen funktion. (übrigens: pro zeile geht's in der verschachtelungstiefe der funktionsaufrufe runter). dann die adresse der vorherigen funktion (rücksprungadresse vom stack gelesen). dann 4 werte, die die funktionsparameter sein könnten.
    jetzt mal frei interpretiert, muss nicht alles richtig sein, aber so ungefähr...
    🙂



  • Hallo, danke fuer die Antworten. Das hilft mir zumindest etwas weiter - aber gibt es denn nicht irgendwo auch Howto's oder Links wie man die Register und Segmentregister zum Debuggen hernehmen kann? Ich meine, so einen Output bekomme ich ziemlich schnell um die Ohren gehauen wenn ich nen Pointer falsch gesetzt habe und auslesen will, und ich frage mich dabei immer, ob einem das nicht auch "direkt" helfen koennte? Hat keiner ne Quelle dazu?



  • du weißt schon, dass man programme auch im debugmodus compilieren und dann mit nem debugger laufen lassen kann?


Anmelden zum Antworten