Программа, которая ведет себя по-разному в / из отладчика [закрыто]


18

Задача состоит в том, чтобы написать детерминированную программу (любой язык / ОС), которая не принимает аргументов или других входных данных и ведет себя в отладчике иначе, чем в случае отладки .

Например, программа может что-то выводить при отладке, но ничего не выводить, когда не отлаживается. Или выводить что-то свое в каждом случае. Или это может произойти сбой при отладке, но не может произойти сбой, если не отладка. Или наоборот.

Предостережения и уточнения:

  • Сроки разницы не в счет.
  • Интерпретированные языки разрешены.
  • Чтобы подчеркнуть детерминизм: поведение должно быть точно воспроизводимым как внутри, так и вне контекста отладки.
  • Наличие самого отладчика должно быть единственной разницей между двумя случаями.
    • Указание отладчику добавить входные данные (stdin или argv ENV или что-то еще) является обманом, отладчик должен запустить программу «как есть».
    • Изменение среды (например, работа на виртуальной машине или в другой ОС или изменение настроек ОС, таких как ограничения памяти) между отладочными и не отладочными запусками не допускается.

Самый короткий код выигрывает. Я могу присудить вознаграждение, которое показывает что-то интересное о том, как работают отладчики.


4
Некоторые отладчики выводят другой текст при запуске в обычный компилятор, поэтому любая программа, кажется, удовлетворяет этим условиям. Это считается?
Пшеничный волшебник

1
Разве все выходные данные не поступают от отладчика? Мне не ясно, что вывод отладчика по сравнению с выводом программы, если мы делаем различие.
Пшеничный волшебник

5
Определить отладчик?
Артемида поддерживает Монику

3
Что вы подразумеваете под отладчиком? Который из?
MilkyWay90

6
Как вы определяете отладчик? Если интерпретатор языка поддерживает режим «отладки» (который, например, вводит нестандартные команды), учитывается ли это?
Esolanging Fruit

Ответы:


31

машинный язык x86 и x64_64 в Linux и OSX, 1 байт

0x0:  CC    int3 

Попробуйте онлайн!

int 3бросает a, SIGTRAPчто приведет к остановке отладчика, как если бы он встретил точку останова. Вне отладчика ядро ​​завершает процесс (спасибо @Ruslan за исправление).

C (gcc) (x86 Linux и OSX), 14 11 9 байт

main=204;

Попробуйте онлайн!

Целое число 204соответствуетint 3 инструкции; ссылка TIO такая же, как и выше.


1
четкое назначение в коде C, не видел этого раньше.
Том

4
На самом деле SIGTRAPне приводит SIGABRT, так что часть о призвании abort()неправильно. Для этого просто нет обработчика сигналов по умолчанию SIGTRAP, поэтому ядро ​​завершает процесс (и родитель может использовать его WIFSIGNALEDдля обнаружения и WTERMSIGопределения того, какой сигнал произошел).
Руслан

9

APL (Dyalog Unicode) , 0 байт

В Dyalog APL отладчик и никакой отладчик не выбираются путем запуска своего рабочего пространства в интерпретаторе IDE или в интерпретаторе времени выполнения.

Загрузка полностью пустого рабочего пространства настроек по умолчанию в интерпретатор IDE немедленно переводит пользователя в режим REPL, так как приложения должны активно отключить интерпретатор, чтобы он мог выйти:

IDE REPL

Однако интерпретатор времени выполнения не имеет режима REPL, и поэтому, если приложение заканчивается (например, из-за того, что оно полностью пусто) и явно не закрывает интерпретатор, оно неявно пытается перейти в режим REPL (" APL сессия "), и жалуется:

Диалог времени выполнения


9

JavaScript на Firefox, 69 байт

ВНИМАНИЕ : Этот скрипт может повесить ваш браузер! НЕ проверяйте его с другими браузерами (например, Chrome), так как это может привести к сбою вашей вкладки / браузера.

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

Как: Когда включен отладчик с consoleактивированной вкладкой. console.logделает возможной утечку памяти, и программе скоро не хватит памяти. Когда отладчик отключен, GC очистит выделенную память, и вы, 1наконец, увидите предупреждение с текстом .


