2008-09-19 21 views
32

के भीतर से एप्लिकेशन शुरू किया गया था, मैं एक ऐसे अनुप्रयोग पर काम कर रहा हूं जो सिस्टम वाइड कीबोर्ड हुक स्थापित करता है। जब मैं विजुअल स्टूडियो के अंदर से डीबग बिल्डिंग चला रहा हूं, तो मैं इस हुक को इंस्टॉल नहीं करना चाहता हूं (या फिर यह स्टूडियो और अंततः सिस्टम को लटकाएगा), और मैं यह जांचकर इससे बच सकता हूं कि DEBUG प्रतीक परिभाषित किया गया है या नहीं ।जांचें कि क्या विजुअल स्टूडियो

हालांकि, जब मैं आवेदन की रिहाई संस्करण डिबग, वहाँ पता लगाने के लिए कि यह एक ही समस्या से बचने के लिए दृश्य स्टूडियो के अंदर से शुरू कर दिया गया एक तरीका है? को स्टूडियो/कंप्यूटर को पुनरारंभ करना बहुत परेशान है, क्योंकि मैं रिलीज बिल्ड पर काम कर रहा था, और डीबग बिल्ड पर वापस स्विच करने के लिए भूल गए वाले डीबगर का उपयोग करके कुछ बग ठीक करना चाहता हूं।

वर्तमान में मैं इस स्थिति के लिए जाँच करने के लिए कुछ इस तरह का उपयोग करें:

System.Diagnostics.Process currentProcess = System.Diagnostics.Process.GetCurrentProcess(); 
string moduleName = currentProcess.MainModule.ModuleName; 
bool launchedFromStudio = moduleName.Contains(".vshost"); 

मैं इस "जानवर बल रास्ता" है, जो मेरी सेटिंग में कार्य कर कहेंगे, लेकिन मैं जानना चाहूंगा लगा सकते हैं कि एक और (बेहतर) इस परिदृश्य का पता लगाने का तरीका।

+0

नोट: मैं जब इस तकनीक की कोशिश कर रहा vstest.executionengine.x86.exe WebDev.WebServer20.exe दृश्य स्टूडियो परीक्षण से और आईआईएस एक्सप्रेस के तहत चल रहा कोड के माध्यम से शुरू करने निम्नलिखित तार मिला है। तो इसे पढ़ने वाले किसी भी व्यक्ति को तदनुसार कोड समायोजित करने की आवश्यकता हो सकती है। –

उत्तर

57

कोशिश करें: System.Diagnostics.Debugger.IsAttached

+0

(अपडेटेड टिप्पणी) डीबगर। आईएसएटेड पर्याप्त है और कई आवश्यकताओं को पूरा करेगा। हालांकि यह केवल तभी पता लगाता है कि एक डीबगर संलग्न है (WinDbg सहित कोई डीबगर)। यदि डीबगिंग के बिना आईडीई में चल रहा है, तो यह हमेशा विज्ञापित के रूप में काम नहीं करेगा। ओपी का सुझाया गया कोड यह निर्धारित करने का सबसे अच्छा तरीका है कि कार्यक्रम आईडीई में चल रहा है या नहीं। नोट: कोडेडयूआई परीक्षण "vshost" का उपयोग नहीं करते हैं। इसके बजाय वे QTAgent.exe, QTAgent32.exe, और QTAgent64.exe का उपयोग दूसरों के बीच करते हैं। तो 'moduleName.ToLower.Contains ("qtagent") का उपयोग करें; '। – Barniferous

+0

@ बर्निफेरस, ".vshost" के लिए वीएस 2017 की जांच के साथ शुरू करने जैसा दिखता है अब वीएस 2017 के नाम पर इसे जोड़ने से रोक नहीं है। मुझे नहीं पता कि कोडेडयूआई परीक्षण क्या करते हैं ... – Jim

-2

मैं दृढ़ता से कोड के उपयोग को हतोत्साहित करता हूं जो केवल डीबग समय पर चलाया जाता है। क्यूं कर? आप यह सुनिश्चित करना चाहते हैं कि उत्पादन में क्या हो रहा है वह आप स्थानीय रूप से परीक्षण/देख रहे हैं। यह विशेष रूप से निम्न स्तर की भाषा है जिसे आप अक्सर कोड में अंतर के रूप में उपयोग करते हैं, यह संकलक आपके मशीन/आईएल को अलग-अलग उत्पादन करने का कारण बनता है।

शायद किसी समस्या की खोज के प्रयोजनों के लिए, लेकिन यह इसके बारे में है।

+2

इस मामले में वास्तव में यह दूसरी तरफ है। हुक मेरे साथ डीबग करने में सक्षम होने के कारण हस्तक्षेप कर रहे हैं (स्टूडियो और अंततः हर दूसरे एप्लिकेशन को मारने के लिए मैं कुछ भी दर्ज करने का प्रयास करता हूं, क्योंकि ईवेंट को संभाला नहीं जा सकता है), इसलिए मैं उन्हें डीबग बिल्ड में इंस्टॉल नहीं करता हूं। – Grimtron

