प्रोग्राम जो डिबगर से अलग / बाहर व्यवहार करता है [बंद]


18

चुनौती एक निर्धारक कार्यक्रम (किसी भी भाषा / ओएस) को लिखने की है जिसमें कोई तर्क या अन्य इनपुट नहीं है और डिबगर में अलग-अलग तरीके से व्यवहार करता है कि कैसे डिबग नहीं होने पर यह कैसे व्यवहार करता है

उदाहरण के लिए, प्रोग्राम डिबग होने पर कुछ आउटपुट कर सकता है लेकिन डिबग नहीं होने पर कुछ भी आउटपुट नहीं करता है। या प्रत्येक मामले में कुछ अलग आउटपुट। या यह डीबग होने पर क्रैश हो सकता है लेकिन डिबग नहीं होने पर क्रैश हो सकता है। या ठीक इसके विपरीत।

कैविट्स और स्पष्टीकरण:

  • समय के अंतर की गिनती नहीं है।
  • व्याख्या की गई भाषाओं की अनुमति है।
  • नियतत्ववाद पर जोर देने के लिए: व्यवहार को डिबगिंग संदर्भ के अंदर और बाहर दोनों ही बिल्कुल प्रतिलिपि प्रस्तुत करना चाहिए।
  • डीबगर की उपस्थिति में ही दो मामलों के बीच अंतर होना चाहिए।
    • डिबगर को इनपुट्स जोड़ने के लिए कहना (stdin या arvv ENV या जो कुछ भी है) धोखा दे रहा है, डिबगर को "as-is" प्रोग्राम चलाना चाहिए।
    • डिबग और गैर-डीबग रन के बीच वातावरण को बदलना (उदाहरण के लिए वर्चुअल मशीन या अलग-अलग ओएस में चलना, या ओएस सेटिंग्स को बदलना)।

सबसे छोटा कोड जीतता है। मैं एक इनाम दे सकता हूं जो डिबगर्स के काम करने के तरीके के बारे में कुछ दिलचस्प खुलासा करता है।


4
कुछ डिबगर सामान्य संकलक के लिए स्टार्टअप पर विभिन्न पाठ का उत्पादन करते हैं, इस प्रकार कोई भी कार्यक्रम इन शर्तों को पूरा करता है। क्या वह माना जाएगा?
पोस्ट रॉक गार्फ हंटर

1
क्या सभी आउटपुट डीबगर से नहीं आते हैं? यह मेरे लिए स्पष्ट नहीं है कि क्या डिबगर आउटपुट बनाम प्रोग्राम आउटपुट है अगर हम एक अंतर बना रहे हैं।
पोस्ट रॉक गार्फ हंटर

5
डिबगर को परिभाषित करें?
आर्टेमिस अभी भी एसई

3
डिबगर से आपका क्या अभिप्राय है? कौनसा?
MilkyWay90

6
आप डिबगर को कैसे परिभाषित करते हैं? यदि एक भाषा दुभाषिया एक "डिबग" मोड का समर्थन करता है (जो, कहते हैं, गैरमानक आदेशों का परिचय देता है), क्या वह गणना करता है?
फल तोड़ना

जवाबों:


31

x86 और x64_64 मशीन भाषा लिनक्स और OSX पर, 1 बाइट

0x0:  CC    int3 

इसे ऑनलाइन आज़माएं!

int 3एक फेंकता है SIGTRAPजो बंद करने के लिए एक डिबगर का कारण होगा जैसे कि यह एक ब्रेकप्वाइंट का सामना करना पड़ा। डिबगर के बाहर, कर्नेल प्रक्रिया को समाप्त करता है (सुधार के लिए @Ruslan के लिए धन्यवाद)।

सी (जीसीसी) (x86 लिनक्स और ओएसएक्स), 14 11 9 बाइट्स

main=204;

इसे ऑनलाइन आज़माएं!

पूर्णांक निर्देश 204से मेल खाता है int 3; TIO लिंक ऊपर जैसा ही है।


1
C कोड में स्पष्ट असाइनमेंट, पहले ऐसा नहीं देखा गया।
टॉम

4
वास्तव SIGTRAPमें परिणाम नहीं होता है SIGABRT, इसलिए कॉलिंग के बारे में हिस्सा abort()गलत है। इसके लिए बस कोई डिफ़ॉल्ट सिग्नल हैंडलर नहीं है SIGTRAP, इसलिए कर्नेल प्रक्रिया को समाप्त कर देता है (और अभिभावक इसका WIFSIGNALEDपता लगाने के WTERMSIGलिए और यह निर्धारित करने के लिए किस सिग्नल का उपयोग कर सकते हैं )।
रुस्लान

9

एपीएल (डायलॉग यूनिकोड) , 0 बाइट्स

Dyalog APL में, डिबगर बनाम कोई डीबगर किसी के कार्यक्षेत्र को IDE दुभाषिया या रनटाइम दुभाषिया में चलाकर चुना नहीं जाता है।

IDE दुभाषिया में पूरी तरह से खाली डिफ़ॉल्ट सेटिंग्स कार्यक्षेत्र लोड हो रहा है, तुरंत उपयोगकर्ता को REPL मोड में छोड़ देता है क्योंकि अनुप्रयोगों को सक्रिय रूप से इसे छोड़ने के लिए दुभाषिया को बंद करना चाहिए:

IDE REPL

