Adresse der aktuellen Funktion
-
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())) { } }