0x800706BA "The RPC server is unavailable." beim Debuggen
-
Ich bekomme in einer unserer Anwendungen beim Debuggen öfter mal einen _com_error mit Fehlercode 0x800706BA ("The RPC server is unavailable.") geworfen.
Dummerweise kann ich nicht sagen wo der Fehler genau rausgeflogen kommt - hängt ja kein Callstack dran.
Einfach reproduzieren kann ich es auch nicht.Passieren tut es hauptsächlich wenn ich den Prozess im Debugger längere Zeit angehalten hatte (per Single-Step diverse Dinge durchsteppen), und danach wieder normal weiterlaufen lasse.
Im "Normalbetrieb" (=auch Debuggen aber ohne länger "unterbrochene" Phasen) ist dieser Fehler noch nie aufgetreten.Die Anwendung verwendet einige "out of process" COM Server - ein paar davon in C++ implementiert (ATL) und ein paar mit C# (ganz normales COM Gedöns des .NET Frameworks, nur beim Registrieren des Servers läuft ein bisschen Custom Code damit sich das Ding als "out of process" registrieren lässt).
Ich *vermute* dass es daran liegt, also dass irgend ein Aufruf in einen der COM Server die Exception wirft, weil im COM Server Prozess irgend ein RPC Timeout abgelaufen ist. (Ich schätze der RPC Server wird öfter mal nachgucken ob der Client noch lebt, indem er nen "ping" hin schickt, und wenn er in angemessener Zeit keinen "pong" zurückbekommt die Verbindung kappen.)Ist aber schwer einzugrenzen, da es reichlich viele Stellen gibt wo Calls in diese COM Server gemacht werden -- die alle mit try-catch zu umwickeln wäre möglich, aber ziemlich aufwendig.
Daher die Frage: hat jemand von euch eine Idee woran das liegen könnte? Bzw. wo man ansetzen könnte wenn man das reproduzieren möchte (bzw. allgemein rausbekommen wo das Problem entsteht)?
EDIT: Manchmal kommt nach dem initialen 0x800706BA in einem anderen Thread noch ein _com_error mit 0x80010108 ("The object invoked has disconnected from its clients."). /EDIT
-
Die Fehlermeldung kommt mir auch von MFC bekannt vor. Hab leider vergessen woran es lag.
Vielleicht hat ja Martin Richter einen Tip.
-
Es kommt ziemlich sicher daher dass ein "lebt der Client noch? Ping" im COM Server austimed während ich im Debugger auf "Pause" bin. Weil der Client in der Zeit natürlich nicht antworten kann.
Die Frage wäre dann noch: wie kann man das Timeout erhöhen? Idealerweise nur für bestimmte Server (bzw. nur für eine bestimmten Client), wenn nicht anders möglich auch gerne maschinenweit.
-
Das war leider kein sehr hilfreicher post von mir. War eher als moralische Unterstützung gemeint.
Ich hab es irgendwie mit google rausgefunden. Such mal nach der Fehlermeldung in Englisch.
-
EOP schrieb:
Such mal nach der Fehlermeldung in Englisch.
Hab ich schon. Vorerst kein Glück.
-
Das passiert z.B. immer, wenn ich im Debugger attached bin und in der Anwendungen einen Datei Öffnen Dialog aufmache. Hilft dir aber wahrscheinlich nicht weiter.
-
Hehe. Nö, hilft mir wirklich nicht
Datei Öffnen Dialog gibt's in meiner Anwendung keinen.
-
Und was passiert wenn Du die Exception vom Programm behandeln lässt?
-
Das Programm ist nicht darauf ausgelegt "kaputtgehende" Connections zu den COM Servern zu reparieren.
Heisst: ohne grössere Umbauten kann ich die Exception nicht sinnvoll behandeln.
Die "Behandlung" die ich aktuell mache ist das Programm mit einer Fehlermeldung abzubrechen.Im Feld draussen ist das wie gesagt auch kein Problem, da es nicht auftritt. Die COM Server laufen ja auf der selben Maschine, d.h. Netzwerkprobleme o.Ä. können nicht stören. Die Wahrscheinlichkeit dass so ein "ping" Timeout im Normalbetrieb stattfindet ist wohl astronomisch gering.
Aber es nervt halt hin und wieder beim Debuggen.
-
Kenne ich. Bei mir ist es oft die SQL Server Verbindung, die irgendwann hops geht, wenn ich länger debugge.
PS: Mit behandeln, meinte ich, dass es evtl. eine Windows Komponente ist, die die Exception auch behandelt. Du aber im Debugger ja die "First-Chance" erhältst. Aber es handelt sich ja um was ganz anderes...
-
D.h. du hast da auch noch keinen Weg gefunden da z.B. ein Timeout zu erhöhen um das zu fixen?
Und ja, ist was anderes, ich bekomme
_com_error
geschmissen (vermutlich - weiss ja noch nicht 100% wo's herkommt) direkt aus Calls auf über#import
erzeugte Smart-Pointer für eigene COM Komponenten.
Bzw. wäre sogar auch möglich dass es SQL Server Connections sind. Wir verwenden in dem Projekt auch ADO (klassisch COM, also kein ADO.NET). Und die ADO Klassen werden auch über#import
verwendet, also auch_com_error
-werfende Smart-Pointer.Also trotzdem ein guter Tip. An die SQL Server Connections hab' ich nämlich bisher noch gar nicht gedacht.
-
Nein. Ich habe keinen Weg gefunden. Und ich habe schon einiges an den Connection Strings ausprobiert. Ich habe TCP/IP und Named Pipes schon als Verbindungstypen gewechselt. Einzig wenn ich den SQL Server über Shared Memory auf der gleichen Maschine verbinden kann passiert dies logischerweise nicht.