디버거 안팎에서 다르게 동작하는 프로그램 [닫기]


18

문제는 인수 나 다른 입력을받지 않고 디버거에서 디버그되지 않을 때의 동작 방식다르게 동작 하는 결정적 프로그램 (모든 언어 / OS)을 작성 하는 것 입니다.

예를 들어, 프로그램은 디버깅 될 때 무언가를 출력 할 수 있지만 디버깅되지 않을 때는 어떤 것도 출력하지 않을 수 있습니다. 또는 각 경우에 다른 것을 출력하십시오. 또는 디버깅 할 때 충돌 할 수 있지만 디버깅되지 않을 때는 충돌하지 않을 수 있습니다. 혹은 그 반대로도.

주의 사항 및 설명 :

  • 타이밍 차이는 포함되지 않습니다.
  • 해석 된 언어가 허용됩니다.
  • 결정론을 강조하려면 : 디버깅 컨텍스트 내외부에서 동작을 정확하게 재현 할 수 있어야합니다.
  • 디버거 자체의 존재는 두 경우의 유일한 차이점이어야합니다.
    • 디버거에 입력 (stdin 또는 argv ENV 또는 기타)을 추가하도록 지시하는 경우 디버거는 "있는 그대로"프로그램을 실행해야합니다.
    • 디버그와 비디 버그 실행 사이의 환경 변경 (예 : 가상 머신 또는 다른 OS에서 실행 또는 메모리 제한과 같은 OS 설정 변경)은 허용되지 않습니다.

가장 짧은 코드가 승리합니다. 디버거 작동 방식에 대한 흥미로운 것을 보여주는 현상금을 수여 할 수 있습니다.


4
일부 디버거는 시작시 일반 컴파일러에 다른 텍스트를 출력하므로 모든 프로그램이 이러한 조건을 충족하는 것 같습니다. 그게 중요합니까?
밀 마법사

1
모든 출력이 디버거에서 나오지 않습니까? 우리가 구별하고 있다면 디버거 출력과 프로그램 출력이 무엇인지는 분명하지 않습니다.
밀 마법사

5
디버거를 정의 하시겠습니까?
Artemis는 Monica

3
디버거 란 무엇을 의미합니까? 어느 것?
MilkyWay90

6
디버거를 어떻게 정의합니까? 언어 인터프리터가 "디버그"모드를 지원하는 경우 (예를 들어, 비표준 명령을 도입하는 경우) 카운트가 중요합니까?
Esolanging 과일

답변:


31

Linux 및 OSX의 x86 및 x64_64 기계 언어, 1 바이트

0x0:  CC    int3 

온라인으로 사용해보십시오!

int 3SIGTRAP중단 점을 발견 한 것처럼 디버거가 중지되도록 a 를 던집니다 . 디버거 외부에서 커널은 프로세스를 종료합니다 (수정을 위해 @Ruslan 덕분에).

C (gcc) (x86 Linux 및 OSX), 14 11 9 바이트

main=204;

온라인으로 사용해보십시오!

정수 204int 3명령어에 해당합니다 . TIO 링크는 위와 같습니다.


1
C 코드에서 명확한 할당은 이전에 보지 못했습니다.

4
실제로 SIGTRAP는 결과가 없으므로 SIGABRT호출에 대한 부분 abort()이 잘못되었습니다. 에 대한 기본 신호 핸들러는 SIGTRAP없으므로 커널이 프로세스를 종료합니다 (부모가 WIFSIGNALED이를 감지하고 WTERMSIG어떤 신호가 발생했는지 확인할 수 있습니다 ).
Ruslan

9

APL (Dyalog Unicode) , 0 바이트

Dyalog APL에서 디버거와 디버거 없음은 IDE 인터프리터 나 런타임 인터프리터에서 작업 공간을 실행하여 선택됩니다.

완전히 비어있는 기본 설정 작업 공간을 IDE 인터프리터에로드하면 응용 프로그램이 인터프리터를 종료하여 종료해야하므로 즉시 사용자를 REPL 모드로 전환합니다.

IDE 교체

