কীভাবে কোনও ব্যতিক্রম ছাড়াই .NET এ বর্তমান স্ট্যাক ট্রেস প্রিন্ট করবেন?


348

আমার নিয়মিত সি # কোড রয়েছে। আমার কোনও ব্যতিক্রম নেই । আমি ডিবাগিং উদ্দেশ্যে বর্তমান স্ট্যাক ট্রেসকে প্রোগ্রামগতভাবে লগ করতে চাই। উদাহরণ:

public void executeMethod() 
{
    logStackTrace();
    method();
}

উত্তর:


399

কটাক্ষপাত আছে System.Diagnosticsনামস্থান। সেখানে প্রচুর গুডি!

System.Diagnostics.StackTrace t = new System.Diagnostics.StackTrace();

হুডের নীচে কী চলছে তা শিখতে চারিদিক ঘুরে দেখাই সত্যিই ভাল।

আমি আপনাকে পরামর্শ দিচ্ছি যে লগিং সমাধানগুলিতে আপনার নজর দেওয়া উচিত (যেমন এনএলগ, লগ 4 নেট বা মাইক্রোসফ্ট প্যাটার্নগুলি এবং এন্টারপ্রাইজ লাইব্রেরি অনুশীলন করে) যা আপনার উদ্দেশ্যগুলি অর্জন করতে পারে এবং তারপরে কিছু। শুভকামনা সাথী!


74
মনে রাখবেন যে রাখুন StackTraceহয় ধীর কুকুর - তাই ব্রাত্যভাবে এটি ব্যবহার।
জোনাথন ডিকিনসন

213

এর বিকল্পটি System.Diagnostics.StackTraceহ'ল সিস্টেম.ইনমায়ারমেন্ট.স্ট্যাকট্রেস যা স্ট্যাকট্রেসের স্ট্রিং-প্রতিনিধিত্ব করে।

আর একটি দরকারী বিকল্প হ'ল ভিজ্যুয়াল স্টুডিওতে$CALLER এবং $CALLSTACK ডিবাগিং ভেরিয়েবলগুলি ব্যবহার করা কারণ অ্যাপ্লিকেশনটি পুনর্নির্মাণ না করে এটি রানটাইম সক্ষম করতে পারে।


6
Environment.StackTraceএকটি নতুন উদাহরণ একটি উদাহরণ StackTrace
ড্যানিয়েল

9
@ ড্যানিয়েল: হ্যাঁ, তবে System.Environment.StackTraceতথ্যটি অ্যাক্সেস করার আরও সুবিধাজনক উপায় হতে পারে।
larsmoa

6
@ আন্ড্রেইরিনা: আসলে, আমি বিশ্বাস করি আপনি লাইন নম্বর ব্যবহার করে অ্যাক্সেস করতে পারবেন System.Diagnostics.StackTrace- দেখুন এমএসডিএন.মাইক্রোসফটকম
en

5
এটা কি বিরক্তিকর নয় যা Environment.StackTraceসর্বদা শুরু হয় at System.Environment.GetStackTrace(Exception e, Boolean needFileInfo) at System.Environment.get_StackTrace()? এটি এখনকার স্ট্যাক ট্রেসের অংশ নয় যেহেতু কেউ এটি সন্ধান করছে।
ররি

7
@ ররি, কন্সট্রাক্টর স্ট্যাকট্রেস (ইন্টি স্কিপফ্রেমেস, বুল এফিনিডফিলইনফো) দেখুন, আপনি প্রারম্ভিক ফ্রেমটি এড়িয়ে যেতে পারেন। আইপিএসে পদ্ধতিটি আইপেন করুন এবং এটি কী করে তা আপনি দেখতে পারেন
ওয়াল্টার Vehoeven

39

এই কাজটি করার দুটি পদ্ধতি আছে। System.Diagnostics.StackTrace()আপনি বর্তমান থ্রেড জন্য একটি স্ট্যাক ট্রেস দেব। আপনার যদি কোনও Threadউদাহরণের রেফারেন্স থাকে , আপনি এর ওভারলোড হওয়া সংস্করণের মাধ্যমে স্ট্যাক ট্রেসটি পেতে পারেন StackTrace()

আপনি স্ট্যাক ওভারফ্লো প্রশ্নটিও দেখতে চাইতে পারেন কীভাবে নন-কারেন্ট থ্রেডের স্ট্যাকট্রেস পাবেন?


16

