Adresse der aktuellen Funktion
-
Hallo,
für ein Logfile benötige ich die Adresse der Funktion in der sich das Programm gerade befindet. In einer Klasse z.B. arbeite ich mit dem this-Pointer, aber die Adresse der Konstruktoren und Memberfunktionen bekomme ich nicht raus, es sein denn, dass Sie keine Argumente erwarten (this->Function). Sobald eine Funktion Parameter enthält weiss ich nicht mehr weiter.
Gruß
-
Ich hab' grad
#include <iostream> using namespace std; class foo { private: int bar; public: foo( int bar ) : bar( bar ) { }; int get_bar( ) { return bar; }; void set_bar( int bar_to_set ) { bar = bar_to_set; } void test( ) { cout << "foo::test( ): " << hex << this->test << endl; }; }; int main( ) { foo bar; bar->test; return 0; }probiert und bekomme statt der erwarteten Adresse von this->test nur
"fatal error C1001: INTERNER COMPILERFEHLER" (Compilerdatei "msc1.cpp", Zeile 2844) Wählen Sie im Menü "?" von Visual C++ den Befehl "Software Service", oder öffnen Sie die Hilfedatei für den Software Service, um weitere Informationen zu erhallten."Jetzt würd's mich auch interessieren...
Greetz, Swordfish
-
willkommen in der welt des ICE

auch wenn hier eigentlich nichts besonderes ist (für gewöhnlich sind da immer templates im spiel).void test( ) { cout << "foo::test( ): " << hex << this->test << endl; };ein closure a.b bzw. a->b, wenn b eine memberfunktion ist, kann in standard C++ nur auf eine einzige weise verwendet werden: indem man den funktionsaufruf operator daruf anwendet. alles andere ist schlicht ein fehler.(in main fehlen die klammern übrigens auch - ausserdem hat foo keinen default-konstruktor).
C++ kennt den begriff der "adresse" bezogen auf funktionen eigentlich nicht. für namespace- oder statische klassenfunktionen ist ein funktionspointer in der regel äquivalent zu einem objektpointer. für nicht-statische memberfunktionen dagegen gibt es in standard C++ kein mittel, auch nur so etwas änliches wie eine adresse zu erhalten.
P.S. msvc vor der version 8 hat die unangenehme angewohnheit, solche konstrukte implizit in einen pointer-auf-memberfunktion umzuwandeln - das ist nicht standardgemäß und ine hässliche sache, weil man die klammern gelegentlich einfach nur vergisst.
-
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-.htmlleider 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....
-
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())) { } }