Programma che si comporta in modo diverso dentro / fuori da un debugger [chiuso]


18

La sfida è scrivere un programma deterministico (qualsiasi linguaggio / sistema operativo) che non accetta argomenti o altri input e si comporta diversamente in un debugger da come si comporta quando non viene eseguito il debug .

Ad esempio, il programma potrebbe generare qualcosa durante il debug ma non produrre nulla quando non viene eseguito il debug. O produrre qualcosa di diverso in ogni caso. Oppure potrebbe bloccarsi quando viene eseguito il debug ma non arrestarsi quando non viene eseguito il debug. O vice versa.

Avvertenze e chiarimenti:

  • Le differenze temporali non contano.
  • Sono consentite le lingue interpretate.
  • Per enfatizzare il determinismo: il comportamento deve essere esattamente riproducibile sia all'interno che all'esterno del contesto di debug.
  • La presenza del debugger stesso dovrebbe essere l'unica differenza tra i due casi.
    • Dire al debugger di aggiungere input (stdin o argv ENV o altro) è un imbroglio, il debugger dovrebbe eseguire il programma "così com'è".
    • La modifica dell'ambiente (ad es. In esecuzione in una macchina virtuale o in un sistema operativo diverso o la modifica delle impostazioni del sistema operativo come i limiti di memoria) tra esecuzioni di debug e non di debug non è consentita.

Il codice più corto vince. Potrei assegnare una taglia che rivela qualcosa di interessante su come funzionano i debugger.


4
Alcuni debugger inviano un testo diverso all'avvio al normale compilatore, quindi qualsiasi programma sembra soddisfare queste condizioni. Questo conta?
Wheat Wizard

1
Tutto l'output non proviene dal debugger? Non mi è chiaro quale sia l'output del debugger rispetto all'output del programma se stiamo facendo una distinzione.
Wheat Wizard

5
Definire il debugger?
Artemis supporta Monica

3
Cosa intendi per debugger? Quale?
MilkyWay90,

6
Come si definisce un debugger? Se un interprete di lingue supporta una modalità "debug" (che, per esempio, introduce comandi non standard), conta?
Esolanging Fruit

Risposte:


31

linguaggio macchina x86 e x64_64 su Linux e OSX, 1 byte

0x0:  CC    int3 

Provalo online!

int 3genera un SIGTRAPche causerà l'arresto di un debugger come se incontrasse un punto di interruzione. Al di fuori di un debugger, il kernel termina il processo (grazie a @Ruslan per la correzione).

C (gcc) (x86 Linux e OSX), 14 11 9 byte

main=204;

Provalo online!

L'intero 204corrisponde int 3all'istruzione; il collegamento TIO è lo stesso di cui sopra.


1
chiara assegnazione nel codice C, non l'ho mai visto prima.
Tom,

4
In realtà SIGTRAPnon risulta SIGABRT, quindi la parte sulla chiamata abort()è sbagliata. Semplicemente non esiste un gestore di segnali predefinito per SIGTRAP, quindi il kernel termina il processo (e il genitore può usare WIFSIGNALEDper rilevare questo e WTERMSIGdeterminare quale segnale è accaduto).
Ruslan,

9

APL (Dyalog Unicode) , 0 byte

In Dyalog APL, il debugger vs nessun debugger viene scelto eseguendo il proprio spazio di lavoro nell'interprete IDE o nell'interprete di runtime.

Caricando uno spazio di lavoro delle impostazioni predefinite completamente vuoto nell'interprete IDE, l'utente viene immediatamente messo in modalità REPL poiché le applicazioni devono chiudere attivamente l'interprete affinché si chiuda:

IDE REPL

Tuttavia, l'interprete di runtime non ha una modalità REPL, quindi se un'applicazione termina (ad esempio perché è completamente vuota) e non arresta esplicitamente l'interprete, ha implicitamente tentato di raggiungere la modalità REPL ("il Sessione APL ") e si lamenta:

Finestra di dialogo runtime


9

JavaScript su Firefox, 69 byte

ATTENZIONE : questo script potrebbe bloccare il browser! NON testarlo con altri browser (ad es. Chrome) in quanto potrebbe causare l'arresto anomalo della scheda / del browser.

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

Come: quando il debugger è abilitato con la consolescheda attivata. console.logrende possibile la perdita di memoria e il programma si esaurirà presto. Quando il debugger è disabilitato, GC cancella la memoria allocata e alla fine viene visualizzato un avviso con testo 1.