আপনি কোডটি পরিবর্তন না করে ভিজ্যুয়াল স্টুডিও ডিবাগারে এটি করতে পারেন।

  1. আপনি একটি স্ট্যাক ট্রেস দেখতে চান যেখানে একটি ব্রেকপয়েন্ট তৈরি করুন।
  2. ব্রেকপয়েন্টে ডান ক্লিক করুন এবং ভিএস ২০১৫ এ "ক্রিয়া ..." নির্বাচন করুন। VS2010 এ, "যখন হিট ..." নির্বাচন করুন, তারপরে "একটি বার্তা মুদ্রণ করুন" সক্ষম করুন।
  3. "চালিয়ে যান চালিয়ে যান" নির্বাচন করা হয়েছে তা নিশ্চিত করুন।
  4. কিছু পাঠ্য টাইপ করুন যা আপনি মুদ্রণ করতে চান।
  5. আপনি যেখানেই স্ট্যাক ট্রেস দেখতে চান সেখানে $ কলস্ট্যাক যুক্ত করুন।
  6. ডিবাগারে প্রোগ্রামটি চালান।

অবশ্যই, আপনি যদি অন্য কোনও মেশিনে কোডটি চালাচ্ছেন তবে এটি কোনওভাবেই সহায়তা করে না, তবে রিলিজ কোডকে প্রভাবিত না করে বা প্রোগ্রামটি পুনরায় আরম্ভ করার প্রয়োজন ছাড়াই স্বয়ংক্রিয়ভাবে স্ট্যাকের ট্রেসটি স্পিট করতে সক্ষম হওয়া যথেষ্ট সহজ hand


7
আপনি যদি কোনও স্ট্যাক ট্রেস দেখতে চান এবং আপনি ইতিমধ্যে ব্রেক্সিট এ ভিএস ডিবাগারে রয়েছেন তবে কেবল ডিবাগ-> উইন্ডোজ-> কল স্ট্যাকে যান।
খড়গুশ

5
হ্যাঁ, তবে আপনি যদি এটি এভাবে করেন তবে স্ট্যাক ট্রেসটি দেখার জন্য প্রোগ্রামটি থামার দরকার নেই।
হ্যাঙ্ক শুল্টজ

7
Console.WriteLine(
    new System.Diagnostics.StackTrace().ToString()
    );

আউটপুট অনুরূপ হবে:

YourNamespace.Program.executeMethod এ (স্ট্রিং চিত্র)

আপনার নেমস্পেসে.প্রগ্রাম.মেন (স্ট্রিং [] আরগস)

Console.WriteLineআপনার Logপদ্ধতিটি প্রতিস্থাপন করুন । আসলে, সেখানে কোন প্রয়োজন নেই .ToString()Console.WriteLine কেস হিসাবে এটিকে স্বীকার করলে জন্য object। তবে আপনার লগ (স্ট্রিং নাম) পদ্ধতির জন্য আপনার এটির প্রয়োজন হতে পারে।


-2
   private void ExceptionTest()
    {
        try
        {
            int j = 0;
            int i = 5;
            i = 1 / j;
        }
        catch (Exception ex)
        {
            Console.WriteLine("Error: " + ex.Message);
            var stList = ex.StackTrace.ToString().Split('\\');
            Console.WriteLine("Exception occurred at " + stList[stList.Count() - 1]);
        }
    }

আমার জন্য কাজ করে বলে মনে হয়


3
এটি কেবল একটি সুস্পষ্ট ব্যতিক্রম উত্পন্ন করছে। কেন? কেন কেবল নিজের এবং তার মধ্যে একটি ব্যতিক্রম উত্থাপন করবে এমন একটি ত্রুটি না করে স্পষ্টভাবে একটি ব্যতিক্রমকে তাত্ক্ষণিকভাবে ইনস্ট্যান্ট করবেন না? আসল ব্যতিক্রমটি পেতে অতিরিক্ত ক্যাচ যুক্তি দিয়ে কী লাভ? এবং তারপরেও, আপনি এখনও কোনও ব্যতিক্রম ছাড়াই স্ট্যাক ট্রেস কীভাবে পাবেন সে বিষয়ে প্রকৃত পোস্ট করা প্রশ্নটিকে উপেক্ষা করছেন (শিরোনামটি পড়ুন)।
6'18 ফ্ল্যাটার

এটি একটি বৈধ উত্তর, কিন্তু একটি awশ্বর ভয়ঙ্কর সমাধান। এটি ব্যবহার করা উচিত নয় ... @ জেফ আপনি যেখানেই করেছেন সেখানে, অন্য উত্তরগুলির পরামর্শ মতো একটি বর্ধিত কোড সহ এটি প্রতিস্থাপন করুন।
টোমর ডাব্লু
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.