Programm springt in nirgendwo aufgerufene Methode
-
Hallo zusammen,
ich habe folgendes Problem: Mein Programm springt an einer speziellen Stelle in eine Methode, die nirgendwo im Code aufgerufen wird, auch nicht indirekt. Wenn ich in dieser Methode einen Haltepunkt setze, dann hält das Programm dort zu einem bestimmten Zeitpunkt an. Wie kann so etwas passieren? kann es sein, dass ich irgendwie aus Versehen in den Call Stack schreibe und somit diesen Funktionsaufruf erzwinge, der eigentlich gar nicht vorgesehen ist?
Vielen Dank!
-
Entweder das Framework was du verwendest ruft die Methode auf,
oder du tust es selber. Evtl. Ja unbewusst.
Wenn du das Programm debuggst müsstest du die Stelle
die es aufruft finden.Devil
-
Genau, das hab ich schon gemacht. Wenn ich an diese Stelle komme, dann steht im Callstack davor eine Methode, die etwas komplett anderes aufruft, nicht die Methode, die dann tatsächlich aufgerufen wird !?!?! Komisch ...
-
Hi!
Ist das eine überladene Funktion? Oder ist das eine ganz andere Funktion (sprich anderer Name)?
Code-Hacker
-
Das ist eine andere Methode, eine der Parentklasse, die jedoch in der Unterklasse auch überschrieben wird. Allerdings wird weder die der Unterklasse noch die der Parentklasse jemals aufgerufen.
-
Hi!
Schon mal getestet was passiert wenn du die Funktion die aufgerufen wird auskommentierst und dann die Anwendung neu erstellst. Vielleicht bekommst du ja eine Fehlermeldung oder einen Programmabsturz.
Code-Hacker
-
Debugge doch mal aus der Fubktion hinaus, dann siehst du doch wo du landest und wo der Aufruf passiert. Ansonsten poste einfach mal ein bisschen relevanten Code.
btw:
So etwas wie einen Call Stack gibt es zur Laufzeit nicht. Du kannst höchstens vtables oder Rücksprungadressen unbewusst überschreiben.
-
sorry für die frage, aber wie kann man vtables überschreiben?
-
groovemaster2002 schrieb:
So etwas wie einen Call Stack gibt es zur Laufzeit nicht.
-
Den "CallStack" bekommt man durch StackUnwinding (naja nicht wirklich, man zerstört ja nix dabei) und Auswerten der DebugSymbole.
Lösche mal alle Object Files und erstell die Anwendung neu und schau, ob es dann immernoch auftritt. Möglicherweise wurde irgendein Modul nicht neu kompiliert, obwohl das hätte passieren müssen.
-
otze schrieb:
sorry für die frage, aber wie kann man vtables überschreiben?
Wozu und womit überschreiben? Möglicherweise reicht:
std::memset(this,0,sizeof(*this));
Ob man das auch wirklich tun möchte, ist was anderes...