আমার কি রিলিজ বিল্ডগুলি "পূর্ণ" বা "পিডিবি-কেবল" হিসাবে ডিবাগ তথ্য দিয়ে সংকলন করা উচিত?


114

সি # প্রকল্পের জন্য ভিজ্যুয়াল স্টুডিও 2010-এ, আপনি যদি প্রোজেক্ট প্রোপার্টি> বিল্ড> অ্যাডভান্সড> ডিবাগ ইনফোতে যান তবে আপনার কাছে তিনটি বিকল্প রয়েছে: সম্পূর্ণ, বা কেবল পিডিবি নয়। এই প্রশ্নের উত্তরের ভিত্তিতে , আমি বিশ্বাস করি যে আমি কেবলমাত্র পিডিবি-র মধ্যে পূর্ণ এবং কিছু পার্থক্য বুঝতে পারি। তবে, কোন রিলিজ বিল্ডের জন্য আরও উপযুক্ত? আমি যদি "পূর্ণ" ব্যবহার করি তবে কি পারফরম্যান্সের অস্তিত্ব থাকবে? আমি যদি "পিডিবি-কেবল" ব্যবহার করি তবে প্রোডাকশন সমস্যাগুলি ডিবাগ করা কি আরও কঠিন হবে?

"ফুল" এবং "পিডবোনলি" এর মধ্যে পার্থক্য কী? https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/compiler-options/debug-compiler-option


শুধুমাত্র pdb বা কোনও নয়, সর্বদা মুক্তির জন্য তৈরি হয়।
লেপি

13
@ লেপি ধন্যবাদ তবে আমি সেই অবস্থানটির কিছুটা ন্যায়সঙ্গততার সন্ধান করছি।
রেশনালজিক

সংশ্লিষ্ট প্রশ্ন: stackoverflow.com/questions/1270986/...
janv8000

পারফরম্যান্সের প্রভাব না থাকলে এটি দুর্দান্ত। স্মৃতি প্রভাব সম্পর্কে কী? যদি আমি স্ট্যাকট্রেসের একটি উদাহরণ তৈরি করি এবং ফাইলের তথ্যের জন্য অনুরোধ করি তবে এটি পিডিবি প্রতীক ডেটা থেকে আসতে হবে। সমস্ত প্রতীক অ্যাপ্লিকেশন শুরুতে মেমরিতে লোড করা হয়? এর আনুমানিক স্মৃতি ব্যবহার কী? (যেমন কোড আকারের তুলনায় শতাংশের ওভারহেড))
যয়োও

উত্তর:


90

আমি দিয়ে তৈরি হবে pdb-only। আপনি প্রকাশিত পণ্যের সাথে কোনও ডিবাগার সংযুক্ত করতে সক্ষম হবেন না, তবে ক্র্যাশ ডাম্প পেলে ক্র্যাশ হওয়ার সময় স্ট্যাকের চিহ্ন এবং মেমরি ডাম্পগুলি পরীক্ষা করতে ভিজ্যুয়াল স্টুডিও বা উইনডিবিজি ব্যবহার করতে পারেন ।

আপনি যদি এর fullপরিবর্তে যান pdb-onlyতবে এক্সিকিউটেবলটি কোনও ডিবাগারের সাথে সরাসরি সংযুক্ত করা যায়, আপনি একই সুবিধা পাবেন। আপনার পণ্য এবং গ্রাহকদের প্রদত্ত এটি যুক্তিযুক্ত কিনা তা আপনাকে নির্ধারণ করতে হবে।

PDB ফাইলগুলি কোথাও সংরক্ষণ করার বিষয়ে নিশ্চিত হন যাতে ক্র্যাশ রিপোর্ট আসার পরে আপনি সেগুলি উল্লেখ করতে পারেন those আপনি যদি এই ডিবাগিং প্রতীকগুলি সংরক্ষণ করতে একটি প্রতীক সার্ভার সেট আপ করতে পারেন তবে আরও ভাল।

