Programm, das sich in / außerhalb eines Debuggers anders verhält [geschlossen]

18

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.

spraff
quelle
4
Einige Debugger geben beim Start einen anderen Text an den normalen Compiler aus. Daher scheint jedes Programm diese Bedingungen zu erfüllen. Zählt das?
Weizen-Zauberer
1
Kommen nicht alle Ausgaben vom Debugger? Mir ist nicht klar, was die Debugger-Ausgabe im Vergleich zur Programmausgabe ist, wenn wir eine Unterscheidung treffen.
Weizen-Zauberer
5
Debugger definieren?
Artemis unterstützt Monica
3
Was meinst du mit Debugger? Welcher?
MilkyWay90
6
Wie definieren Sie einen Debugger? Wenn ein Sprachinterpreter einen "Debug" -Modus unterstützt (der beispielsweise nicht standardmäßige Befehle einführt), zählt das dann?
Esolanging Fruit

Antworten:

31

x86- und x64_64-Maschinensprache unter Linux und OSX, 1 Byte

0x0:  CC    int3 

Probieren Sie es online!

int 3wirft ein, SIGTRAPwodurch 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 11 9 Bytes

main=204;

Probieren Sie es online!

Die ganze Zahl 204entspricht der int 3Anweisung; Die TIO-Verbindung ist die gleiche wie oben.

Ceilingcat
quelle
1
klare Zuordnung im C-Code, das habe ich noch nie gesehen.
Tom,
4
Führt SIGTRAPeigentlich nicht dazu SIGABRT, so dass der Teil über das Anrufen abort()falsch ist. Es gibt einfach keinen Standard-Signal-Handler für SIGTRAP, so dass der Kernel den Prozess beendet (und der Elternteil kann WIFSIGNALEDdies erkennen und WTERMSIGbestimmen, welches Signal passiert ist).
Ruslan
9

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:

IDE REPL

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:

Laufzeitdialog

Adam
quelle
9

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.

for(console.log(a={},i=99);--i;a=a.a={k:new Int8Array(1e9)});alert(1)

Wie: Wenn der Debugger mit consoleaktivierter Registerkarte aktiviert ist. console.logmacht 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 Text 1.

tsh
quelle
8

MSVC (64-Bit), 50 35 Bytes

main(){return IsDebuggerPresent();}

Beendet 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.

Neil
quelle
1
Benötigt MSVC Prototypen? Vielleicht möchten Sie dann versuchen, mit MinGW im C89-Modus einige Bytes zu sparen.
Ruslan
@ Ruslan Bah, zeigt, wie lange es her ist, seit ich C ... verwendet habe
Neil
7

T-SQL, 6 Bytes

sp_who

Gibt immer eine zusätzliche Zeile unter dem Namen des ausführenden Benutzers zurück, wenn der Debugger aktiv ist.

youcantryreachingme
quelle
5

Python, 29 Bytes

import sys
sys.modules['pdb']

Ohne Debugger ( python3 /tmp/foo.py):

Traceback (most recent call last):
  File "/tmp/foo.py", line 2, in <module>
    sys.modules['pdb']
KeyError: 'pdb'

Mit dem Debugger ( python3 -m pdb /tmp/foo.py):

(empty output)

weil pdbim zweiten Fall in ein App-sichtbares Modul geladen wird.

viraptor
quelle
4

JavaScript, 17 Bytes

debugger
alert(1)

debugger Stoppt die Ausführung, wenn die Debugger-Konsole geöffnet ist. Andernfalls wird nichts ausgeführt

jonatjano
quelle
4

Java, 131 102 100 Bytes

v->(java.lang.management.ManagementFactory.getRuntimeMXBean().getInputArguments()+"").split(":jdwp")

Wenn 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 hattoString dumm ist, wenn ich Java implizit konvertieren lassen kann

-2 Bytes Dank an Benjamin Urquhart für die Änderung des Rückgabetyps

Sack
quelle
3
Sie können es mit einem Lambda kürzen. Außerdem ist es sehr wahrscheinlich , dass Sie nur auf testen :jdwp, statt -agentlib:jdwp. Das :ist zu unterscheiden runjdwpvon -agentlib:jdwp. 108 Bytes
Olivier Grégoire
2
103 Bytes
Benjamin Urquhart
2
@BenjaminUrquhart Ich fühle mich dumm, die toStringVerbesserung hier zu verpassen . Guter Fang!
Poke
100 Byte - Gibt ein Array der Länge 1 zurück, wenn kein Debugger aktiv ist, und ein Array der Länge mindestens 2, wenn es eines geben kann.
Benjamin Urquhart
3

Robotalk , 22 Bytes

debug l: chronon l ifg

Wenn der Debugger aktiv ist, debugpausiert 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, debughandelt 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.

Kennzeichen
quelle
2

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

feature('IsDebugMode')

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.

Tom Carpenter
quelle