Programa que se comporta de manera diferente dentro / fuera de un depurador [cerrado]

18

El desafío es escribir un programa determinista (cualquier lenguaje / SO) que no tome argumentos u otra entrada y se comporte de manera diferente en un depurador de cómo se comporta cuando no se depura .

Por ejemplo, el programa puede generar algo cuando se depura pero no generar nada cuando no se depura. O generar algo diferente en cada caso. O puede bloquearse cuando se depura, pero no bloquearse cuando no se depura. O viceversa.

Advertencias y aclaraciones:

  • Las diferencias de tiempo no cuentan.
  • Se permiten idiomas interpretados.
  • Para enfatizar el determinismo: el comportamiento debe ser exactamente reproducible dentro y fuera del contexto de depuración.
  • La presencia del depurador en sí debería ser la única diferencia entre los dos casos.
    • Decirle al depurador que agregue entradas (stdin o argv ENV o lo que sea) es una trampa, el depurador debe ejecutar el programa "tal cual".
    • No está permitido cambiar el entorno (p. Ej., Ejecutar en una máquina virtual o un sistema operativo diferente, o cambiar la configuración del sistema operativo, como los límites de memoria) entre ejecuciones de depuración y no depuración.

El código más corto gana. Puedo otorgar una recompensa que revela algo interesante sobre cómo funcionan los depuradores.

rociar
fuente
44
Algunos depuradores envían texto diferente al inicio al compilador normal, por lo que cualquier programa parece cumplir con estas condiciones. ¿Eso cuenta?
Wheat Wizard
1
¿No sale toda la salida del depurador? No estoy claro para mí qué salida del depurador es vs salida del programa si estamos haciendo una distinción.
Wheat Wizard
55
Definir depurador?
Artemisa apoya a Mónica
3
¿Qué quieres decir con depurador? ¿Cúal?
MilkyWay90
66
¿Cómo se define un depurador? Si un intérprete de idiomas admite un modo de "depuración" (que, por ejemplo, introduce comandos no estándar), ¿eso cuenta?
Esolanging Fruit

Respuestas:

31

Lenguaje de máquina x86 y x64_64 en Linux y OSX, 1 byte

0x0:  CC    int3 

Pruébalo en línea!

int 3arroja un SIGTRAPque hará que un depurador se detenga como si encontrara un punto de interrupción. Fuera de un depurador, el núcleo termina el proceso (gracias a @Ruslan por la corrección).

C (gcc) (x86 Linux y OSX), 14 11 9 bytes

main=204;

Pruébalo en línea!

El entero 204corresponde a la int 3instrucción; El enlace TIO es el mismo que el anterior.

techo
fuente
1
asignación clara en el código C, no he visto eso antes.
Tom
44
En realidad SIGTRAPno da como resultado SIGABRT, por lo que la parte de llamar abort()es incorrecta. Simplemente no hay un controlador de señal predeterminado, por SIGTRAPlo que el kernel termina el proceso (y el padre puede usarlo WIFSIGNALEDpara detectar esto y WTERMSIGdeterminar qué señal sucedió).
Ruslan
9

APL (Dyalog Unicode) , 0 bytes

En Dyalog APL, el depurador frente a ningún depurador se elige ejecutando el espacio de trabajo en el intérprete IDE o en el intérprete de tiempo de ejecución.

Al cargar un espacio de trabajo de configuración predeterminada completamente vacío en el intérprete IDE, el usuario pasa inmediatamente al modo REPL ya que las aplicaciones deben apagar activamente el intérprete para que se cierre:

IDE REPL

Sin embargo, el intérprete en tiempo de ejecución no tiene un modo REPL, por lo que si una aplicación llega a su fin (por ejemplo, porque está completamente vacía) y no cierra explícitamente el intérprete, implícitamente ha intentado alcanzar el modo REPL ("el Sesión APL "), y se queja:

Diálogo de tiempo de ejecución

Adán
fuente
9

JavaScript en Firefox, 69 bytes

ADVERTENCIA : ¡Este script puede colgar su navegador! NO lo pruebe con otros navegadores (por ejemplo, Chrome) ya que puede bloquear su pestaña / navegador.

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

Cómo: cuando el depurador está habilitado con la consolepestaña activada. console.loghace posible la pérdida de memoria y el programa se quedará sin memoria pronto. Cuando el depurador está deshabilitado, GC borraría la memoria asignada y finalmente vería una alerta con texto 1.

