Programa que se comporta de maneira diferente dentro / fora de um depurador [fechado]


18

O desafio é escrever um programa determinístico (qualquer idioma / SO) que não use argumentos ou outras entradas e se comporte de maneira diferente em um depurador da maneira como ele se comporta quando não está sendo depurado .

Por exemplo, o programa pode produzir algo ao ser depurado, mas não produzir nada quando não está sendo depurado. Ou imprima algo diferente em cada caso. Ou pode falhar ao ser depurado, mas não pode falhar quando não está sendo depurado. Ou vice-versa.

Advertências e esclarecimentos:

  • As diferenças de tempo não contam.
  • Idiomas interpretados são permitidos.
  • Para enfatizar o determinismo: o comportamento deve ser exatamente reproduzível dentro e fora do contexto de depuração.
  • A presença do próprio depurador deve ser a única diferença entre os dois casos.
    • Dizendo ao depurador para adicionar entradas (stdin ou argv ENV ou qualquer outra coisa) está enganando, o depurador deve executar o programa "como está".
    • Não é permitido alterar o ambiente (por exemplo, executar em uma máquina virtual ou sistema operacional diferente ou alterar configurações do sistema operacional, como limites de memória) entre execuções de depuração e não depuração.

O menor código vence. Posso conceder uma recompensa que revele algo interessante sobre como os depuradores funcionam.


4
Alguns depuradores produzem texto diferente na inicialização do compilador normal, portanto, qualquer programa parece atender a essas condições. Isso conta?
Wheat Wizard

1
Toda a saída não vem do depurador? Não está claro para mim o que é a saída do depurador versus a saída do programa se estivermos fazendo uma distinção.
Wheat Wizard

5
Definir depurador?
Artemis apoia Monica

3
O que você quer dizer com depurador? Qual?
MilkyWay90

6
Como você define um depurador? Se um intérprete de idioma suportar um modo de "depuração" (que, digamos, introduz comandos fora do padrão), isso conta?
Esolanging Fruit

Respostas:


31

Linguagem de máquina x86 e x64_64 no Linux e OSX, 1 byte

0x0:  CC    int3 

Experimente online!

int 3lança um SIGTRAPque fará com que um depurador pare como se tivesse encontrado um ponto de interrupção. Fora de um depurador, o kernel finaliza o processo (obrigado a @Ruslan pela correção).

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

main=204;

Experimente online!

O número inteiro 204corresponde à int 3instrução; o link do TIO é o mesmo que acima.


1
atribuição clara no código C, nunca vi isso antes.
Tom

4
Na verdade, SIGTRAPisso não resulta SIGABRT, então a parte sobre ligar abort()está errada. Simplesmente não há manipulador de sinal padrão para SIGTRAP, então o kernel finaliza o processo (e o pai pode usar WIFSIGNALEDpara detectar isso e WTERMSIGdeterminar qual sinal aconteceu).
Ruslan

9

APL (Dyalog Unicode) , 0 bytes

No Dyalog APL, o depurador versus nenhum depurador é escolhido executando a área de trabalho no intérprete IDE ou no intérprete de tempo de execução.

Carregar uma área de trabalho de configurações padrão completamente vazia no interpretador IDE, coloca o usuário imediatamente no modo REPL, pois os aplicativos devem desligar ativamente o intérprete para que ele saia:

IDE REPL

No entanto, o intérprete de tempo de execução não possui um modo REPL e, portanto, se um aplicativo chegar ao fim (por exemplo, porque está completamente vazio) e não desligar explicitamente o intérprete, ele implicitamente tentou acessar o modo REPL ("o Sessão da APL ") e reclama:

Diálogo de tempo de execução


9

JavaScript no Firefox, 69 bytes

AVISO : Este script pode travar o seu navegador! NÃO teste-o com outros navegadores (por exemplo, Chrome), pois pode travar sua guia / navegador.

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

Como: quando o depurador é ativado com a consoleguia ativada. console.logtorna possível o vazamento de memória e o programa ficará sem memória em breve. Quando o depurador está desativado, o GC limpa a memória alocada e você vê um alerta com o texto 1finalmente.