আপনি যদি এটির সাথে গড়তে চান none, যদি ক্ষেত্রটিতে কোনও ক্রাশ ঘটে তখন আপনার কোনও আশ্রয় নেই। আপনি ক্র্যাশ-এর ​​পরে-বাস্তব পরীক্ষার কোনও ধরণের করতে সক্ষম হবেন না, যা সমস্যাটি সনাক্ত করার আপনার ক্ষমতাকে মারাত্মকভাবে বাধাগ্রস্ত করতে পারে।

কর্মক্ষমতা সম্পর্কে একটি নোট:

জন রবিনস এবং এরিক লিপার্ট উভয়েই /debugপতাকাটি সম্পর্কে ব্লগ পোস্ট লিখেছেন এবং তারা উভয়ই ইঙ্গিত করে যে এই সেটিংটির শূন্য পারফরম্যান্সের প্রভাব রয়েছে । একটি পৃথক /optimizeপতাকা রয়েছে যা নির্দেশ করে যে সংকলকটি অপ্টিমাইজেশন করবে কিনা।


7
@ ম্যাট, / ডিবাগ স্যুইচ-এর এমএসডিএন নিবন্ধটি 'পূর্ণ' সেটিংটি ব্যবহারের পারফরম্যান্স প্রভাব সম্পর্কে স্পষ্টভাবে সতর্ক করেছে:If you use /debug:full, be aware that there is some impact on the speed and size of JIT optimized code and a small impact on code quality with /debug:full. We recommend /debug:pdbonly or no PDB for generating release code.
অ্যালন গুরালেক

3
@ ম্যাট: 'পিডিবি-কেবল' এর তুলনায় যদি 'পূর্ণ' এর কোনও অসুবিধা না থেকে থাকে তবে কেবল তার সুবিধাগুলি রয়েছে তবে 'পিডিবি-কেবল' এমনকি কেন বিদ্যমান? এটি 'পূর্ণ' এর ওপরে ব্যবহার করার কোনও কারণ আছে কি? এছাড়াও, আপনার উচিত 'সম্প্রদায় বিষয়বস্তু' বিভাগের এমএসডিএন নিবন্ধে সংশোধন যুক্ত করা।
অ্যালন গুরালেক

9
লিঙ্কযুক্ত জন রবিন্স নিবন্ধ থেকে @ অ্যালন গুরালেকের উদ্ধৃতি: আসল কারণ: ইতিহাস। .NET 1.0 এ ফিরে কিছু পার্থক্য ছিল, কিন্তু .NET 2.0 এ নেই। দেখে মনে হচ্ছে। নেট 4.0 একই ধাঁচটি অনুসরণ করবে। সিএলআর ডিবাগিং টিমের সাথে ডাবল-চেক করার পরে, কোনও পার্থক্য নেই।
bentayloruk

5
এটা সত্য নয়। আপনি কেবল পিডিবি-দিয়ে বিল্ড করতে পারেন এবং একটি ডিবাগারটি এখনও সংযুক্ত করতে পারেন। আমি ঠিক এটি নিশ্চিত করার জন্য এটি করেছি।
চিহ্নিত করুন

2
"আমি কেবল পিডিবি দিয়ে তৈরি করব You আপনি প্রকাশিত পণ্যের সাথে কোনও ডিবাগার সংযুক্ত করতে সক্ষম হবেন না" এখানে আপনার তথ্যের উত্স কী? যেহেতু @ মার্ক এবং আমি উভয়ই লক্ষ করেছি, এটি সঠিক বলে মনে হচ্ছে না।
এমেমার্ক

66

সতর্কতা / ডিবাগ সুইচের জন্য এমএসডিএন ডকুমেন্টেশন (ভিজ্যুয়াল স্টুডিওতে এটি ডিবাগের তথ্য) পুরানো বলে মনে হচ্ছে! এটি যা এটি যা ভুল

