Programme qui se comporte différemment dans / hors d'un débogueur [fermé]

18

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.

vaporiser
la source
4
Certains débogueurs produisent un texte différent au démarrage vers le compilateur normal, donc tout programme semble remplir ces conditions. Cela compte-t-il?
Post Rock Garf Hunter
1
Toutes les sorties ne proviennent-elles pas du débogueur? Je ne sais pas exactement quelle sortie du débogueur est la sortie du programme si nous faisons une distinction.
Post Rock Garf Hunter
5
Définir le débogueur?
Artemis ne fait toujours pas confiance à SE
3
Qu'entendez-vous par débogueur? Laquelle?
MilkyWay90
6
Comment définissez-vous un débogueur? Si un interpréteur de langage prend en charge un mode "débogage" (qui, par exemple, introduit des commandes non standard), cela compte-t-il?
Esolanging Fruit

Réponses:

31

Langage machine x86 et x64_64 sous Linux et OSX, 1 octet

0x0:  CC    int3 

Essayez-le en ligne!

int 3jette un SIGTRAPqui 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 11 9 octets

main=204;

Essayez-le en ligne!

L'entier 204correspond à l' int 3instruction; le lien TIO est le même que ci-dessus.

plafond
la source
1
affectation claire dans le code C, je n'ai jamais vu cela auparavant.
Tom
4
En fait, SIGTRAPcela ne se traduit pas SIGABRT, donc la partie concernant l'appel abort()est incorrecte. Il n'y a tout simplement pas de gestionnaire de signal par défaut pour SIGTRAP, donc le noyau termine le processus (et le parent peut l'utiliser WIFSIGNALEDpour le détecter et WTERMSIGpour déterminer quel signal s'est produit).
Ruslan
9

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:

IDE REPL

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:

Boîte de dialogue d'exécution

Adam
la source
9

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.

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

Comment: lorsque le débogueur est activé avec l' consoleonglet activé. console.logrend 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 texte 1.

tsh
la source
8

MSVC (64 bits), 50 35 octets

main(){return IsDebuggerPresent();}

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

Neil
la source
1
MSVC nécessite-t-il des prototypes? Vous pouvez alors essayer avec MinGW en mode C89, pour économiser quelques octets.
Ruslan
@Ruslan Bah, montre depuis combien de temps je n'ai pas utilisé C ...
Neil
7

T-SQL, 6 octets

sp_who

Renvoie toujours une ligne supplémentaire sous le nom de l'utilisateur exécutant lorsque le débogueur est actif.

youcantryreachingme
la source
5

Python, 29 octets

import sys
sys.modules['pdb']

Sans débogueur ( python3 /tmp/foo.py):

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

Avec le débogueur ( python3 -m pdb /tmp/foo.py):

(empty output)

car pdbest chargé dans un module visible par l'application dans le deuxième cas.

viraptor
la source
4

JavaScript, 17 octets

debugger
alert(1)

debugger arrête l'exécution si la console de débogage est ouverte, sinon elle ne fait rien

jonatjano
la source
4

Java, 131 102 100 octets

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

Lorsqu'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 appeltoString sont stupides quand je peux laisser Java implicitement convertir

-2 octets merci à Benjamin Urquhart pour avoir changé le type de retour

Poussée
la source
3
Vous pouvez le raccourcir en utilisant un lambda. En outre, il est très probable que vous ne puissiez tester que sur :jdwp, au lieu de -agentlib:jdwp. Il :s'agit de distinguer runjdwpde -agentlib:jdwp. 108 octets
Olivier Grégoire
2
103 octets
Benjamin Urquhart
2
@BenjaminUrquhart Je me sens stupide d'avoir raté l' toStringamélioration ici. Bonne prise!
Poke
100 octets - renvoie un tableau de longueur 1 quand aucun débogueur n'est actif, un tableau de longueur au moins 2 s'il peut y en avoir un.
Benjamin Urquhart
3

Robotalk , 22 octets

debug l: chronon l ifg

Si le débogueur est actif, l' debuginstruction 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, il debugs'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.

marque
la source
2

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

feature('IsDebugMode')

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.

Tom Carpenter
la source