Bei Funktionsaufrufen und show_self gibt es folgende
Einschränkungen:
- Sie können nicht exec() aufrufen.
- Sie können nicht den Thread oder den Prozess beenden.
- Sie können kein Signal auslösen.
- Sie können longjmp() nur aufrufen, wenn sich das Ziel
von longjmp() innerhalb der Funktion befindet.
- Sie können eine C++-Ausnahmebedingung nur auslösen, wenn die
Ausnahmebedingung innerhalb der Funktion bearbeitet wird.
- Sie müssen innerhalb eines überschaubaren Zeitrahmens beendet
werden. Dies kann mit der Umgebungsvariablen DER_DBG_SHOWSELF_TIMEOUT
gesteuert werden. Der Standardwert ist 10 Sekunden.
- In einer Multithread-Anwendung kann die Funktion keine Annahmen darüber
machen, in welchem Thread sie ausgeführt wird - und sie muss annehmen, dass
alle anderen Threads im Prozess ausgesetzt wurden. Insbesondere gilt:
- Sie kann nicht von anderen Threads abhängig sein und muss annehmen, dass
andere Threads möglicherweise erforderliche Ressourcen sperren. Vor allem das Aufrufen
von pthread_mutex_lock() kann zum Blockieren der Funktion
führen.
- Nicht alle C/C++-Bibliotheksfunktionen sind wiedereintrittsfähig. Viele
threadsichere Funktionen in libc.a, einschließlich der
Speicherzuordnungs- und Ein-/Ausgabefunktionen, sind nicht
wiedereintrittsfähig. Sie können seriell wiederverwendet werden. Diese Funktionen
verwenden pthread_mutex_lock() zur Implementierung der
seriellen Wiederverwendbarkeit, so dass ihr Aufruf sehr wahrscheinlich nicht
zur Blockierung der Debugsitzung führen wird.
- Alle Änderungen, die die Funktion am globalen Zustand des Prozesses durchführt,
für den der Debug durchgeführt wird, bleiben nach der Rückkehr der Funktion
erhalten.
- Die Auswirkungen des Aufrufs von pthread_create() sind nicht definiert.
- Die Funktion show_self schließt Aufrufe ein, die
eine Ausgabe an die Konsole übertragen. Diese Aufrufe sind printf(),
fprintf() und die Klasse
cout. Der Debugger führt die Funktion show_self beim Auswerten
dieser Funktionen in einem beliebigen Thread des Debuggee aus, während alle anderen
Threads blockiert sind. Deshalb schlagen alle Aufrufe fehl, die die Ausführung
anderer Threads erfordern.
- Aufrufe, die etwas an der Konsole ausgeben, schlagen in relativ
unkritischer Weise fehl, weil es ganz einfach keine Ausgabe
gibt.
- Eine geringe Wahrscheinlichkeit für einen Deadlock gibt es, weil viele
C/C++-Bibliotheksfunktionen (einschließlich der Ein-/Ausgabe- und
Speicherzuordnungsfunktionen) einen nicht wiedereintrittsfähigen Code
aufrufen müssen, der durch ein Mutex geschützt wird.
- Die Funktion kann nicht oder exec() aufrufen -
und sie kann den Thread nicht beenden
Der Debugger wird die Wiederherstellung
versuchen, falls eine dieser Einschränkungen nicht beachtet werden
sollte. Er kann jedoch nicht garantieren, dass der Zustand der Anwendung,
für die der Debug ausgeführt wird, nicht unwiderruflich geändert
wird.