Wer ruft unser _purecall auf?
-
Wir haben hier nen reichlich seltsamen Fall. Wie sehen öfters Crashes wo ein Programm mit
unseredll!_purecallwegsemmelt._purecallin unserer DLL kommt dabei ganz normal aus der Visual Studio CRT, die halt einfach nur statisch inunseredllreingelinkt ist.Das komische dabei ist: der Aufruf kommt nicht aus unserer DLL sondern aus einer Windows DLL die vermutlich
MSVCRT!_purecallaufruft (zumindest importiert sieMSVCRT!_purecall).MSVCRT!_purecallruft dannRaiseException(STATUS_NOT_IMPLEMENTED, ...)auf - soweit so gut. Nur wo ich im Moment nicht weiterkomme ist: wie kommtMSVCRT!_purecalldann zu der_purecallFunktion in unserer DLL?Unsere DLL exportiert
_purecallnicht. Unsere DLL enthält keine direkte Referenz zu_purecall(nur die üblichen indirekten die in die VTables reingeneriert werden). Die CRT Enthält was ich erkennen konnte auch keine Referenz auf_purecall, die implementiert das bloss damit es halt aus VTables referenziert werden kann.Ich poste das hier in der Hoffnung dass jmd. das Phänomen kennt bzw. irgendwas dazu weiss was ich nicht weiss. z.B. einen Weg wie man
_purecallindirekt aufrufen kann. (Ausser natürlich wirklich einen "pure call" zu machen - was ich in dem Fall ausschliessen würde, weilunseredll!_purecalldas erste und einzigeunseredllFrame im Callstack von den Dumps ist.)
-
Lies mal die Antwort von "Len Holgate" in Where do “pure virtual function call” crashes come from?
-
@Th69 Danke, weiss ich alles. Ich sehe keinen Zusammenhang mit dem von mir beschriebenen Problem.
Das Problem ist: irgendwer ruft "unsere"_purecallauf, der unsere_purecallgar nicht kennen sollte.Also unsere DLL wird in einen fremden Prozess geladen, der von unserer DLL gar nix weiss. Trotzdem bekommen wir von dem über Umwege über ein paar Windows-Standard DLLs einen Aufruf in die private, nicht exportierte
_purecallFunktion unserer DLL.Der Callstack dieser Crashes ist auch nicht ungewöhnlich, da findet man genügend Beispiele im Internjetz - ist ein klassischer Fehler der gerne mit SharpDX D2D gemacht wird. Nur in den Beispielen findet man als Top-Frame in den Crashes immer sowas wie
MSVCR120_CLR0400!purecall. In unserem Fall steht da aberUNSERE_DLL!purecall. Und ich checke nicht woher er dasUNSERE_DLL!purecallbekommt, das dürfte er gar nicht kennen. Weil der Crash wie gesagt ja nicht aus unserer DLL kommt.