callStack und standard exception



  • Hallo Leute
    Wie kann man den in C++ einen Callstack programmieren?
    So das ich in einem Logfile oder in einem Fehlerdialog die genaue Reihenfolge der Funktionsaufrufe anchweisen kann.

    Wie kann ich Standard Exception, so wie bei unzureichendem Arbeitsspeicher abfangen?

    Gruss Ishildur



  • Einen Callstack willst du nicht programmieren, sondern den vorhandenen ausgeben. Gehen tut's trotzdem nicht 😉 - Zumindest nicht automatisch, wie in anderen Sprachen.

    Siehe dein Lieblingsbuch zum Thema "catch" und die Liste der Standardexceptions, in dem Fall std::bad_alloc, das von std::exception abgeleitet ist.



  • Zumindest nicht automatisch, wie in anderen Sprachen.

    Ja das macht nichts, kannst du mir grob erklären, wies denn nicht automatisch funktioniert?

    Gruss Ishildur



  • Entweder durch Magie von Seiten der C++-Implementierung (naja, wäre zumindest theoretisch möglich?) oder indem du manuell alle Funktionsein- und -austritte notierst. Das heißt natürlich, dass du nur Informationen über die Funktionen hast, die du auch wirklich selbst schreibst...



  • Das kann man aber auch relativ ordentlich realisieren.

    Du schreibst Dir ein Objekt dem man einen Funktionsnamen geben kann. Wenn es erstellt wird legt es diesen Namen auf den Stack, im Destruktor nimmst Du's wieder runter. Jetzt mußt Du nur noch am Anfang jeder Funktion einmal den Funktionsnamen an so ein Objekt übergeben... das nervt immer noch. Glücklicherweise gibt's ein Makro bieten einige Compiler __FUNCTION__ an (oder is das Standard?), da steht der Funktionsname drin. Du brauchst also am Anfang immer nur ein

    PushFunction myGuard(__FUNCTION__); schreiben. (myGuard ist schlecht, Du solltest nen Namen verwenden den man sonst nie verwenden will, sonst stört er.

    Wenn Du das jetzt noch hinter nem Makro versteckst:

    #define PUSH_FUNCTION PushFunction myGuard(__FUNCTION__)

    dann mußt Du immer nur am Anfang jeder Funktion
    PUSH_FUNCTION; schreiben.
    Der Aufwand hält sich also in Grenzen. Trotzdem isses nicht so schön wie das einfach automatisch zu bekommen. Vielleicht könnte man auch ein Tool schreiben was die Sachen automatisch einfügt?

    MfG Jester



  • Zumindest für Delphi habe ich mal diverse Module gesehen, die Stack-Unwinding beherrschen.
    Es würde mich nicht wundern, wenn es sowas auch für C++ gibt. Sicher wird das Compiler-abhängig sein. Wäre dafür wohl aber eine sehr angenehme Alternative. Und, irgendwie müssen die Debugger das ja auch hinkriegen 😉



  • In etwa so?

    char *g_str = 0x00;
    
    void pushFunction(const char *strFnc){
    
    if(g_str){
      char strTmp = new char[strlen(g_str)+1];
      strcpy(strTmp,g_str);
    
      delete []g_str;
      g_str = new char[strlen(g_str)+strlen(strFnc)+1];
      spintf(g_str,"%s->%s",strTmp,strFnc);
    
      delete strTmp;
     }
     else{
      g_str = new char[strlen(strFnc)+1];
      strcpy(g_str,strFnc);
     }
    }
    
    void chopFunction(void){
     if(!g_str) return; 
    
     char *pos = strstr(g_str,"->");
    
     if(pos){
      g_str[pos] = '\0';
    
      char *strTmp = strlen(g_str);
      strcpy(strTmp,g_str);
      delete []g_str;
      strcpy(g_str,strTmp);
      delete strTmp;
     }
    }
    
    void doSomething(void){
     pushFunction("void doSomething(void)");
    
     // implementationscode
    
     chopFunction();
    }
    

    Hab ich aus dem Kopf geschrieben und nicht getestet!!



  • hm, ich würd wohl eher nen std::stackstd::string > verwenden. Und ganz wichtig: Eine Klasse deren Objekte das push im Konstruktor erledigen und das pop im Destruktor. Was glaubst Du wie lange Du sonst warten mußt bis jemand das wieder vom Stack nehmen am Ende der Funktion vergißt?



  • Ishildur! Lass mich raten, du bist C-Programmierer der C++ versucht? 😉 😃



  • Jester schrieb:

    Glücklicherweise gibt's ein Makro bieten einige Compiler __FUNCTION__ an (oder is das Standard?)

    Standard nicht, aber __func__ ist zumindest Standard. Allerdings nur in C.



  • @Artchi

    Nein, ich bin ein C++-Programmierer, doch ich kann mit der Standardbibliothek von C++ bezüglich meines momentanen Projektes nicht viel anfangen, weil dies die dll extrem aufbläht. Dasselbe gilt für die STL.


Anmelden zum Antworten