8

MSVC (64 bit), 50 35 byte

main(){return IsDebuggerPresent();}

Esce normalmente con il codice 0 ma 1 sotto il debugger (si noti che WinDbg non visualizza automaticamente il codice di uscita ma è possibile falsificarlo esaminando lo stack). Modifica: salvato 15 byte grazie a @Ruslan.


1
MSVC richiede prototipi? Potresti quindi provare con MinGW in modalità C89, per salvare alcuni byte.
Ruslan,

@Ruslan Bah, mostra da quanto tempo non uso C ...
Neil,

7

T-SQL, 6 byte

sp_who

Restituisce sempre una riga aggiuntiva sotto il nome dell'utente in esecuzione quando il debugger è attivo.


5

Python, 29 byte

import sys
sys.modules['pdb']

Senza debugger ( python3 /tmp/foo.py):

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

Con debugger ( python3 -m pdb /tmp/foo.py):

(empty output)

perché pdbviene caricato in un modulo visibile dall'app nel secondo caso.


4

JavaScript, 17 byte

debugger
alert(1)

debugger interrompe l'esecuzione se la console del debugger è aperta, altrimenti non fa nulla


4

Java, 131 102 100 byte

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

Quando si esegue senza un debugger questa funzione restituisce un array di lunghezza 1. Quando si esegue con un debugger, questo restituisce un array di lunghezza 2 (maggiore di 1).

Provalo online!

Ciò rileva tecnicamente se è possibile collegare un debugger; non se uno è attualmente connesso ... Non sono sicuro che sia valido

-23 byte grazie a Olivier Grégoire per aver menzionato che posso ridurre ciò che cerco nei parametri di runtime e per lambda-izing la mia risposta

-5 byte grazie a Benjamin Urquhart per aver notato che la chiamata toStringè stupida quando posso consentire a Java di convertire implicitamente

-2 byte grazie a Benjamin Urquhart per aver cambiato il tipo di ritorno


3
Puoi accorciarlo usando un lambda. Inoltre, è molto probabile che tu possa testare solo su :jdwp, anziché -agentlib:jdwp. Il :è quello di distinguere runjdwpda -agentlib:jdwp. 108 byte
Olivier Grégoire


2
@BenjaminUrquhart Mi sento stupido per aver perso il toStringmiglioramento qui. Buona pesca!
Colpisce

100 byte : restituisce un array di lunghezza 1 quando non è attivo alcun debugger, un array di lunghezza almeno 2 se ce ne può essere uno.
Benjamin Urquhart,

3

Robotalk , 22 byte

debug l: chronon l ifg

Se il debugger è attivo, l' debugistruzione mette in pausa l'esecuzione fino alla fine del tick corrente del gioco. In questo caso, la variabile "chronon" è sempre 1 o superiore durante la lettura e il programma esegue un ciclo infinito. Se il debugger non è attivo,debug è un no-op a un ciclo. "Chronon" ora è 0 quando letto, il ramo "ifg" non viene preso e l'esecuzione raggiunge la fine del codice, che è una condizione di errore.


2

MATLAB, 6 byte

dbquit

Quando viene arrestato nel debugger, questo uscirà dalla modalità di debug.

Quando non è in fase di debug, verrà stampato un messaggio di errore che non può essere utilizzato quando non viene arrestato nel debugger.

Va notato che questo funziona solo per la valutazione nella finestra di comando (uno dei tre modi per eseguire il codice MATLAB). Non funzionerà in una funzione o script poiché una volta che si tenta di eseguire lo script o la funzione, si interrompe la modalità di debug durante l'esecuzione.

Il più vicino che puoi ottenere a qualcosa che verrà eseguito anche in una funzione / script sarebbe:

MATLAB, 22 byte

feature('IsDebugMode')

Questo è un comando non documentato in MATLAB. Se si viene arrestati nel debugger in uno script o in una funzione e quindi si chiama un'altra funzione (o valutazione del comando) che contiene la riga precedente, verrà restituito true.

Al di fuori del debugger restituirà false.

Se dovessi comunque eseguire uno script / funzione contenente quanto sopra, anche se aggiungi un punto di interruzione all'inizio dello script / funzione e passi attraverso, restituirà false, perché di nuovo, una volta che inizi a eseguire, smetti di essere nel debugger temporaneamente.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.