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.
Odpowiedzi:
Język maszynowy x86 i x64_64 w systemie Linux i OSX, 1 bajt
Wypróbuj online!
int 3
zgłasza,SIGTRAP
co 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 119 bajtówWypróbuj online!
Liczba całkowita
204
odpowiadaint 3
instrukcji; łącze TIO jest takie samo jak powyżej.źródło
SIGTRAP
to nie skutkujeSIGABRT
, więc część dotycząca dzwonieniaabort()
jest błędna. Po prostu nie ma domyślnej procedury obsługi sygnałuSIGTRAP
, więc jądro kończy proces (a rodzic możeWIFSIGNALED
go wykryć iWTERMSIG
ustalić, który sygnał się wydarzył).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ść:
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:
źródło
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.
Jak: Gdy debugger jest włączony z
console
aktywowaną kartą.console.log
umożliwia wyciek pamięci, a programowi wkrótce zabraknie pamięci. Gdy debugger jest wyłączony, GC wyczyści przydzieloną pamięć i w1
końcu zobaczysz alert z tekstem .źródło
MSVC (64-bit),
5035 bajtówWychodzi 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.
źródło
T-SQL, 6 bajtów
Zawsze zwraca dodatkowy wiersz pod nazwą użytkownika wykonującego, gdy debugger jest aktywny.
źródło
Python, 29 bajtów
Bez debuggera (
python3 /tmp/foo.py
):Za pomocą debuggera (
python3 -m pdb /tmp/foo.py
):ponieważ
pdb
w drugim przypadku jest ładowany do modułu widocznego w aplikacji.źródło
JavaScript, 17 bajtów
debugger
zatrzymuje wykonywanie, jeśli konsola debugowania jest otwarta, w przeciwnym razie nic nie robiźródło
Java,
131 102100 bajtówPodczas 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 wezwania
toString
jest głupie, gdy mogę pozwolić na jawną konwersję Java-2 bajty dzięki Benjaminowi Urquhartowi za zmianę typu zwrotu
źródło
:jdwp
, zamiast na-agentlib:jdwp
.:
Jest odróżnićrunjdwp
od-agentlib:jdwp
. 108 bajtówtoString
tutaj ulepszenie. Dobry chwyt!Robotalk , 22 bajty
Jeśli debugger jest aktywny,
debug
instrukcja 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,debug
oznacza 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.źródło
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
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.
źródło