8

MSVC (64 bits), 50 35 bytes

main(){return IsDebuggerPresent();}

Sai com o código 0 normalmente, mas 1 no depurador (observe que o WinDbg não exibe automaticamente o código de saída, mas você pode falsificá-lo examinando a pilha). Editar: salvou 15 bytes graças a @Ruslan.


1
O MSVC requer protótipos? Você pode querer tentar com o MinGW no modo C89, para salvar alguns bytes.
Ruslan

@Ruslan Bah, mostra quanto tempo faz desde que eu usei C ...
Neil

7

T-SQL, 6 bytes

sp_who

Sempre retorna uma linha extra sob o nome do usuário em execução quando o depurador está ativo.


5

Python, 29 bytes

import sys
sys.modules['pdb']

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

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

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

(empty output)

porque pdbé carregado em um módulo visível do aplicativo no segundo caso.


4

JavaScript, 17 bytes

debugger
alert(1)

debugger interrompe a execução se o console do depurador estiver aberto; caso contrário, ele não fará nada


4

Java, 131 102 100 bytes

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

Ao executar sem um depurador, essa função retorna uma matriz de comprimento 1. Ao executar com um depurador, isso retorna uma matriz de comprimento 2 (maior que 1).

Experimente online!

Tecnicamente, isso detecta se você pode anexar um depurador; não se alguém estiver conectado no momento ... Não tenho certeza se isso é válido

-23 bytes, graças a Olivier Grégoire por mencionar que posso reduzir o que procuro nos parâmetros de tempo de execução e por lambda-izing minha resposta

-5 bytes, graças a Benjamin Urquhart, por observar que chamar toStringé estúpido quando eu posso permitir que o Java converta implicitamente

-2 bytes graças a Benjamin Urquhart por alterar o tipo de retorno


3
Você pode reduzi-lo usando uma lambda. Além disso, é muito provável que você possa testar apenas em :jdwpvez de -agentlib:jdwp. O :é distinguir runjdwpde -agentlib:jdwp. 108 bytes
Olivier Grégoire


2
@BenjaminUrquhart Sinto-me idiota por perder a toStringmelhoria aqui. Boa pegada!
Puxa

100 bytes - retorna a matriz de comprimento 1 quando nenhum depurador está ativo; a matriz de comprimento é pelo menos 2, se houver um.
Benjamin Urquhart

3

Robotalk , 22 bytes

debug l: chronon l ifg

Se o depurador estiver ativo, a debuginstrução interromperá a execução até o final do jogo atual. Nesse caso, a variável "chronon" é sempre 1 ou maior quando lida e o programa executa um loop infinito. Se o depurador não estiver ativo, debugé um ciclo inoperante. "Chronon" agora é 0 quando lido, o ramo "ifg" não é utilizado e a execução chega ao final do código, que é uma condição de erro.


2

MATLAB, 6 bytes

dbquit

Quando parado no depurador, isso encerrará o modo de depuração.

Quando não estiver em depuração, imprimirá uma mensagem de erro que não pode ser usada quando não for parada no depurador.

Deve-se notar que isso funciona apenas para avaliação na janela de comando (uma das três maneiras de executar o código MATLAB). Ele não funcionará em uma função ou script, pois quando você tenta executar o script ou a função, você para de estar no modo de depuração durante a execução.

O mais próximo que você pode chegar de algo que será executado em uma função / script também seria:

MATLAB, 22 bytes

feature('IsDebugMode')

Este é um comando não documentado no MATLAB. Se você for parado no depurador em um script ou função e chamar outra função (ou avaliação de comando) que contenha a linha acima, ela retornará true.

Fora do depurador, ele retornará falso.

No entanto, se você executasse apenas um script / função que contenha o que foi mencionado acima, mesmo se você adicionar um ponto de interrupção no início do script / função e seguir adiante, ele retornará falso, pois novamente, quando você começa a executar, para de estar no diretório depurador temporariamente.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.