tsh
fuente
8

MSVC (64 bits), 50 35 bytes

main(){return IsDebuggerPresent();}

Sale con el código 0 normalmente pero 1 debajo del depurador (tenga en cuenta que WinDbg no muestra automáticamente el código de salida pero puede simularlo examinando la pila). Editar: Guardado 15 bytes gracias a @Ruslan.

Neil
fuente
1
¿MSVC requiere prototipos? Es posible que desee probar con MinGW en modo C89 para guardar algunos bytes.
Ruslan
@Ruslan Bah, muestra cuánto tiempo ha pasado desde que usé C ...
Neil
7

T-SQL, 6 bytes

sp_who

Siempre devuelve una fila adicional debajo del nombre del usuario ejecutor cuando el depurador está activo.

youcantryreachingme
fuente
5

Python, 29 bytes

import sys
sys.modules['pdb']

Sin depurador ( python3 /tmp/foo.py):

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

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

(empty output)

porque pdbse carga en un módulo visible de la aplicación en el segundo caso.

viraptor
fuente
4

JavaScript, 17 bytes

debugger
alert(1)

debugger detiene la ejecución si la consola del depurador está abierta, de lo contrario no hace nada

jonatjano
fuente
4

Java, 131 102 100 bytes

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

Cuando se ejecuta sin un depurador, esta función devuelve una matriz de longitud 1. Cuando se ejecuta con un depurador, esto devuelve una matriz de longitud 2 (mayor que 1).

Pruébalo en línea!

Esto técnicamente detecta si puede adjuntar un depurador; no si uno está conectado actualmente ... No estoy seguro si eso es válido

-23 bytes gracias a Olivier Grégoire por mencionar que puedo reducir lo que busco en los parámetros de tiempo de ejecución y por lambda-izing mi respuesta

-5 bytes gracias a Benjamin Urquhart por señalar que las llamadas toStringson tontas cuando puedo dejar que Java se convierta implícitamente

-2 bytes gracias a Benjamin Urquhart por cambiar el tipo de retorno

Dar un toque
fuente
3
Puedes acortarlo usando una lambda. Además, es muy probable que solo pueda probar en :jdwplugar de hacerlo -agentlib:jdwp. El :es distinguir runjdwpde -agentlib:jdwp. 108 bytes
Olivier Grégoire
2
103 bytes
Benjamin Urquhart
2
@BenjaminUrquhart Me siento tonto por perder la toStringmejora aquí. ¡Buena atrapada!
Poke
100 bytes : devuelve una matriz de longitud 1 cuando no hay un depurador activo, una matriz de longitud de al menos 2 si puede haber una.
Benjamin Urquhart
3

Robotalk , 22 bytes

debug l: chronon l ifg

Si el depurador está activo, la debuginstrucción detiene la ejecución hasta el final del tic actual del juego. En este caso, la variable "cronón" siempre es 1 o mayor cuando se lee, y el programa ejecuta un bucle infinito. Si el depurador no está activo, debuges un ciclo no operativo. "Chronon" ahora es 0 cuando se lee, la rama "ifg" no se toma y la ejecución llega al final del código, lo cual es una condición de error.

marca
fuente
2

MATLAB, 6 bytes

dbquit

Cuando se detiene en el depurador, se cerrará el modo de depuración.

Cuando no está bajo depuración, imprimirá un mensaje de error de que no se puede usar cuando no se detiene en el depurador.

Cabe señalar que esto solo funciona para la evaluación en la ventana de comandos (una de las tres formas de ejecutar el código MATLAB). No funcionará en una función o script ya que una vez que intente ejecutar el script o la función, dejará de estar en modo de depuración durante la ejecución.

Lo más cercano que puede llegar a algo que también se ejecutará en una función / script sería:

MATLAB, 22 bytes

feature('IsDebugMode')

Este es un comando no documentado en MATLAB. Si se detiene en el depurador en un script o función, y luego llama a otra función (o evaluación de comando) que contiene la línea anterior, devolverá verdadero.

Fuera del depurador devolverá falso.

Sin embargo, si solo ejecutara una secuencia de comandos / función que contiene lo anterior, incluso si agrega un punto de interrupción al comienzo de la secuencia de comandos / función y avanza, devolverá falso, porque nuevamente, una vez que comience a ejecutar, dejará de estar en el depurador temporalmente.

Tom Carpenter
fuente