আপনি যদি / ডিবাগ: পূর্ণ ব্যবহার করেন তবে জেনে থাকুন যে জেআইটি অপ্টিমাইজড কোডের গতি এবং আকারে কিছুটা প্রভাব রয়েছে এবং / ডিবাগের সাথে কোডের মানের উপর একটি ছোট প্রভাব রয়েছে: পূর্ণ । আমরা প্রস্তাব / ডিবাগ: pdbonly বা রিলিজ কোড উত্পাদন করার জন্য কোন PDB।

/ ডিবাগের মধ্যে একটি পার্থক্য: পিডবোনি এবং / ডিবাগ: পূর্ণ হ'ল / ডিবাগ সহ: সম্পূর্ণ সংকলকটি একটিকে নির্গত করে DebuggableAttribute, যা জেআইটি সংকলককে বলতে ব্যবহৃত হয় যে ডিবাগ তথ্য উপলব্ধ।

তাহলে, এখন কি সত্য?

  1. কেবলমাত্র পিডিবি - নেট নেট 2.0 এর আগে, এটি প্রকাশিত পণ্য (গ্রাহক মেশিন) থেকে ক্র্যাশ ডাম্পগুলি অনুসন্ধান করতে সহায়তা করেছিল। তবে এটি ডিবাগারটি সংযুক্ত হতে দেয়নি। .NET 2.0 থেকে এটি হয় না। এটা ঠিক হিসাবে একই ফুল
  2. পূর্ণ - এটি ক্র্যাশ ডাম্পগুলি তদন্ত করতে সহায়তা করে এবং বিল্ড প্রকাশের জন্য আমাদের ডিবাগারটিকে সংযুক্ত করার অনুমতি দেয়। তবে এমএসডিএন উল্লেখ করার মতো নয় এটি কার্যকরভাবে প্রভাব ফেলবে না (যেহেতু নেট .০.০)। এটি কেবল পিডিবি-তে ঠিক একই কাজ করে ।

যদি তারা ঠিক একই হয় তবে কেন আমাদের এই বিকল্পগুলি রয়েছে? জন রবিনস (উইন্ডোজ ডিবাগিং গড) জানতে পেরেছেন যে এটি historicalতিহাসিক কারণে রয়েছে।

.NET 1.0 এ ফিরে কিছু পার্থক্য ছিল, কিন্তু .NET 2.0 এ নেই। দেখে মনে হচ্ছে। নেট 4.0 একই ধাঁচটি অনুসরণ করবে। সিএলআর ডিবাগিং টিমের সাথে ডাবল-চেক করার পরে, কোনও পার্থক্য নেই।

JITter একটি ডিবাগ বিল্ড করে কিনা তা নিয়ন্ত্রণ করে / হ'ল অপটিমাইজ সুইচ। <...>

তল লাইনটি হ'ল আপনি নিজের রিলিজটি / অপ্টিমাইজ + এবং যে কোনও / ডিবাগ স্যুইচ দিয়ে বিল্ড তৈরি করতে চান যাতে আপনি উত্স কোড দিয়ে ডিবাগ করতে পারেন।

তারপরে সে তা প্রমাণ করতে চলেছে।

এখন অপ্টিমাইজেশনটি একটি পৃথক সুইচের অংশ /optimize(ভিজ্যুয়াল স্টুডিওতে এটি বলা হয় Optimize code)।

সংক্ষেপে, ডিবাগইনফো কেবলমাত্র পিডিবি বা সম্পূর্ণ সেটিং নির্বিশেষে আমাদের একই ফলাফল হবে। সুপারিশটি হ'ল কোনওটি এড়ানোর নয় কারণ এটি আপনাকে প্রকাশিত পণ্য থেকে ক্র্যাশ ডাম্পগুলি বিশ্লেষণ করতে বা ডিবাগার সংযুক্তকরণ থেকে বঞ্চিত করবে।


3
চমত্কার উত্তর! আমার নিজস্ব তদন্ত (উত্পন্ন ফাইলগুলির তুলনা) একই ফলাফল দেখায়।
এমমার্ক

