आपने मुझे इस के साथ घूमने के लिए प्रेरित किया - मुझे पूरी रात जागने के लिए धन्यवाद। :) यहां एक तरीका है कि आप इसे कर सकते हैं।
विजुअल स्टूडियो वास्तव में बहुत अच्छा ब्रेकपॉइंट समर्थन है। कूलर फीचर्स में से एक यह है कि ब्रेकपॉइंट हिट होने पर आप इसे विजुअल स्टूडियो मैक्रो चलाने के लिए कह सकते हैं। इन मैक्रोज़ के पास विकास पर्यावरण तक पूर्ण पहुंच है, यानी वे अन्य ब्रेकपॉइंट्स सेट करने सहित कीबोर्ड पर मैन्युअल रूप से जो भी कर सकते हैं, कर सकते हैं।
यह समाधान 1 है) सभी अपवादों को पकड़ने के लिए अपने कार्यक्रम में शीर्ष-स्तरीय प्रयास/पकड़ डालें, 2) अपने मैक्रो को चलाने वाले कैच ब्लॉक में ब्रेकपॉइंट डालें, और 3) अपवाद पर मैक्रो देखें यह पता लगाने के लिए कि यह कहां से आया था, और वहां एक ब्रेकपॉइंट लगाया। जब आप इसे डीबगर में चलाते हैं और अपवाद होता है, तो आपके पास कोड की अपमानजनक रेखा पर एक नया ब्रेकपॉइंट होगा।
इस नमूने कार्यक्रम लें:
using System;
namespace ExceptionCallstack
{
class Program
{
static void Main(string[] args)
{
try
{
func1();
}
catch (Exception e)
{
Console.WriteLine("Oops");
Console.ReadKey();
}
}
static void func1()
{
func2();
}
static void func2()
{
func3();
}
static void func3()
{
throw new Exception("Boom!");
}
}
}
उद्देश्य प्रोग्राम के रूप में func3 में है कि throw
पर एक ब्रेकपाइंट सेट करने के लिए जब आप डीबगर में इसे चलाने और त्रुटि मिलती है। ऐसा करने के लिए, पहले एक नया विजुअल स्टूडियो मैक्रो बनाएं (मैंने मेरा सेटब्रेकपॉइंटऑनएक्सप्शन कहा है)। एक नए मॉड्यूल MyDebuggerMacros या जो कुछ भी पर पेस्ट करें:
Imports System
Imports EnvDTE
Imports EnvDTE80
Imports EnvDTE90
Imports System.Diagnostics
Imports System.Text.RegularExpressions
Public Module DebuggerMacros
Sub SetBreakpointOnException()
Dim output As String = ""
Dim stackTrace As String = DTE.Debugger.GetExpression("e.StackTrace").Value
stackTrace = stackTrace.Trim(New Char() {""""c})
Dim stackFrames As String() = Regex.Split(stackTrace, "\\r\\n")
Dim r As New Regex("^\s+at .* in (?<file>.+):line (?<line>\d+)$", RegexOptions.Multiline)
Dim match As Match = r.Match(stackFrames(0))
Dim file As String = match.Groups("file").Value
Dim line As Integer = Integer.Parse(match.Groups("line").Value)
DTE.Debugger.Breakpoints.Add("", file, line)
End Sub
End Module
एक बार यह मैक्रो जगह में है, वापस catch
ब्लॉक करने के लिए जाने के लिए और F9 के साथ एक ब्रेकपाइंट निर्धारित किया है। फिर लाल ब्रेकपॉइंट सर्कल पर राइट-क्लिक करें और "जब हिट करें ..." चुनें। परिणामी संवाद के निचले हिस्से में मैक्रो चलाने के लिए इसे बताने का एक विकल्प है - सूची को छोड़ दें और अपना मैक्रो चुनें। अब जब आपका ऐप अनचाहे अपवाद फेंकता है तो आपको नए ब्रेकपॉइंट प्राप्त करना चाहिए।
नोट्स और प्रतिवाद इस बारे में:
- मैं नहीं एक regex गुरु हूँ, मुझे यकीन है कि किसी और को कुछ बेहतर कोड़ा सकता हूँ।
- यह नेस्टेड अपवादों (इनर एक्सेप्शन प्रॉपर्टी) को संभाल नहीं करता है - यदि आप चाहें तो इसके खिलाफ अपने सिर को हरा सकते हैं। :) GetExpression ("e.InnerException") के लिए जांचें और शायद रिकर्स करें।
- यह उत्तेजना की स्टैकट्रेस स्ट्रिंग पर पाठ पार्सिंग करता है, अधिक परिष्कृत ऑब्जेक्ट ग्राफ़ विश्लेषण नहीं (अपवाद में खोदना। लक्ष्यसाइट और प्रतिबिंब का उपयोग करना)। सामान्य चेतावनी इस दृष्टिकोण की नाजुकता के बारे में लागू होती है।
- किसी कारण से यह कुछ "वैकल्पिक स्थान" में ब्रेकपॉइंट डालता है। एक बार प्रारंभिक डीबगिंग सत्र समाप्त होने के बाद, आपको अपने कोड में नया ब्रेकपॉइंट दिखाई नहीं देता है। लेकिन अगर आप प्रोग्राम को फिर से डीबगर में चलाते हैं, और "सभी ब्रेकपॉइंट अक्षम करें" जैसी चीजें इसे प्रभावित करती हैं। क्या हो रहा है, इसके बारे में जानना अच्छा होगा, अगर कोई इसे साफ़ करने का तरीका ढूंढने जैसा महसूस करता है। शायद .suo फ़ाइल में खोदना?
आशा है कि इससे मदद मिलती है!
स्रोत
2009-05-09 11:07:30
यह होना चाहिए, मैं इसे ++ (IsDebuggerPresent()) डीबगब्रैक() के माध्यम से हर समय C++ में करता हूं; ', मेरे पास यह मेरे कई अपवाद वर्गों के निर्माता में है। –