Adresse der aktuellen Funktion



  • hi,
    meint ihr etwa das ?

    #include <iostream>
    using namespace std;
    
    void demo(void)
    {
        cout << demo << endl;
    }
    
    int main()
    {
        demo();
        cout << endl << demo << endl; // das gleiche^^
        return (0);
    }
    


  • sowas suche ich nur für Klassen 🙂 Ich möchte in dem Logfile festhalten, welche Adresse die aktuelle Funktion (Konstruktor oder Memberfunktionen) haben. Wenn das Programm einmal abstürzen sollte, dann zeigt Windows in der Regel die Adresse an. So kann man den Rahmen etwas eingrenzen. this->Funktion ohne Parameter klappt auch ganz wunderbar. Nur wenn es jetzt um überladene Memberfunktionen geht oder generell um Funktionen mit Argumenten, dann bin ich am Ende meines Wissens angelangt 😞





  • xGhost(aus_log) schrieb:

    vl. sowas?
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-146248-and-highlight-is-.html

    leider nein. Mit Boost möchte ich nicht arbeiten. Ehrlich gesagt, habe ich gedacht, dass es ganz einfach ist die Adressen zu bekommen ^^ So kann man(n) sich irren....


  • Mod

    NULL schrieb:

    sowas suche ich nur für Klassen 🙂 Ich möchte in dem Logfile festhalten, welche Adresse die aktuelle Funktion (Konstruktor oder Memberfunktionen) haben. Wenn das Programm einmal abstürzen sollte, dann zeigt Windows in der Regel die Adresse an. So kann man den Rahmen etwas eingrenzen. this->Funktion ohne Parameter klappt auch ganz wunderbar. Nur wenn es jetzt um überladene Memberfunktionen geht oder generell um Funktionen mit Argumenten, dann bin ich am Ende meines Wissens angelangt 😞

    wenn des log während des programmlaufs aktualisiert werden soll, könntest du die __FILE__ und __LINE__ macros einsetzen. um mit adressen eines absturzes etwas anzufangen, solltest du für das programm in kompilierter form (so wie du sie weitergibst) und die zugehörige symboltabelle sichern (bei debugbuilds ist diese tabelle gewöhnlich bestandteil des executables, das ist aber nicht notwendig). dann kannst du diese später in den debugger laden und der adresse die betreffende stelle des source codes zuordnen. wie bereits erwähnt - es gibt in standard C++ keine legale möglichkeit, die adresse einer nicht-statischen klassenfunktion zu erhalten (zumal die gerade bei konstruktoren und destruktoren nichtmal eindeutig sein muss).



  • Sowas in der Richtung mache ich auch. Ich dachte nur, dass es einfacher ist die aktuelle Adresse der Funkction mitzuloggen.

    Momentan sieht es so aus :

    CDocument::CDocument(CEis *lpEis)
              :COrderInfo(lpEis->GetMySQLClass())
    {
    	//Logging ?
    	if (lpEis->GetDeveloperLog())
    		lpEis->AddLog("CDocument::CDocument(%p) :COrderInfo(%p) Adress : %p", lpEis, lpEis->GetMySQLClass(), this);
    


  • @camper: Danke für die Aufklärung!

    Greetz, Swordfish



  • Wie wärs wenn du das Programm "einfach" über einen Loader startest der dir dann einen Stacktrace liefert?

    Gruß



  • FireFlow schrieb:

    Wie wärs wenn du das Programm "einfach" über einen Loader startest der dir dann einen Stacktrace liefert?

    Gruß

    Das klingt spannend, aber ich habe keine Ahnung wovon Du redest 🙂 Ich habe mich damit erstmal abgefunden und so ist es auch ok. Sollte eine Zugriffverletzung auftreten, dann sehe ich die letzte Klasse bzw. Memberfunktion in dem Logfile. Leider ohne Adresse, aber so geht es auch.



  • unter windows kannste sowas versuchen:

    #include <windows.h>
    #include <stdio.h>
    
    int e (EXCEPTION_POINTERS *p)
    {
       printf ("absturz an adresse %08lx\n", p->ExceptionRecord->ExceptionAddress);
       return 1;
    }
    
    void main (void)
    {
       __try
       {
          *(int*)0 = 0;  // crash
       }
       __except (e (GetExceptionInformation()))
       {
    
       } 
    }
    

Anmelden zum Antworten