প্রথমত, আমি এই প্রশ্নের দৈর্ঘ্যের জন্য ক্ষমাপ্রার্থী।
আমি আয়রনশিমের লেখক । সম্প্রতি আমি শালীন ডিবাগ তথ্য নির্ধারণের জন্য কঠোর পরিশ্রম করছি, যাতে আমি 'নেটিভ'। নেট ডিবাগারটি ব্যবহার করতে পারি।
যদিও এটি আংশিকভাবে সফল হয়েছে, আমি কিছু টিথিং সমস্যা নিয়ে চলেছি।
প্রথম সমস্যাটি পদক্ষেপের সাথে সম্পর্কিত।
স্কিমটি একটি অভিব্যক্তি ভাষা হওয়ার কারণে, সমস্ত বড় .NET ভাষাগুলির মতো নয় যা বিবৃতি (বা লাইন) ভিত্তিক বলে মনে হচ্ছে unlike
মূল কোড (স্কিম) এর মতো দেখাচ্ছে:
(define (baz x)
(cond
[(null? x)
x]
[(pair? x)
(car x)]
[else
(assertion-violation #f "nooo" x)]))
আমি উদ্দেশ্যপ্রণে প্রতিটি এক্সপ্রেশন একটি নতুন লাইনে রেখেছি।
নির্গত কোডটি সি # তে রূপান্তরিত হয় (আইএলএসপি এর মাধ্যমে) দেখে মনে হচ্ছে:
public static object ::baz(object x)
{
if (x == null)
{
return x;
}
if (x is Cons)
{
return Builtins.Car(x);
}
return #.ironscheme.exceptions::assertion-violation+(
RuntimeHelpers.False, "nooo", Builtins.List(x));
}
আপনি দেখতে পারেন, বেশ সহজ।
দ্রষ্টব্য: কোডটি যদি শর্তসাপেক্ষ অভিব্যক্তিতে রূপান্তরিত হয় (? :) সি-তে, পুরো জিনিসটি কেবল একটি ডিবাগ স্টেপ হবে, তা মনে রাখবেন।
উত্স এবং লাইন সংখ্যা সহ এখানে আইএল আউটপুট রয়েছে:
.method public static object '::baz'(object x) cil managed
{
// Code size 56 (0x38)
.maxstack 6
.line 15,15 : 1,2 ''
//000014:
//000015: (define (baz x)
IL_0000: nop
.line 17,17 : 6,15 ''
//000016: (cond
//000017: [(null? x)
IL_0001: ldarg.0
IL_0002: brtrue IL_0009
.line 18,18 : 7,8 ''
//000018: x]
IL_0007: ldarg.0
IL_0008: ret
.line 19,19 : 6,15 ''
//000019: [(pair? x)
.line 19,19 : 6,15 ''
IL_0009: ldarg.0
IL_000a: isinst [IronScheme]IronScheme.Runtime.Cons
IL_000f: ldnull
IL_0010: cgt.un
IL_0012: brfalse IL_0020
IL_0017: ldarg.0
.line 20,20 : 7,14 ''
//000020: (car x)]
IL_0018: tail.
IL_001a: call object [IronScheme]IronScheme.Runtime.Builtins::Car(object)
IL_001f: ret
IL_0020: ldsfld object
[Microsoft.Scripting]Microsoft.Scripting.RuntimeHelpers::False
IL_0025: ldstr "nooo"
IL_002a: ldarg.0
IL_002b: call object [IronScheme]IronScheme.Runtime.Builtins::List(object)
.line 22,22 : 7,40 ''
//000021: [else
//000022: (assertion-violation #f "nooo" x)]))
IL_0030: tail.
IL_0032: call object [ironscheme.boot]#::
'ironscheme.exceptions::assertion-violation+'(object,object,object)
IL_0037: ret
} // end of method 'eval-core(033)'::'::baz'
দ্রষ্টব্য: ডিবাগারটি পুরো পদ্ধতিটি হাইলাইট করা থেকে বিরত রাখতে, আমি পদ্ধতিটি এন্ট্রি পয়েন্টটি মাত্র 1 কলাম প্রশস্ত করি।
আপনি দেখতে পাচ্ছেন, প্রতিটি অভিব্যক্তি সঠিকভাবে একটি লাইনে ম্যাপ করে।
এখন পদক্ষেপ নিয়ে সমস্যা (ভিএস 2010 এ পরীক্ষিত, তবে ভিএস ২০০৮ এ একই / একই সমস্যা):
এগুলি IgnoreSymbolStoreSequencePoints
প্রয়োগ করা হয়নি।
- নাল আর্গ দিয়ে বাজকে কল করুন, এটি সঠিকভাবে কাজ করে। (নাল? এক্স) এর পরে এক্স
- কনস আর্গ দিয়ে বাজকে কল করুন, এটি সঠিকভাবে কাজ করে। (নাল? এক্স) তারপরে (জোড়? x) তারপরে (গাড়ি এক্স)
- অন্যান্য আর্গের সাথে বাজকে কল করুন, এটি ব্যর্থ। (নাল? এক্স) তারপরে (জোড়? এক্স) তারপরে (গাড়ি এক্স) তারপরে (দৃ -়-লঙ্ঘন ...)
আবেদন করার সময় IgnoreSymbolStoreSequencePoints
(প্রস্তাবিত হিসাবে):
- নাল আর্গ দিয়ে বাজকে কল করুন, এটি সঠিকভাবে কাজ করে। (নাল? এক্স) এর পরে এক্স
- কনস আর্গ দিয়ে বাজকে কল করুন, এটি ব্যর্থ। (নাল? এক্স) তারপর (জোড়? এক্স)
- অন্যান্য আর্গের সাথে বাজকে কল করুন, এটি ব্যর্থ। (নাল? এক্স) তারপরে (জোড়? এক্স) তারপরে (গাড়ি এক্স) তারপরে (দৃ -়-লঙ্ঘন ...)
আমি এই মোডে এটিও দেখতে পাই যে কয়েকটি লাইন (এখানে দেখানো হয়নি) ভুলভাবে হাইলাইট করা হয়েছে, সেগুলি 1 দ্বারা বন্ধ রয়েছে।
কারণগুলি কী হতে পারে সে সম্পর্কে এখানে কিছু ধারণা দেওয়া হল:
- টেলকলগুলি ডিবাগারকে বিভ্রান্ত করে
- ওভারল্যাপিং অবস্থানগুলি (এখানে দেখানো হয়নি) ডিবাগারকে বিভ্রান্ত করে (ব্রেকপয়েন্ট নির্ধারণের সময় এটি খুব ভাল করে)
- ????
দ্বিতীয়টি, তবে গুরুতর বিষয়, ডিবাগারটি কিছু ক্ষেত্রে ব্রেকপয়েন্টগুলিকে ব্রেক / হিট করতে ব্যর্থ।
সঠিকভাবে (এবং ধারাবাহিকভাবে) ব্রেক করার জন্য আমি কেবলমাত্র ডিবাগারটি পেতে পারি, এটিই পদ্ধতি প্রবেশের পয়েন্টে।
IgnoreSymbolStoreSequencePoints
প্রয়োগ না করা হলে পরিস্থিতি কিছুটা উন্নত হয়।
উপসংহার
এটি হতে পারে যে ভিএস ডিবাগারটি কেবল সরল বগী :(
তথ্যসূত্র:
আপডেট 1:
মোডবিজি 64৪-বিট অ্যাসেমব্লির জন্য কাজ করে না। সুতরাং যে বাইরে। এটি পরীক্ষা করার জন্য আমার কাছে আর 32-বিট মেশিন নেই। আপডেট: আমি নিশ্চিত যে এটি কোনও বড় সমস্যা নয়, কারও কি ঠিক আছে? সম্পাদনা: হ্যাঁ, আমাকে বোকা, xd কমান্ড প্রম্পটের অধীনে এমডিবিজি শুরু করুন :)
আপডেট 2:
আমি একটি সি # অ্যাপ তৈরি করেছি এবং লাইন তথ্য বিচ্ছিন্ন করার চেষ্টা করেছি।
আমার অনুসন্ধানগুলি:
- যে কোনও
brXXX
নির্দেশের পরে আপনার একটি সিকোয়েন্স পয়েন্ট থাকা দরকার (যদি বৈধ ওরফে '# লাইন লুকানো না থাকে তবে প্রসারণ করতে হবেnop
)। - কোনও
brXXX
নির্দেশের আগে , একটি '# লাইন লুকানো' এবং এnop
।
এটি প্রয়োগ করা, তবে সমস্যাগুলি (একা?) ঠিক করে না?
তবে নিম্নলিখিতগুলি যুক্ত করা, পছন্দসই ফলাফল দেয় :)
- এর পরে
ret
, একটি '# লাইন লুকানো' এবং এnop
।
এটি IgnoreSymbolStoreSequencePoints
প্রয়োগ করা হয়নি এমন মোডটি ব্যবহার করছে । প্রয়োগ করা হলে, কিছু পদক্ষেপ এখনও এড়িয়ে যায় :(
উপরে প্রয়োগ করা হলে এখানে আইএল আউটপুট দেওয়া হয়:
.method public static object '::baz'(object x) cil managed
{
// Code size 63 (0x3f)
.maxstack 6
.line 15,15 : 1,2 ''
IL_0000: nop
.line 17,17 : 6,15 ''
IL_0001: ldarg.0
.line 16707566,16707566 : 0,0 ''
IL_0002: nop
IL_0003: brtrue IL_000c
.line 16707566,16707566 : 0,0 ''
IL_0008: nop
.line 18,18 : 7,8 ''
IL_0009: ldarg.0
IL_000a: ret
.line 16707566,16707566 : 0,0 ''
IL_000b: nop
.line 19,19 : 6,15 ''
.line 19,19 : 6,15 ''
IL_000c: ldarg.0
IL_000d: isinst [IronScheme]IronScheme.Runtime.Cons
IL_0012: ldnull
IL_0013: cgt.un
.line 16707566,16707566 : 0,0 ''
IL_0015: nop
IL_0016: brfalse IL_0026
.line 16707566,16707566 : 0,0 ''
IL_001b: nop
IL_001c: ldarg.0
.line 20,20 : 7,14 ''
IL_001d: tail.
IL_001f: call object [IronScheme]IronScheme.Runtime.Builtins::Car(object)
IL_0024: ret
.line 16707566,16707566 : 0,0 ''
IL_0025: nop
IL_0026: ldsfld object
[Microsoft.Scripting]Microsoft.Scripting.RuntimeHelpers::False
IL_002b: ldstr "nooo"
IL_0030: ldarg.0
IL_0031: call object [IronScheme]IronScheme.Runtime.Builtins::List(object)
.line 22,22 : 7,40 ''
IL_0036: tail.
IL_0038: call object [ironscheme.boot]#::
'ironscheme.exceptions::assertion-violation+'(object,object,object)
IL_003d: ret
.line 16707566,16707566 : 0,0 ''
IL_003e: nop
} // end of method 'eval-core(033)'::'::baz'
আপডেট 3:
উপরের 'সেমি-ফিক্স' নিয়ে সমস্যা। পেভারিফাই এর nop
পরে সমস্ত পদ্ধতিতে ত্রুটিগুলি প্রতিবেদন করে ret
। আমি আসলেই সমস্যাটি বুঝতে পারি না। কিভাবে একটি nop
বিরতি যাচাইকরণ করতে পারেন ret
। এটি ডেড কোডের মতো (এটি এমনকি কোড নয়) ... ওহ ভাল, পরীক্ষা চালিয়ে যায়।
আপডেট 4:
এখনই ঘরে ফিরে, 'অবিশ্বাস্য' কোডটি সরিয়ে নিয়েছে, ভিএস ২০০৮ এ চলছে এবং জিনিসগুলি আরও খারাপ। যথাযথ ডিবাগিংয়ের জন্য অবিশ্বাস্য কোড চালানো সম্ভবত উত্তর হতে পারে। 'রিলিজ' মোডে, সমস্ত আউটপুট এখনও যাচাইযোগ্য হবে।
আপডেট 5:
আমি এখন সিদ্ধান্ত নিয়েছি যে আমার উপরের ধারণাটি আপাতত একমাত্র কার্যকর বিকল্প। যদিও উত্পন্ন কোডটি যাচাইযোগ্য নয়, এখনও আমি VerificationException
এর কোনও সন্ধান করতে পারি নি । এই দৃশ্যের সাথে শেষ ব্যবহারকারীর উপর কী প্রভাব পড়বে তা আমি জানি না।
বোনাস হিসাবে, আমার দ্বিতীয় সমস্যাটিও সমাধান হয়ে গেছে। :)
আমি কী দিয়ে শেষ করেছি তার একটি ছোট স্ক্রিনকাস্ট এখানে । এটি ব্রেকপয়েন্টগুলিতে হিট করে, যথাযথ পদক্ষেপ (ইন / আউট / ওভার) ইত্যাদি করে All সব মিলিয়ে কাঙ্ক্ষিত প্রভাব।
আমি তবে এখনও এটি এটি করার উপায় হিসাবে গ্রহণ করছি না। এটি আমার কাছে অত্যধিক-হ্যাকি অনুভব করে। আসল ইস্যুতে নিশ্চিতকরণ থাকা ভাল হবে।
আপডেট 6:
ভিএস 2010-এ কোডটি পরীক্ষা করার জন্য কেবল পরিবর্তন হয়েছিল, কিছু সমস্যা রয়েছে বলে মনে হচ্ছে:
প্রথম কলটি এখন সঠিকভাবে পদক্ষেপ নেয় না। (দাবি-লঙ্ঘন ...) আঘাত করা হয়। অন্যান্য মামলাগুলি ঠিক কাজ করে।কিছু পুরানো কোড অপ্রয়োজনীয় অবস্থান নির্গত করে। কোড সরানো হয়েছে, প্রত্যাশার মতো কাজ করে। :)- আরও গুরুতরভাবে, প্রোগ্রামটির দ্বিতীয় অনুরোধে ব্রেকপয়েন্টগুলি ব্যর্থ হয় (মেমরি সংকলন ব্যবহার করে, অ্যাসেম্বলিকে ফাইল করতে ডাম্পিং করে ব্রেকপয়েন্টগুলিকে আবার খুশি মনে হয়)।
এই দুটি ক্ষেত্রেই VS2008 এর অধীনে সঠিকভাবে কাজ করে। মূল পার্থক্যটি হ'ল ভিএস2010 এর অধীনে পুরো অ্যাপ্লিকেশনটি। নেট 4 এর জন্য এবং ভিএস 2003 এর অধীনে, নেট 2 তে সংকলিত হয়েছে Both উভয়ই 64-বিট চলমান।
আপডেট 7:
উল্লিখিত মত, আমি এমডিবিজি পেয়েছি 64৪ বিটের অধীনে। দুর্ভাগ্যক্রমে, এটির ব্রেকপয়েন্ট ইস্যুটিও রয়েছে যেখানে আমি প্রোগ্রামটি পুনরায় চালু করতে পারলে এটি বিরতিতে ব্যর্থ হয় (এর দ্বারা বোঝা যায় এটি পুনরায় সংযুক্ত হয়ে যায়, সুতরাং একই সমাবেশটি ব্যবহার করে না, তবে একই উত্সটি ব্যবহার করে)।
আপডেট 8:
ব্রেকআপপয়েন্ট ইস্যু সম্পর্কিত আমি এমএস কানেক্ট সাইটে একটি বাগ দায়ের করেছি ।
আপডেট: স্থির
আপডেট 9:
কিছুক্ষণ চিন্তাভাবনার পরে, ডিবাগারকে খুশি করার একমাত্র উপায় মনে হয় এসএসএ করছে, তাই প্রতিটি পদক্ষেপ বিচ্ছিন্ন এবং ক্রমযুক্ত হতে পারে। যদিও আমি এখনও এই ধারণাটি প্রমাণ করতে পারিনি। তবে এটি যৌক্তিক বলে মনে হয়। স্পষ্টতই, এসএসএ থেকে টেম্পগুলি পরিষ্কার করা ডিবাগিংটি ভেঙে ফেলবে, তবে এটি টগল করা সহজ, এবং এগুলি ছেড়ে যাওয়ার কারণে খুব বেশি ওভারহেড থাকে না।
nop
, পদক্ষেপ ব্যর্থ হয় (আমি এটি নিশ্চিত হয়ে আবার যাচাই করব)। এটি একটি ত্যাগ যা আমি অনুমান করি। ভিএসএস এমনকি প্রশাসকের অধিকার ছাড়াই চলতে পারে এমন নয়: বিটিডব্লিউ রিফ্লেকশন ব্যবহার করে। ডিএলআর মাধ্যমে প্রেরণ করুন (খুব শীঘ্রই ব্রাঞ্চযুক্ত)