Program, który zachowuje się inaczej w / w debuggera [zamknięty]

18

Wyzwanie polega na napisaniu deterministycznego programu (dowolnego języka / systemu operacyjnego), który nie przyjmuje żadnych argumentów ani innych danych wejściowych i zachowuje się inaczej w debuggerze niż to, jak się zachowuje, gdy nie jest debugowany .

Na przykład program może wyświetlać coś podczas debugowania, ale niczego nie wyświetlać, gdy nie jest debugowany. Lub wypisz coś innego w każdym przypadku. Lub może ulec awarii podczas debugowania, ale nie awarii, gdy nie jest debugowany. Lub odwrotnie.

Ostrzeżenia i wyjaśnienia:

  • Różnice czasowe się nie liczą.
  • Języki tłumaczone są dozwolone.
  • Aby podkreślić determinizm: zachowanie musi być dokładnie powtarzalne zarówno w kontekście debugowania, jak i poza nim.
  • Obecność samego debuggera powinna być jedyną różnicą między tymi dwoma przypadkami.
    • Poinformowanie debuggera o dodaniu danych wejściowych (ENV stdin lub argv lub cokolwiek innego) oszukuje, debuger powinien uruchomić program „tak jak jest”.
    • Zmiana środowiska (np. Działającego na maszynie wirtualnej lub innym systemie operacyjnym lub zmiana ustawień systemu operacyjnego, takich jak limity pamięci) między uruchomieniami debugowania i bez debugowania jest niedozwolona.

Najkrótszy kod wygrywa. Mogę przyznać nagrodę, która ujawnia coś interesującego w działaniu debuggerów.

spraff
źródło
4
Niektóre debugery wyświetlają inny tekst podczas uruchamiania do normalnego kompilatora, dlatego wydaje się, że każdy program spełnia te warunki. To się liczy?
Wheat Wizard
1
Czy nie wszystkie dane wyjściowe pochodzą z debuggera? Nie jest dla mnie jasne, czym jest wyjście debuggera vs. wyjście programu, jeśli dokonujemy rozróżnienia.
Kreator pszenicy
5
Zdefiniować debugger?
Artemis wspiera Monikę
3
Co masz na myśli przez debugger? Który?
MilkyWay90
6
Jak definiujesz debugger? Jeśli tłumacz języka obsługuje tryb „debugowania” (który, powiedzmy, wprowadza niestandardowe polecenia), czy to się liczy?
Esolanging Fruit

Odpowiedzi:

31

Język maszynowy x86 i x64_64 w systemie Linux i OSX, 1 bajt

0x0:  CC    int3 

Wypróbuj online!

int 3zgłasza, SIGTRAPco spowoduje zatrzymanie debugera, tak jakby napotkał punkt przerwania. Poza debuggerem jądro kończy proces (dzięki @Ruslan za korektę).

C (gcc) (Linux x86 i OSX), 14 11 9 bajtów

main=204;

Wypróbuj online!

Liczba całkowita 204odpowiada int 3instrukcji; łącze TIO jest takie samo jak powyżej.

sufitowy
źródło
1
jasne przypisanie w kodzie C, nie widziałem tego wcześniej.
Tom
4
Właściwie SIGTRAPto nie skutkuje SIGABRT, więc część dotycząca dzwonienia abort()jest błędna. Po prostu nie ma domyślnej procedury obsługi sygnału SIGTRAP, więc jądro kończy proces (a rodzic może WIFSIGNALEDgo wykryć i WTERMSIGustalić, który sygnał się wydarzył).
Ruslan
9

APL (Dyalog Unicode) , 0 bajtów

W aplikacji Dyalog APL debuger zamiast żadnego debugera jest wybierany przez uruchomienie obszaru roboczego w interprecie IDE lub w środowisku wykonawczym.

Ładowanie całkowicie pustego obszaru roboczego ustawień domyślnych do interpretera IDE, natychmiast przenosi użytkownika do trybu REPL, ponieważ aplikacje muszą aktywnie wyłączać interpreter, aby mógł wyjść:

IDE REPL

Jednak interpreter środowiska wykonawczego nie ma trybu REPL, więc jeśli aplikacja dobiegnie końca (na przykład ponieważ jest całkowicie pusta) i nie zamknie jawnie interpretera, niejawnie próbowała przejść do trybu REPL („ Sesja APL ”) i narzeka:

Okno dialogowe środowiska wykonawczego

Adám
źródło
9

JavaScript w przeglądarce Firefox, 69 bajtów

OSTRZEŻENIE : Ten skrypt może zawiesić przeglądarkę! NIE testuj go w innych przeglądarkach (np. Chrome), ponieważ może to spowodować awarię karty / przeglądarki.

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

Jak: Gdy debugger jest włączony z consoleaktywowaną kartą. console.logumożliwia wyciek pamięci, a programowi wkrótce zabraknie pamięci. Gdy debugger jest wyłączony, GC wyczyści przydzieloną pamięć i w 1końcu zobaczysz alert z tekstem .

tsh
źródło
8

MSVC (64-bit), 50 35 bajtów

