Die Herausforderung besteht darin, ein deterministisches Programm (eine beliebige Sprache / ein beliebiges Betriebssystem) zu schreiben, das keine Argumente oder andere Eingaben akzeptiert und sich in einem Debugger anders verhält, als es sich verhält, wenn kein Debug durchgeführt wird .
Beispielsweise kann das Programm beim Debuggen etwas ausgeben, beim Debuggen jedoch nichts. Oder geben Sie jeweils etwas anderes aus. Oder es kann abstürzen, wenn es debuggt, aber nicht, wenn es nicht debuggt. Oder umgekehrt.
Vorsichtsmaßnahmen und Erläuterungen:
- Zeitunterschiede zählen nicht.
- Dolmetschersprachen sind erlaubt.
- Um den Determinismus zu betonen: Das Verhalten muss sowohl innerhalb als auch außerhalb des Debugging-Kontexts exakt reproduzierbar sein.
- Das Vorhandensein des Debuggers selbst sollte den einzigen Unterschied zwischen den beiden Fällen darstellen.
- Wenn Sie dem Debugger mitteilen, dass er Eingaben (stdin oder argv ENV oder was auch immer) hinzufügen soll, wird das Programm vom Debugger "wie besehen" ausgeführt.
- Das Ändern der Umgebung (z. B. Ausführen in einer virtuellen Maschine oder einem anderen Betriebssystem oder Ändern von Betriebssystemeinstellungen wie z. B. Speicherbeschränkungen) zwischen Debug- und Nicht-Debug-Läufen ist nicht zulässig.
Kürzester Code gewinnt. Ich kann eine Prämie vergeben, die etwas Interessantes über die Funktionsweise von Debuggern preisgibt.
Antworten:
x86- und x64_64-Maschinensprache unter Linux und OSX, 1 Byte
Probieren Sie es online!
int 3
wirft ein,SIGTRAP
wodurch ein Debugger angehalten wird, als ob er auf einen Haltepunkt gestoßen wäre. Außerhalb eines Debuggers bricht der Kernel den Vorgang ab (danke an @Ruslan für die Korrektur).C (gcc) (x86 Linux und OSX),
14 119 BytesProbieren Sie es online!
Die ganze Zahl
204
entspricht derint 3
Anweisung; Die TIO-Verbindung ist die gleiche wie oben.quelle
SIGTRAP
eigentlich nicht dazuSIGABRT
, so dass der Teil über das Anrufenabort()
falsch ist. Es gibt einfach keinen Standard-Signal-Handler fürSIGTRAP
, so dass der Kernel den Prozess beendet (und der Elternteil kannWIFSIGNALED
dies erkennen undWTERMSIG
bestimmen, welches Signal passiert ist).APL (Dyalog Unicode) , 0 Byte
In Dyalog APL wird der Debugger gegen keinen Debugger ausgewählt, indem der Arbeitsbereich entweder im IDE-Interpreter oder im Laufzeit-Interpreter ausgeführt wird.
Wenn Sie einen vollständig leeren Arbeitsbereich mit Standardeinstellungen in den IDE-Interpreter laden, wird der Benutzer sofort in den REPL-Modus versetzt, da Anwendungen den Interpreter aktiv herunterfahren müssen, damit er beendet wird:
Der Laufzeitinterpreter verfügt jedoch nicht über einen REPL - Modus. Wenn eine Anwendung beendet wird (z. B. weil sie vollständig leer ist) und den Interpreter nicht explizit herunterfährt, hat sie implizit versucht, den REPL - Modus zu erreichen ("the") APL-Sitzung ") und beschwert sich über:
quelle
JavaScript in Firefox, 69 Bytes
WARNUNG : Dieses Skript kann Ihren Browser hängen! Testen Sie es NICHT mit anderen Browsern (z. B. Chrome), da dies zum Absturz Ihres Tabs / Browsers führen kann.
Wie: Wenn der Debugger mit
console
aktivierter Registerkarte aktiviert ist.console.log
macht Speicherverlust möglich und dem Programm wird bald der Speicher ausgehen. Wenn der Debugger deaktiviert ist, löscht der GC den zugewiesenen Speicher und Sie sehen schließlich eine Warnung mit Text1
.quelle
MSVC (64-Bit),
5035 BytesBeendet mit Code 0 normalerweise aber 1 unter dem Debugger (beachten Sie, dass WinDbg den Beendigungscode nicht automatisch anzeigt, aber Sie können es fälschen, indem Sie den Stapel untersuchen). Bearbeiten: 15 Bytes dank @Ruslan gespeichert.
quelle
T-SQL, 6 Bytes
Gibt immer eine zusätzliche Zeile unter dem Namen des ausführenden Benutzers zurück, wenn der Debugger aktiv ist.
quelle
Python, 29 Bytes
Ohne Debugger (
python3 /tmp/foo.py
):Mit dem Debugger (
python3 -m pdb /tmp/foo.py
):weil
pdb
im zweiten Fall in ein App-sichtbares Modul geladen wird.quelle
JavaScript, 17 Bytes
debugger
Stoppt die Ausführung, wenn die Debugger-Konsole geöffnet ist. Andernfalls wird nichts ausgeführtquelle
Java,
131 102100 BytesWenn diese Funktion ohne Debugger ausgeführt wird, wird ein Array der Länge 1 zurückgegeben. Wenn sie mit einem Debugger ausgeführt wird, wird ein Array der Länge 2 (größer als 1) zurückgegeben.
Probieren Sie es online!
Dies erkennt technisch, wenn Sie könnten einen Debugger anhängen; nicht, wenn einer verbunden ist ... Ich bin nicht sicher, ob das gültig ist
-23 Bytes dank Olivier Grégoire für die Erwähnung, dass ich meine Suche in den Laufzeitparametern einschränken und meine Antwort lambda-isieren kann
-5 Bytes Danke an Benjamin Urquhart , der diesen Aufruf zur Kenntnis genommen hat
toString
dumm ist, wenn ich Java implizit konvertieren lassen kann-2 Bytes Dank an Benjamin Urquhart für die Änderung des Rückgabetyps
quelle
:jdwp
, statt-agentlib:jdwp
. Das:
ist zu unterscheidenrunjdwp
von-agentlib:jdwp
. 108 BytestoString
Verbesserung hier zu verpassen . Guter Fang!Robotalk , 22 Bytes
Wenn der Debugger aktiv ist,
debug
pausiert der Befehl die Ausführung bis zum Ende des aktuellen Spielticks. In diesem Fall ist die Variable "chronon" beim Lesen immer 1 oder größer und das Programm führt eine Endlosschleife aus. Wenn der Debugger nicht aktiv ist,debug
handelt es sich um ein einmaliges No-Op. "Chronon" ist jetzt 0 beim Lesen, der "ifg" -Zweig wird nicht genommen und die Ausführung erreicht das Ende des Codes, was eine Fehlerbedingung ist.quelle
MATLAB, 6 Bytes
dbquit
Wenn dies im Debugger gestoppt wird, wird der Debugging-Modus beendet.
Wenn es nicht debuggt, wird eine Fehlermeldung ausgegeben, die nicht verwendet werden kann, wenn es nicht im Debugger gestoppt wird.
Es ist zu beachten, dass dies nur für die Auswertung im Befehlsfenster funktioniert (eine der drei Möglichkeiten, MATLAB-Code auszuführen). In einer Funktion oder einem Skript funktioniert dies nicht, da Sie sich während der Ausführung nicht mehr im Debug-Modus befinden, sobald Sie versuchen, das Skript oder die Funktion auszuführen.
Am nächsten an etwas, das auch in einer Funktion / einem Skript ausgeführt werden kann, ist Folgendes:
MATLAB, 22 Bytes
Dies ist ein undokumentierter Befehl in MATLAB. Wenn Sie im Debugger in einem Skript oder einer Funktion angehalten werden und dann eine andere Funktion (oder Befehlsauswertung) aufrufen, die die obige Zeile enthält, wird true zurückgegeben.
Außerhalb des Debuggers wird false zurückgegeben.
Wenn Sie jedoch nur ein Skript / eine Funktion ausführen, die das oben Genannte enthält, wird, selbst wenn Sie am Anfang des Skripts / der Funktion einen Haltepunkt hinzufügen und schrittweise vorgehen, der Wert false zurückgegeben, da Sie wieder aufhören, wenn Sie mit der Ausführung beginnen Debugger vorübergehend.
quelle