8

MSVC (64-разрядная версия), 50- 35 байт

main(){return IsDebuggerPresent();}

Обычно завершает работу с кодом 0, но 1 под отладчиком (обратите внимание, что WinDbg не отображает автоматически код завершения, но вы можете подделать его, изучив стек). Изменить: Сохранено 15 байт благодаря @Ruslan.


1
MSVC требует прототипов? Затем вы можете попробовать MinGW в режиме C89, чтобы сохранить несколько байтов.
Руслан

@ Руслан Бах, показывает, сколько времени прошло с тех пор, как я использовал C ...
Нил

7

T-SQL, 6 байт

sp_who

Всегда возвращает дополнительную строку под именем исполняющего пользователя, когда отладчик активен.


5

Python, 29 байт

import sys
sys.modules['pdb']

Без отладчика ( python3 /tmp/foo.py):

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

С отладчиком ( python3 -m pdb /tmp/foo.py):

(empty output)

потому что pdbзагружается в видимый приложению модуль во втором случае.



4

Java, 131 102 100 байт

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

При работе без отладчика эта функция возвращает массив длины 1. При работе с отладчиком это возвращает массив длины 2 (больше 1).

Попробуйте онлайн!

Это технически обнаруживает, если вы могли присоединить отладчик; нет, если кто-то в данный момент подключен ... Не уверен, что это действительно

-23 байта благодаря Оливье Грегуару за упоминание о том, что я могу сократить то, что я ищу в параметрах времени выполнения, и за лямбдаизинг своего ответа

-5 байт спасибо Бенджамину Уркварту за то, что он заметилtoString глуп, когда я могу позволить Java неявно преобразовывать

-2 байта спасибо Бенджамину Уркварту за изменение типа возвращаемого значения


3
Вы можете сократить его с помощью лямбды. Кроме того, очень вероятно, что вы можете тестировать только на :jdwp, а не -agentlib:jdwp. Это :отличить runjdwpот -agentlib:jdwp. 108 байтов
Оливье Грегуар


2
@ BenjaminUrquhart Я чувствую себя глупо, что пропустил toStringулучшение здесь. Хороший улов!
Ткните

100 байт - возвращает массив длины 1, если отладчик не активен, массив длиной не менее 2, если он может быть.
Бенджамин Уркхарт

3

Robotalk , 22 байта

debug l: chronon l ifg

Если отладчик активен, debugинструкция приостанавливает выполнение до конца текущего игрового тика. В этом случае переменная "chronon" всегда равна 1 или больше при чтении, и программа выполняет бесконечный цикл. Если отладчик не активен, debugэто один цикл без операции. «Chronon» теперь равен 0 при чтении, ветвь «ifg» не берется, и выполнение достигает конца кода, что является условием ошибки.


2

MATLAB, 6 байтов

dbquit

Когда остановлено в отладчике, это выйдет из режима отладки.

Когда он не находится в режиме отладки, он выведет сообщение об ошибке, что его нельзя использовать, если он не остановлен в отладчике.

Следует отметить, что это работает только для оценки в командном окне (один из трех способов запуска кода MATLAB). Он не будет работать в функции или скрипте, так как после того, как вы попытаетесь запустить скрипт или функцию, вы перестанете находиться в режиме отладки во время выполнения.

Самое близкое, что вы можете получить к чему-то, что также будет выполняться в функции / скрипте:

MATLAB, 22 байта

feature('IsDebugMode')

Это недокументированная команда в MATLAB. Если вы остановились в отладчике в сценарии или функции, а затем вызвали другую функцию (или оценку команды), которая содержит приведенную выше строку, она вернет true.

Вне отладчика он вернет false.

Однако, если бы вы просто запустили скрипт / функцию, содержащую вышеперечисленное, даже если вы добавили точку останова в начале скрипта / функции и прошли через нее, она вернет false, потому что снова, как только вы начнете выполнять, вы перестанете находиться в отладчик временно.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.