main(){return IsDebuggerPresent();}

Wychodzi z kodem 0 normalnie, ale 1 pod debuggerem (zwróć uwagę, że WinDbg nie wyświetla automatycznie kodu wyjścia, ale możesz go sfałszować, sprawdzając stos). Edycja: Zapisano 15 bajtów dzięki @Ruslan.

Neil
źródło
1
Czy MSVC wymaga prototypów? Następnie możesz spróbować z MinGW w trybie C89, aby zapisać niektóre bajty.
Ruslan
@ Ruslan Bah, pokazuje, ile czasu minęło, odkąd użyłem C ...
Neil
7

T-SQL, 6 bajtów

sp_who

Zawsze zwraca dodatkowy wiersz pod nazwą użytkownika wykonującego, gdy debugger jest aktywny.

youcantryreachingme
źródło
5

Python, 29 bajtów

import sys
sys.modules['pdb']

Bez debuggera ( python3 /tmp/foo.py):

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

Za pomocą debuggera ( python3 -m pdb /tmp/foo.py):

(empty output)

ponieważ pdbw drugim przypadku jest ładowany do modułu widocznego w aplikacji.

viraptor
źródło
4

JavaScript, 17 bajtów

debugger
alert(1)

debugger zatrzymuje wykonywanie, jeśli konsola debugowania jest otwarta, w przeciwnym razie nic nie robi

jonatjano
źródło
4

Java, 131 102 100 bajtów

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

Podczas działania bez debuggera funkcja zwraca tablicę o długości 1. Podczas pracy z debuggerem zwraca tablicę o długości 2 (większej niż 1).

Wypróbuj online!

To technicznie wykrywa, czy ty mógłby dołączyć debugger; nie, jeśli ktoś jest aktualnie podłączony ... Nie jestem pewien, czy to jest poprawne

-23 bajty dzięki Olivier Grégoire za wspomnienie, że mogę ograniczyć to, czego szukam w parametrach środowiska wykonawczego i za lambda-izing mojej odpowiedzi

-5 bajtów dzięki Benjaminowi Urquhartowi za odnotowanie tego wezwaniatoString jest głupie, gdy mogę pozwolić na jawną konwersję Java

-2 bajty dzięki Benjaminowi Urquhartowi za zmianę typu zwrotu

Szturchać
źródło
3
Możesz go skrócić za pomocą lambda. Ponadto jest bardzo prawdopodobne, że możesz przetestować tylko na :jdwp, zamiast na -agentlib:jdwp. :Jest odróżnić runjdwpod -agentlib:jdwp. 108 bajtów
Olivier Grégoire
2
103 bajty
Benjamin Urquhart
2
@BenjaminUrquhart Czuję się głupi, że przegapiłem toStringtutaj ulepszenie. Dobry chwyt!
Poke
100 bajtów - zwraca tablicę o długości 1, gdy żaden debugger nie jest aktywny, tablicę o długości co najmniej 2, jeśli istnieje.
Benjamin Urquhart
3

Robotalk , 22 bajty

debug l: chronon l ifg

Jeśli debugger jest aktywny, debuginstrukcja wstrzymuje wykonywanie do końca bieżącej gry. W tym przypadku zmienna „chronon” ma zawsze wartość 1 lub większą podczas odczytu, a program wykonuje nieskończoną pętlę. Jeśli debugger nie jest aktywny, debugoznacza to, że nie można go uruchomić w jednym cyklu. „Chronon” ma teraz wartość 0 podczas odczytu, gałąź „ifg” nie jest pobierana, a wykonanie dochodzi do końca kodu, co jest warunkiem błędu.

znak
źródło
2

MATLAB, 6 bajtów

dbquit

Zatrzymanie w debugerze spowoduje wyjście z trybu debugowania.

Gdy nie jest debugowany, wyświetli komunikat o błędzie, że nie można go użyć, jeśli nie zostanie zatrzymany w debugerze.

Należy zauważyć, że działa to tylko w celu oceny w oknie poleceń (jeden z trzech sposobów uruchamiania kodu MATLAB). Nie będzie działać w funkcji lub skrypcie, ponieważ gdy spróbujesz uruchomić skrypt lub funkcję, przestaniesz być w trybie debugowania podczas wykonywania.

Najbliżej możesz dostać się do czegoś, co będzie działało również w funkcji / skrypcie:

MATLAB, 22 bajty

feature('IsDebugMode')

To jest nieudokumentowane polecenie w MATLAB. Jeśli zatrzymasz się w debugerze w skrypcie lub funkcji, a następnie wywołasz inną funkcję (lub ocenę polecenia), która zawiera powyższą linię, zwróci wartość true.

Poza debuggerem zwróci wartość false.

Jeśli jednak miałbyś po prostu uruchomić skrypt / funkcję zawierającą powyższe, nawet jeśli dodasz punkt przerwania na początku skryptu / funkcji i wykonasz krok dalej, zwróci on wartość false, ponieważ ponownie, po rozpoczęciu wykonywania przestajesz być w debugger tymczasowo.

Tom Carpenter
źródło