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


18

Завдання полягає в тому, щоб написати детерміновану програму (будь-яку мову / ОС), яка не бере ніяких аргументів або іншого вводу і поводиться інакше в налагоджувачі, як вона поводиться, коли не налагоджується .

Наприклад, програма може вивести щось під час налагодження, але нічого не виводить, коли не налагоджується. Або виведіть щось інше в кожному випадку. Або він може вийти з ладу під час налагодження, але не збій, коли не буде налагоджено. Або навпаки.

Застереження та уточнення:

  • Різниці в часі не враховуються.
  • Інтерпретовані мови дозволені.
  • Щоб підкреслити детермінізм: поведінка повинна бути точно відтвореною як у контексті налагодження, так і поза ним.
  • Наявність самого налагоджувача має стати єдиною різницею між двома випадками.
    • Якщо сказати налагоджувачу, щоб додати вхідні дані (stdin або argv ENV чи що завгодно), це обман, налагоджувач повинен запустити програму "як є".
    • Зміна середовища (наприклад, запуск у віртуальній машині чи іншій ОС або зміна налаштувань ОС, таких як обмеження пам’яті) між запуском налагодження та не-налагодженням не дозволяється.

Найкоротший код виграє. Я можу вручити винагороду, яка розкриває щось цікаве про те, як працюють налагоджувачі.


4
Деякі налагоджувачі виводять різний текст при запуску до звичайного компілятора, тому будь-яка програма, схоже, відповідає цим умовам. Це враховує?
Пост Рок-Гарф Хантер

1
Чи не весь вихід надходить з налагоджувача? Мені незрозуміло, що таке вихід налагодження та вихід програми, якщо ми робимо відмінність.
Пост Рок-Гарф Мисливець

5
Визначити налагоджувач?
Артеміда досі не вірить SE

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
чітке призначення в коді С, цього раніше не бачили.
Том

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

9

APL (Dyalog Unicode) , 0 байт

У Dyalog APL виводиться налагоджувач проти відладчика, запускаючи робочу область в інтерпретаторі IDE або інтерпретатора виконання.

Завантаження повністю порожнього робочого простору налаштувань за замовчуванням в інтерпретатор 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

Пітон, 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

JavaScript, 17 байт

debugger
alert(1)

debugger зупиняє виконання, якщо консоль налагодження відкрита, інакше вона нічого не робить


4

Java, 131 102 100 байт

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

При запуску без налагоджувача ця функція повертає масив довжиною 1. Під час роботи з налагоджувачем це повертає масив довжиною 2 (більший за 1).

Спробуйте в Інтернеті!

Це технічно визначає, чи можна було приєднати налагоджувач; ні, якщо один підключений на даний момент ... Не впевнений, чи дійсно це

-23 байти завдяки Олів'є Грегоару за те, що він зазначив, що я можу скоротити те, що шукаю в параметрах часу виконання, і за лямбда-ізінг своєї відповіді

-5 байт завдяки Benjamin Urquhart за те, що він зазначив, що дзвінки toStringнімі, коли я можу дозволити Java неявно перетворювати

-2 байти завдяки Benjamin Urquhart за зміну типу повернення


3
Можна скоротити його за допомогою лямбда. Крім того, дуже ймовірно, що ви можете протестувати лише на :jdwp, а не на -agentlib:jdwp. Це :- відрізнити runjdwpвід -agentlib:jdwp. 108 байт
Олів'є


2
@BenjaminUrquhart Я почуваюсь німим за те, що toStringтут пропущено покращення. Гарний улов!
Poke

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. Якщо ви зупинилися на відладчику в скрипті чи функції, а потім викликаєте іншу функцію (або оцінку команди), що містить вищевказаний рядок, вона поверне вірно.

Поза налагоджувачем він повернеться хибним.

Якщо ви просто запустили скрипт / функцію, що містить вище, навіть якщо ви додали точку розриву на початку скрипту / функції та перейдете через неї, вона повернеться помилковою, тому що знову, як тільки ви почнете виконання, ви перестанете бути в тимчасовий відладчик.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.