Le défi est d'écrire un programme déterministe (n'importe quel langage / OS) qui ne prend aucun argument ou autre entrée et se comporte différemment dans un débogueur de la façon dont il se comporte lorsqu'il n'est pas débogué .
Par exemple, le programme peut générer quelque chose lors du débogage, mais ne rien afficher lorsqu'il n'est pas débogué. Ou produire quelque chose de différent dans chaque cas. Ou il peut se bloquer lors du débogage, mais pas se bloquer lorsqu'il n'est pas débogué. Ou vice versa.
Mises en garde et clarifications:
- Les différences de temps ne comptent pas.
- Les langues interprétées sont autorisées.
- Pour souligner le déterminisme: le comportement doit être exactement reproductible à la fois dans et hors du contexte de débogage.
- La présence du débogueur lui-même devrait faire la seule différence entre les deux cas.
- Dire au débogueur d'ajouter des entrées (stdin ou argv ENV ou autre) est de la triche, le débogueur doit exécuter le programme "tel quel".
- La modification de l'environnement (par exemple, en cours d'exécution sur une machine virtuelle ou un système d'exploitation différent, ou en modifiant les paramètres du système d'exploitation tels que les limites de mémoire) entre les exécutions déboguée et non déboguée n'est pas autorisée.
Le code le plus court gagne. Je peux accorder une prime qui révèle quelque chose d'intéressant sur le fonctionnement des débogueurs.
Réponses:
Langage machine x86 et x64_64 sous Linux et OSX, 1 octet
Essayez-le en ligne!
int 3
jette unSIGTRAP
qui provoquera l'arrêt d'un débogueur comme s'il rencontrait un point d'arrêt. En dehors d'un débogueur, le noyau termine le processus (merci à @Ruslan pour la correction).C (gcc) (x86 Linux et OSX),
14 119 octetsEssayez-le en ligne!
L'entier
204
correspond à l'int 3
instruction; le lien TIO est le même que ci-dessus.la source
SIGTRAP
cela ne se traduit pasSIGABRT
, donc la partie concernant l'appelabort()
est incorrecte. Il n'y a tout simplement pas de gestionnaire de signal par défaut pourSIGTRAP
, donc le noyau termine le processus (et le parent peut l'utiliserWIFSIGNALED
pour le détecter etWTERMSIG
pour déterminer quel signal s'est produit).APL (Dyalog Unicode) , 0 octet
Dans Dyalog APL, le débogueur contre aucun débogueur est choisi en exécutant son espace de travail dans l'interpréteur IDE ou l'interpréteur d'exécution.
Le chargement d'un espace de travail de paramètres par défaut complètement vide dans l'interpréteur IDE, place immédiatement l'utilisateur en mode REPL car les applications doivent arrêter activement l'interpréteur pour qu'il se ferme:
Cependant, l'interpréteur d'exécution n'a pas de mode REPL, et donc si une application se termine (par exemple parce qu'elle est complètement vide) et ne ferme pas explicitement l'interpréteur, elle a implicitement tenté d'atteindre le mode REPL ("le Session APL "), et se plaint:
la source
JavaScript sur Firefox, 69 octets
AVERTISSEMENT : ce script peut bloquer votre navigateur! Ne le testez PAS avec d'autres navigateurs (par exemple Chrome) car cela pourrait planter votre onglet / navigateur.
Comment: lorsque le débogueur est activé avec l'
console
onglet activé.console.log
rend possible la fuite de mémoire et le programme va bientôt manquer de mémoire. Lorsque le débogueur est désactivé, GC efface la mémoire allouée et vous voyez enfin une alerte avec du texte1
.la source
MSVC (64 bits),
5035 octetsQuitte avec le code 0 normalement mais 1 sous le débogueur (notez que WinDbg n'affiche pas automatiquement le code de sortie mais vous pouvez le simuler en examinant la pile). Edit: 15 octets enregistrés grâce à @Ruslan.
la source
T-SQL, 6 octets
Renvoie toujours une ligne supplémentaire sous le nom de l'utilisateur exécutant lorsque le débogueur est actif.
la source
Python, 29 octets
Sans débogueur (
python3 /tmp/foo.py
):Avec le débogueur (
python3 -m pdb /tmp/foo.py
):car
pdb
est chargé dans un module visible par l'application dans le deuxième cas.la source
JavaScript, 17 octets
debugger
arrête l'exécution si la console de débogage est ouverte, sinon elle ne fait rienla source
Java,
131 102100 octetsLorsqu'elle s'exécute sans débogueur, cette fonction renvoie un tableau de longueur 1. Lorsqu'elle s'exécute avec un débogueur, elle renvoie un tableau de longueur 2 (supérieur à 1).
Essayez-le en ligne!
Cela détecte techniquement si vous pouviez attacher un débogueur; pas si l'un est actuellement connecté ... Je ne sais pas si c'est valide
-23 octets grâce à Olivier Grégoire avoir mentionné que je pouvais réduire ce que je cherchais dans les paramètres d'exécution et d'avoir lambda-isé ma réponse
-5 octets merci à Benjamin Urquhart d' avoir noté cet appel
toString
sont stupides quand je peux laisser Java implicitement convertir-2 octets merci à Benjamin Urquhart pour avoir changé le type de retour
la source
:jdwp
, au lieu de-agentlib:jdwp
. Il:
s'agit de distinguerrunjdwp
de-agentlib:jdwp
. 108 octetstoString
amélioration ici. Bonne prise!Robotalk , 22 octets
Si le débogueur est actif, l'
debug
instruction suspend l'exécution jusqu'à la fin du tick du jeu en cours. Dans ce cas, la variable "chronon" est toujours égale ou supérieure à 1 lors de la lecture, et le programme exécute une boucle infinie. Si le débogueur n'est pas actif, ildebug
s'agit d'un no-op à un cycle. "Chronon" est maintenant à 0 lors de la lecture, la branche "ifg" n'est pas prise et l'exécution atteint la fin du code, ce qui est une condition d'erreur.la source
MATLAB, 6 octets
dbquit
Lorsqu'il est arrêté dans le débogueur, cela quitte le mode de débogage.
Lorsqu'il n'est pas sous débogage, il affichera un message d'erreur indiquant qu'il ne peut pas être utilisé lorsqu'il n'est pas arrêté dans le débogueur.
Il convient de noter que cela ne fonctionne que pour l'évaluation dans la fenêtre de commande (l'une des trois façons d'exécuter le code MATLAB). Cela ne fonctionnera pas dans une fonction ou un script car une fois que vous essayez d'exécuter le script ou la fonction, vous arrêtez d'être en mode débogage pendant l'exécution.
Le plus proche que vous pouvez obtenir de quelque chose qui s'exécutera également dans une fonction / un script serait:
MATLAB, 22 octets
Il s'agit d'une commande non documentée dans MATLAB. Si vous êtes arrêté dans le débogueur dans un script ou une fonction, puis appelez une autre fonction (ou évaluation de commande) qui contient la ligne ci-dessus, elle renverra true.
En dehors du débogueur, il retournera false.
Si vous deviez cependant simplement exécuter un script / une fonction contenant ce qui précède, même si vous ajoutez un point d'arrêt au début du script / de la fonction et que vous y accédez, il retournera false, car là encore, une fois que vous commencez à exécuter, vous arrêtez d'être dans le débogueur temporairement.
la source