+0

मैं इस पोस्टर से असहमत हूं। मैं कई अवसरों पर आया हूं जहां मुझे कोड एम्बेड करने की आवश्यकता है जो केवल आईडीई में या आईडीई के तहत कभी नहीं चलता है। आप उस कोड को लिखते हैं, हेक को अलग से जांचें और सुनिश्चित करें कि यह काम करता है, फिर कोड जोड़ें, इसलिए यह केवल तब चलता है जब आप आईडीई में नहीं चल रहे होते हैं। – Barniferous

14

Windows API के साथ काम कर रहे लोगों के लिए, वहाँ एक समारोह जो यदि कोई डिबगर का उपयोग कर मौजूद है आप को देखने के लिए अनुमति देता है है:

if(IsDebuggerPresent()) 
{ 
    ... 
} 

संदर्भ: http://msdn.microsoft.com/en-us/library/ms680345.aspx

+0

मैंने इस दृष्टिकोण का उपयोग किया लेकिन फिर ब्लॉग को निम्न लिंक में देखा जहां उन्होंने दावा किया कि उन्होंने एक स्क्रिप्ट के माध्यम से IsDebuggerPresent को अक्षम किया: https://blogs.msdn.microsoft.com/debuggingtoolbox/2007/05/23/windbg-script- अक्षम -isdebuggerpresent/ – TBD

5

परीक्षण किया जाए या नहीं वर्तमान के मॉड्यूल का नाम प्रक्रिया में स्ट्रिंग ".vshost" है यह निर्धारित करने के लिए सबसे अच्छा तरीका है कि एप्लिकेशन वीएस आईडीई के भीतर से चल रहा है या नहीं।

System.Diagnostics.Debugger.IsAttached संपत्ति का उपयोग करना भी ठीक है, लेकिन यह आप आप वी.एस. आईडीई के भागो आदेश के माध्यम से EXE चला रहे हैं आप डिबग चल रहे हैं या यदि भेद करने के लिए अनुमति नहीं है सीधे निर्माण करें (उदाहरण के लिए विंडोज एक्सप्लोरर या शॉर्टकट का उपयोग करना) और फिर वीएस आईडीई का उपयोग करके इसे संलग्न करना।

तुम देखो मैं एक बार एक (COM संबंधित) डाटा निष्पादन रोकथाम त्रुटि है कि मुझे चलाने के लिए आवश्यक के साथ एक समस्या का सामना करना पड़ा एक बिल्ड पश्चात घटना कि /NXCOMPAT साथ अमल होगा editbin.exe: NO वीएस पर पैरामीटर EXE उत्पन्न किया।

EXE अगर आप सिर्फ F5 मारा संशोधित किसी कारण से नहीं थी और कार्यक्रम चलाने और इसलिए AccessViolationExceptions डीईपी-उल्लंघन करने कोड यदि वी.एस. आईडीई के भीतर से चलाने पर घटित होता है - जो यह बेहद मुश्किल बना दिया डीबग करने के लिए। हालांकि, मैंने पाया कि यदि मैं एक छोटे से कट के माध्यम से जेनरेटेड EXE चलाता हूं और फिर वीएस आईडीई डीबगर संलग्न करता हूं तो मैं AccessViolationExceptions के बिना मेरे कोड का परीक्षण कर सकता हूं।

तो अब मैंने एक ऐसा फ़ंक्शन बनाया है जो "vshost" विधि का उपयोग करता है जिसका उपयोग मैं कुछ कोड को चेतावनी देने या ब्लॉक करने के लिए कर सकता हूं, अगर मैं अपने दैनिक प्रोग्रामिंग को वीएस आईडीई के भीतर से पीस रहा हूं।

यह उन ग़लत AccessViolationExceptions को उठाए जाने से रोकता है और इस प्रकार मैं अपने आवेदन को मोटे तौर पर दुर्घटनाग्रस्त कर देता हूं यदि मैं अनजाने में कुछ ऐसा करने का प्रयास करता हूं जो मुझे पता है तो मुझे दुःख होगा।

+0

सही, रिमोट डीबगिंग, विजुअल स्टूडियो की तुलना में अन्य डिबगर्स जैसी चीजों को भी न भूलें – atlaste

+0

ओपी के पोस्ट के तहत मेरी टिप्पणी देखें, यदि आप एक परीक्षण या आईआईएस एक्सप्रेस प्रोजेक्ट लॉन्च करते हैं तो आपको विभिन्न मॉड्यूल नाम मिलते हैं। –

+0

मैं ".vshost" की भी जांच करता था, लेकिन अब ऐसा लगता है कि ".vshost" के लिए वीएस 2017 की जांच शुरू हो रही है क्योंकि वीएस 2017 ने इसे नाम में जोड़ना बंद कर दिया है। मैं इस धागे पर ठोकर खा रहा हूं वीएस से डीबगिंग का पता लगाने का एक नया तरीका तलाश रहा हूं। – Jim

संबंधित मुद्दे