Задача состоит в том, чтобы написать детерминированную программу (любой язык / ОС), которая не принимает аргументов или других входных данных и ведет себя в отладчике иначе, чем в случае отладки .
Например, программа может что-то выводить при отладке, но ничего не выводить, когда не отлаживается. Или выводить что-то свое в каждом случае. Или это может произойти сбой при отладке, но не может произойти сбой, если не отладка. Или наоборот.
Предостережения и уточнения:
- Сроки разницы не в счет.
- Интерпретированные языки разрешены.
- Чтобы подчеркнуть детерминизм: поведение должно быть точно воспроизводимым как внутри, так и вне контекста отладки.
- Наличие самого отладчика должно быть единственной разницей между двумя случаями.
- Указание отладчику добавить входные данные (stdin или argv ENV или что-то еще) является обманом, отладчик должен запустить программу «как есть».
- Изменение среды (например, работа на виртуальной машине или в другой ОС или изменение настроек ОС, таких как ограничения памяти) между отладочными и не отладочными запусками не допускается.
Самый короткий код выигрывает. Я могу присудить вознаграждение, которое показывает что-то интересное о том, как работают отладчики.
Ответы:
машинный язык x86 и x64_64 в Linux и OSX, 1 байт
Попробуйте онлайн!
int 3
бросает a,SIGTRAP
что приведет к остановке отладчика, как если бы он встретил точку останова. Вне отладчика ядро завершает процесс (спасибо @Ruslan за исправление).C (gcc) (x86 Linux и OSX),
14 119 байтПопробуйте онлайн!
Целое число
204
соответствуетint 3
инструкции; ссылка TIO такая же, как и выше.источник
SIGTRAP
не приводитSIGABRT
, так что часть о призванииabort()
неправильно. Для этого просто нет обработчика сигналов по умолчаниюSIGTRAP
, поэтому ядро завершает процесс (и родитель может использовать егоWIFSIGNALED
для обнаружения иWTERMSIG
определения того, какой сигнал произошел).APL (Dyalog Unicode) , 0 байт
В Dyalog APL отладчик и никакой отладчик не выбираются путем запуска своего рабочего пространства в интерпретаторе IDE или в интерпретаторе времени выполнения.
Загрузка полностью пустого рабочего пространства настроек по умолчанию в интерпретатор IDE немедленно переводит пользователя в режим REPL, так как приложения должны активно отключить интерпретатор, чтобы он мог выйти:
Однако интерпретатор времени выполнения не имеет режима REPL, и поэтому, если приложение заканчивается (например, из-за того, что оно полностью пусто) и явно не закрывает интерпретатор, оно неявно пытается перейти в режим REPL (" APL сессия "), и жалуется:
источник
JavaScript на Firefox, 69 байт
ВНИМАНИЕ : Этот скрипт может повесить ваш браузер! НЕ проверяйте его с другими браузерами (например, Chrome), так как это может привести к сбою вашей вкладки / браузера.
Как: Когда включен отладчик с
console
активированной вкладкой.console.log
делает возможной утечку памяти, и программе скоро не хватит памяти. Когда отладчик отключен, GC очистит выделенную память, и вы,1
наконец, увидите предупреждение с текстом .источник
MSVC (64-разрядная версия),
50-35 байтОбычно завершает работу с кодом 0, но 1 под отладчиком (обратите внимание, что WinDbg не отображает автоматически код завершения, но вы можете подделать его, изучив стек). Изменить: Сохранено 15 байт благодаря @Ruslan.
источник
T-SQL, 6 байт
Всегда возвращает дополнительную строку под именем исполняющего пользователя, когда отладчик активен.
источник
Python, 29 байт
Без отладчика (
python3 /tmp/foo.py
):С отладчиком (
python3 -m pdb /tmp/foo.py
):потому что
pdb
загружается в видимый приложению модуль во втором случае.источник
JavaScript, 17 байт
debugger
останавливает выполнение, если консоль отладчика открыта, иначе она ничего не делаетисточник
Java,
131 102100 байтПри работе без отладчика эта функция возвращает массив длины 1. При работе с отладчиком это возвращает массив длины 2 (больше 1).
Попробуйте онлайн!
Это технически обнаруживает, если вы могли присоединить отладчик; нет, если кто-то в данный момент подключен ... Не уверен, что это действительно
-23 байта благодаря Оливье Грегуару за упоминание о том, что я могу сократить то, что я ищу в параметрах времени выполнения, и за лямбдаизинг своего ответа
-5 байт спасибо Бенджамину Уркварту за то, что он заметил
toString
глуп, когда я могу позволить Java неявно преобразовывать-2 байта спасибо Бенджамину Уркварту за изменение типа возвращаемого значения
источник
:jdwp
, а не-agentlib:jdwp
. Это:
отличитьrunjdwp
от-agentlib:jdwp
. 108 байтовtoString
улучшение здесь. Хороший улов!Robotalk , 22 байта
Если отладчик активен,
debug
инструкция приостанавливает выполнение до конца текущего игрового тика. В этом случае переменная "chronon" всегда равна 1 или больше при чтении, и программа выполняет бесконечный цикл. Если отладчик не активен,debug
это один цикл без операции. «Chronon» теперь равен 0 при чтении, ветвь «ifg» не берется, и выполнение достигает конца кода, что является условием ошибки.источник
MATLAB, 6 байтов
dbquit
Когда остановлено в отладчике, это выйдет из режима отладки.
Когда он не находится в режиме отладки, он выведет сообщение об ошибке, что его нельзя использовать, если он не остановлен в отладчике.
Следует отметить, что это работает только для оценки в командном окне (один из трех способов запуска кода MATLAB). Он не будет работать в функции или скрипте, так как после того, как вы попытаетесь запустить скрипт или функцию, вы перестанете находиться в режиме отладки во время выполнения.
Самое близкое, что вы можете получить к чему-то, что также будет выполняться в функции / скрипте:
MATLAB, 22 байта
Это недокументированная команда в MATLAB. Если вы остановились в отладчике в сценарии или функции, а затем вызвали другую функцию (или оценку команды), которая содержит приведенную выше строку, она вернет true.
Вне отладчика он вернет false.
Однако, если бы вы просто запустили скрипт / функцию, содержащую вышеперечисленное, даже если вы добавили точку останова в начале скрипта / функции и прошли через нее, она вернет false, потому что снова, как только вы начнете выполнять, вы перестанете находиться в отладчик временно.
источник