हालाँकि, रनटाइम दुभाषिया के पास REPL मोड नहीं होता है, और इसलिए यदि कोई एप्लिकेशन समाप्त हो जाता है (उदाहरण के लिए क्योंकि यह पूरी तरह से खाली है) और दुभाषिया को स्पष्ट रूप से बंद नहीं करता है, तो इसका मतलब है कि REPER मोड तक पहुंचने का प्रयास किया गया है ("" एपीएल सत्र "), और शिकायतें:

रनटाइम डायलॉग


9

फ़ायरफ़ॉक्स पर जावास्क्रिप्ट, 69 बाइट्स

चेतावनी : यह स्क्रिप्ट आपके ब्राउज़र को लटका सकती है! अन्य ब्राउज़रों (जैसे क्रोम) के साथ इसका परीक्षण न करें क्योंकि यह आपके टैब / ब्राउज़र को क्रैश कर सकता है।

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 के साथ प्रयास करना चाह सकते हैं।
रुस्लान

@ रोलन बाह, दिखाती है कि जब से मैंने C का इस्तेमाल किया है, तब से कितना लंबा है ...
नील

7

टी-एसक्यूएल, 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

जावा, 131 102 100 बाइट्स

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

डिबगर के बिना चलने पर यह फ़ंक्शन लंबाई की एक सरणी देता है। 1. डिबगर के साथ चलने पर, यह लंबाई 2 (1 से अधिक) की एक सरणी देता है।

इसे ऑनलाइन आज़माएं!

यदि आप कर सकते हैं यह तकनीकी रूप से पता लगाता है डिबगर संलग्न हैं ; नहीं अगर एक वर्तमान में जुड़ा हुआ है ... यकीन है कि अगर यह मान्य नहीं है

-23 बाइट्स ओलिवियर ग्रेजायर को धन्यवाद लिए कि मैं रनटाइम मापदंडों के लिए जो खोजता हूं उस पर कटौती कर सकता हूं और लंबोदर-मेरे जवाब के लिए

-5 बाइट्स कि कॉल करने के लिए बेंजामिन Urquhart के लिए धन्यवादtoString जब मैं जावा को कथित रूप से परिवर्तित कर सकता हूं तो गूंगा है

वापसी के प्रकार को बदलने के लिए बेंजामिन Urquhart को -2 बाइट्स धन्यवाद


3
आप इसे लंबोदर का उपयोग करके छोटा कर सकते हैं। इसके अलावा, यह बहुत संभावना है कि आप केवल :jdwpइसके बजाय, पर परीक्षण कर सकते हैं -agentlib:jdwp:भेद करने के लिए है runjdwpसे -agentlib:jdwp108 बाइट्स
ओलिवियर ग्रेजायर


2
@BenjaminUrquhart मुझे लगता है कि toStringयहाँ वृद्धि को याद करने के लिए गूंगा हूँ । अच्छी पकड़!
प्रहार

100 बाइट्स - कोई भी डीबगर सक्रिय होने पर लंबाई 1 की सरणी देता है, अगर एक हो सकता है, तो लंबाई कम से कम 2 है।
बेंजामिन यूरेखर्ट

3

रोबोटकल , 22 बाइट्स

debug l: chronon l ifg

यदि डिबगर सक्रिय है, तो debugनिर्देश वर्तमान गेम टिक के अंत तक निष्पादन को रोक देता है। इस मामले में, चर "क्रोनोन" हमेशा पढ़ा जाने पर 1 या अधिक होता है, और कार्यक्रम एक अनंत लूप निष्पादित करता है। यदि डिबगर सक्रिय नहीं है, debugतो एक-चक्र नो-ऑप है। "क्रोनोन" अब 0 है जब पढ़ा जाता है, "ifg" शाखा नहीं ली जाती है, और निष्पादन कोड के अंत तक पहुंच जाता है, जो एक त्रुटि स्थिति है।


2

MATLAB, 6 बाइट्स

dbquit

डीबगर में बंद होने पर, यह डीबगिंग मोड छोड़ देगा।

जब डिबग के तहत नहीं है, तो यह एक त्रुटि संदेश प्रिंट करेगा कि इसे डीबगर में बंद नहीं होने पर उपयोग नहीं किया जा सकता है।

यह ध्यान दिया जाना चाहिए कि यह केवल कमांड विंडो में मूल्यांकन के लिए काम करता है (MATLAB कोड चलाने के तीन तरीकों में से एक)। यह किसी फ़ंक्शन या स्क्रिप्ट में काम नहीं करेगा क्योंकि जैसे ही आप स्क्रिप्ट या फ़ंक्शन को चलाने का प्रयास करते हैं, आप निष्पादन के दौरान डीबग मोड में होना बंद कर देते हैं।

निकटतम आप किसी ऐसी चीज़ को प्राप्त कर सकते हैं जो किसी फ़ंक्शन / स्क्रिप्ट में चलेगी:

MATLAB, 22 बाइट्स

feature('IsDebugMode')

यह MATLAB में एक अनिर्दिष्ट कमांड है। यदि आपको किसी स्क्रिप्ट या फ़ंक्शन में डीबगर में रोक दिया जाता है, और फिर एक अन्य फ़ंक्शन (या कमांड मूल्यांकन) को कॉल करें जिसमें उपरोक्त पंक्ति शामिल है, तो यह सच हो जाएगा।

डिबगर के बाहर यह गलत वापस आ जाएगा।

यदि आप उपरोक्त लिपि / फ़ंक्शन को चलाने के लिए अभी भी थे, भले ही आप स्क्रिप्ट / फ़ंक्शन की शुरुआत में एक ब्रेकपॉइंट जोड़ते हैं और इसके माध्यम से कदम बढ़ाते हैं, तो यह झूठे वापस आ जाएगा, क्योंकि फिर से, एक बार जब आप निष्पादित करना शुरू करते हैं तो आप में होना बंद हो जाते हैं डिबगर अस्थायी रूप से।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.