@ আরপট্টবী আপনি কি রেফারেন্স নির্দিষ্ট করতে পারবেন যে পিডবোনালি এবং পূর্ণ একই? এটি 2019 এবং ডকুমেন্টেশনগুলি এখনও ইঙ্গিত দেয় যে তারা আলাদা এবং পূর্ণরূপে কর্মক্ষমতা হ্রাস পাবে। এবং ভিএস2019 Releaseকনফিগারেশনের ডিবাগ টাইপকে ডিফল্ট সেট করে প্রজেক্ট তৈরি করে pdbonly
জো

@joe MSDN ডকুমেন্টেশন নীচে এক আলোচনা নেই msdn.microsoft.com/en-us/library/8cw0bt21.aspx । এটি একবার দেখুন। একজন অবদানকারী github.com/dotnet/roslyn/blob/master/docs/compilers/CSharp/…- এ আপ-টু-ডেট তথ্যের জন্য নির্দেশ করেছেন যেখানে পিডবোনালি এবং পূর্ণ হিসাবে একই হিসাবে উল্লেখ করা হয়েছে। (এফআইআইআই। আমি আর উইন্ডো বা ভিএস ব্যবহার করি না So সুতরাং আমি সেখানে কী ঘটছে তা অনুসরণ করি না But তবে আমি পর্যালোচনা করে দেখলাম, আমার উত্তরের তথ্যগুলি এখনও প্রাসঙ্গিক এবং এমএসডিএন ডকটি এখনও ভুল))
আরপট্টবী

16

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

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


বোধ হয়। আমি সত্যিই যাইহোক ব্যবহারকারীদের ডিএলএল বিতরণ করি না - এটি একটি এএসপি.নেট অ্যাপ। তবে আপনি কি নিজের উত্তরটি বাড়িয়ে তুলতে এবং ন্যায়সঙ্গত করতে পারেন কেন আপনার "পিডিবি-কেবল" বনাম "পূর্ণ" দিয়ে যাওয়া উচিত? এটি একটি পারফরম্যান্স সমস্যা?
রেশনালজিক

@ জেকোহেলহেপ: আমি যুক্ত করতে চাই যদিও ডিবাগিং রিলিজটি কিছুটা জটিল কারণ আপনি কিছু তথ্য হারাবেন (জেআইটির কারণে)। প্রায় সর্বদা, আপনি পদ্ধতি আর্গুমেন্টের মান দেখতে সক্ষম হবেন না। এই কার্যসংক্রান্ত করার জন্য, আপনাকে সাময়িকভাবে নিষ্ক্রিয় জে আই টি JIT অপ্টিমাইজেশান ব্যবহার করতে পারেন এই
ইলিয়ান পিনজন

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

"পূর্ণ" সেটিং ব্যবহার করে না একটি কার্যকারিতা প্রভাব আছে। এটি কেবল একটি চলমান প্রক্রিয়াতে কোনও ডিবাগারকে সংযুক্ত করার অনুমতি দেয়।
ম্যাট ডিলার্ড

1
এমএসডিএন ম্যাট, এমএসডিএন.মাইক্রোসফটকম / en-us / library / 8cw0bt21 এ ভাল প্রশ্ন , আমি নিজের উত্তরটির জন্য অপেক্ষা করছি।
লুক হটনের

4

আমি একটি অপরিবর্তিত ব্যতিক্রম হ্যান্ডলার লেখার প্রক্রিয়ায় আছি এবং যখন পিডিবি-কেবল ব্যবহৃত হয় তখন স্ট্যাক ট্রেসটিতে লাইন নম্বর অন্তর্ভুক্ত থাকে, অন্যথায় আমি কিছুই না নির্বাচন করলে আমি কেবল সাব / ফাংশনটির নাম পাই।

যদি আমি .pdb বিতরণ না করি তবে আমি পিডিবি-কেবল বিল্ড দিয়েও স্ট্যাক ট্রেসে লাইন নম্বরটি পাই না।

সুতরাং, আমি আমার ভিবি অ্যাপ্লিকেশনটি থেকে এক্সপি সহ পিডিবি বিতরণ করছি (একটি ল্যানে এক্সসিপিপি স্থাপন করুন)।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.