그러나 런타임 인터프리터에는 REPL 모드가 없으므로 응용 프로그램이 종료되고 (예 : 완전히 비워서) 인터프리터를 명시 적으로 종료하지 않으면 내재적으로 REPL 모드에 도달하려고 시도한 것입니다 ( " APL 세션 ')하고 다음과 같이 불평합니다.

런타임 대화 상자


9

Firefox의 JavaScript, 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는 종료 코드를 자동으로 표시하지 않지만 스택을 검사하여 위조 할 수 있습니다). 편집 : @Ruslan 덕분에 15 바이트가 절약되었습니다.


1
MSVC에 프로토 타입이 필요합니까? 그런 다음 C89 모드에서 MinGW를 사용하여 바이트를 절약하려고 할 수 있습니다.
Ruslan

@Ruslan Bah, C를 사용한 지 얼마나 지 났는지 보여줍니다.
Neil

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

자바 스크립트, 17 바이트

debugger
alert(1)

debugger 디버거 콘솔이 열려 있으면 실행을 중지하고 그렇지 않으면 아무것도 수행하지 않습니다.


4

자바, 131102100 바이트

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

디버거없이 실행할 때이 함수는 길이 1의 배열을 반환합니다. 디버거로 실행할 때 길이 2의 배열을 반환합니다 (1보다 큼).

온라인으로 사용해보십시오!

이것은 기술적으로 당신 있는지 감지디버거를 연결할 . 현재 연결되어 있지 않은 경우 ... 유효한지 확실하지 않습니다.

Olivier Grégoire 덕분에 -23 바이트 런타임 매개 변수에서 검색하는 내용을 줄이고 내 답변을 람다 크기로 지정할 수 있다고 언급 한

호출에 주목 한 Benjamin Urquhart 덕분에 -5 바이트toStringJava를 암시 적으로 변환 할 수있을 때 이 바보

반환 유형을 변경 한 Benjamin Urquhart 덕분에 -2 바이트


3
람다를 사용하여 줄일 수 있습니다. 또한에서 :jdwp대신 테스트 만 할 가능성이 큽니다 -agentlib:jdwp. 는 :구별하는 것입니다runjdwp 에서 -agentlib:jdwp. 108 바이트
Olivier Grégoire


2
@ BenjaminUrquhart 나는 toString여기서 향상 을 놓친 것에 대해 바보 같은 느낌이 든다 . 잘 잡아!
Poke

100 바이트 -활성화 된 디버거가없는 경우 길이가 1 인 배열을 반환합니다 (있는 경우 길이가 2 이상인 배열).
Benjamin Urquhart

3

로봇 알 , 22 바이트

debug l: chronon l ifg

디버거가 활성화되어 있으면 debug현재 게임 틱이 끝날 때까지 명령이 실행을 일시 중지합니다. 이 경우 변수 "chronon"은 읽을 때 항상 1 이상이며 프로그램은 무한 루프를 실행합니다. 디버거가 활성화되어 있지 않으면 debug1주기 무 작동입니다. 읽을 때 "Chronon"은 이제 0이고 "ifg"분기는 수행되지 않으며 실행은 코드의 끝에 도달하며 이는 오류 조건입니다.


2

MATLAB, 6 바이트

dbquit

디버거에서 중지되면 디버깅 모드가 종료됩니다.

디버그 상태가 아닌 경우 디버거에서 중지하지 않으면 사용할 수 없다는 오류 메시지가 인쇄됩니다.

이것은 명령 창 (MATLAB 코드를 실행하는 세 가지 방법 중 하나)에서만 평가할 수 있습니다. 일단 스크립트 나 함수를 실행하려고하면 실행 중에 디버그 모드에있는 것을 중단하는 것처럼 함수 나 스크립트에서 작동하지 않습니다.

함수 / 스크립트에서 실행될 수있는 가장 가까운 것은 다음과 같습니다.

MATLAB, 22 바이트

feature('IsDebugMode')

이것은 MATLAB에서 문서화되지 않은 명령입니다. 스크립트 나 함수의 디버거에서 중지 된 다음 위 줄이 포함 된 다른 함수 (또는 명령 평가)를 호출하면 true가 반환됩니다.

디버거 외부에서는 false를 반환합니다.

그러나 위의 내용을 포함하는 스크립트 / 함수를 실행했다면 스크립트 / 함수의 시작 부분에 중단 점을 추가하고 단계별로 실행하더라도 다시 시작하면 실행을 중지하기 때문에 false를 반환합니다. 일시적으로 디버거.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.