কীভাবে আপনি আপনার (পরিচালনা না করা) কোডটিতে মেমরি ফাঁস সনাক্ত / সনাক্ত করবেন? [বন্ধ]


125

নিয়ন্ত্রণহীন সি / সি ++ কোডে, মেমরি ফাঁস সনাক্ত করার জন্য সেরা অনুশীলনগুলি কী কী? এবং কোডিং গাইডলাইন এড়ানোর জন্য? (যেন এটাই সহজ;)

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

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

আমি আপনার অভিজ্ঞতা, পরামর্শ এবং সম্ভবত এটি সহজতর সরঞ্জামগুলির জন্য কিছু রেফারেন্স আশা করছি।


: তথ্য ফাঁসের নিম্নলিখিত পোস্টে এড়ানো নিরিখে কিছু উপদেশ রয়েছে http://stackoverflow.com/questions/27492/c-memory-management
tonylo

আমি এই প্রশ্নটি এখানে জিজ্ঞাসা করেছি: http://stackoverflow.com dlls এবং ভিজ্যুয়াল লিক ডিটেক্টর দিয়ে দুর্দান্ত সাফল্য পেয়েছে ।
জিম বাক

আমি মেমো ফুটো সনাক্ত করতে ভিজ্যুয়াল স্টুডিও সহ এটি ব্যবহার করেছি। কোডেপ্রজেক্ট
অ্যাপ্লিকেশনস /

1
আপনি সিহর ভ্যালগ্রিন (লিনাক্সের জন্য) বা মুছে ফেলা (উইন্ডোজগুলির জন্য), ভিজ্যুয়াল লিক ডিটেক্টরটিও দেখেন ...
জন স্মিথ

মেমরি ফাঁস সন্ধানের জন্য এখানে চেক করুন: theunixshell.blogspot.com/2013/11/…
বিজয়

উত্তর:


78

যদি আপনার সি / সি ++ কোড * স্নো করতে পোর্টেবল হয়, কিছু বিষয় চেয়ে ভাল Valgrind- র


1
ভালগ্র্যান্ড এখন ওএস এক্সেও কাজ করে, তাই লিনাক্স আপনার একমাত্র বিকল্প নয়।
মাইকেল অ্যান্ডারসন

1
লিনাক্স (এবং ওএস এক্স) এর জন্য ভালগ্রাইন্ড। আপনি যদি উইন্ডোজ - ডিলেটকার ব্যবহার করেন - সর্বোত্তম!
জন স্মিথ

@ জর্ডিবাঞ্জার: চমৎকার! তবে রানটাইম ভিত্তিক। একটি বৃহত কোড বেসের সাথে (লাই ক্ষেত্রে সি তে লিখিত) আপনি মূলত আপনার প্রোগ্রামটি যেভাবে ডিজাইন করা হয়েছিল তা পরীক্ষা করে দেখবেন। কোনও আক্রমণকারী মেমরির ফাঁসির সন্ধান পেতে কোডটি পড়ার সময় কয়েক হাজার প্রয়োজনীয় ঘন্টার মধ্যে থাকতে পারে। আমি জাভাস্ক্রিপ্ট জন্য বিদ্যমান সোর্স কোড বিশ্লেষণের জন্য একটি স্বয়ংক্রিয় সরঞ্জাম আশা করতাম।
ব্যবহারকারী 2284570

65

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

আমি এই নিবন্ধটি দিয়ে শুরু করব: https://msdn.microsoft.com/en-us/library/x98tx3cf(v=vs.140).aspx

এই নিবন্ধগুলির দ্রুত সংক্ষিপ্ত বিবরণ এখানে। প্রথমে এই শিরোলেখগুলি অন্তর্ভুক্ত করুন:

#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>

তারপরে আপনার প্রোগ্রামটি প্রস্থান করার সময় আপনাকে এটিকে কল করতে হবে:

_CrtDumpMemoryLeaks();

বিকল্পভাবে, যদি আপনার প্রোগ্রামটি প্রতিবার একই জায়গায় না বের হয়, আপনি আপনার প্রোগ্রামের শুরুতে এটি কল করতে পারেন:

_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );

এখন যখন প্রোগ্রামটি সমস্ত বরাদ্দগুলি ছাড়বে যা ফ্রি ছিল না তাদের আউটপুট উইন্ডোতে যে ফাইলগুলিতে বরাদ্দ করা হয়েছিল এবং বরাদ্দের ঘটনাটি মুদ্রিত হবে।

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

উপরে বর্ণিত এমএসডিএন লিঙ্কে ব্যাখ্যা করা অন্যান্য কৌশল রয়েছে যা ব্যবহার করা যেতে পারে।


এই পদ্ধতি সম্পর্কে একটি নোট: এটি কেবলমাত্র যদি আপনি মলোক এবং বিনামূল্যে সিদ্ধ সি ব্যবহার করেন তবে এটি কাজ করে। আপনি সি ++ এর নতুন ব্যবহার করছেন এবং মুছলে যদি লাইন নম্বরগুলি অন্তর্ভুক্ত থাকে তবে বিস্তারিত প্রতিবেদন তৈরি হয় না।
জাচ

2
@ জাচ: বাস্তবে আপনি এটি খুব বেশি কাজ করতেও পারেন (যে কোনও কোডের জন্য আপনি আসলে যেকোন উপায়েই
রোমান স্টারকভ

এটি কি রিলিজ মোডে কাজ করবে?
জেভি

1
@ ব্যবহারকারী3152463 নং ডকুমেন্টেশন অনুসারে, এটি কেবলমাত্র ডিবাগ বিল্ডের জন্য কাজ করবে: এমএসডিএন.মাইক্রোসফট /en-us/library/e5ewb1h3(v=vs.71).aspx
ডাস্টি ক্যাম্পবেল

এই লাইনটি ভুল: # নির্ধারিত সিআরটিডিবিজি_এমএপি_এলএল এটি হওয়া উচিত: # নির্ধারণ_সিআরটিডিবিজি_এমএপি_লোক
ফালসো

37

সি ++ এ: আরএআইআই ব্যবহার করুন। স্মার্ট পয়েন্টার পছন্দ std::unique_ptr, std::shared_ptr, std::weak_ptrআপনার বন্ধু।


1
এবং স্টাডি: যখন অ্যারে (বাফারস) বরাদ্দ করা হয় একই ফাংশনে যখন অ্যারে (বাফার )কে বিচ্ছিন্ন করা হয় তখন এর জন্য ভেক্টর একটি দুর্দান্ত প্রতিস্থাপন।
কেজেএওয়াল্ফ

4
কমপক্ষে std :: Auto_ptr এবং boost :: सामायिक_ptr এখনও ফাঁস হওয়ার জন্য সংবেদনশীল।
জ্যাস্পার বেকারস

5
কেবলমাত্র আপনি যদি সেগুলি ভুলভাবে ব্যবহার করেন তবে আমার স্বীকার করা উচিত যে std :: অটো_পিটারের জন্য এটি ভুলভাবে ব্যবহার করা বেশ সহজ।
লিওন টিমারম্যানস

2
যদিও কোডিং মানগুলির জন্য এটি ভাল পরামর্শ, এটি প্রশ্নের উত্তর দেয় না। এমনকি শেয়ারড_পিটার ব্যবহার করে বিজ্ঞপ্তি নির্ভরতাগুলি ফাঁস হতে পারে। এবং আপনার সীমাহীন ক্যাশিং কৌশলগুলির সাথে "ফুটো" থাকতে পারে, যা আবর্জনা-সংগৃহীত ভাষাগুলিতেও প্রযোজ্য।
ক্যাশকো

@ ক্যাশকো: আপনি সঠিক যদিও আমি এটি বাস্তবে এখনও দেখিনি, কারণ সম্ভবত আমি এগুলি অল্প ব্যবহার করছি। নীচের উত্তরটি উদ্ধৃত করতে, "কেবলমাত্র যখন প্রয়োজন তখনই পয়েন্টার ব্যবহার করুন"।
লিওন টিমারম্যানস

28

সি ++ বিকাশকারী হিসাবে এখানে কয়েকটি সহজ নির্দেশিকা রয়েছে:

  1. একেবারে প্রয়োজনীয় হলে পয়েন্টার ব্যবহার করুন
  2. আপনার যদি পয়েন্টারের প্রয়োজন হয় তবে স্মার্টপয়েন্টার সম্ভাবনা থাকলে ডাবল চেক করুন
  3. জিআরএসপি নির্মাতা প্যাটার্ন ব্যবহার করুন ।

মেমরি ফাঁস সনাক্তকরণের জন্য ব্যক্তিগতভাবে আমি সর্বদা ভিজ্যুয়াল লিক সনাক্তকারী ব্যবহার করেছি এবং এটি খুব দরকারী বলে খুঁজে পেয়েছি ।


2
ভিজ্যুয়াল লিক ডিটেক্টর নতুন সাইট vld.codeplex.com এ
KindDragon

ভিএলডি হ'ল একটি দুর্দান্ত লিক ডিটেক্টর - ভিসি ++ ব্যবহার করা প্রত্যেকের জন্য আমি সম্পূর্ণরূপে এটির প্রস্তাব দিই
জাভিড

1
# 1 পয়েন্টের জন্য +1। এটি একেবারে মৌলিক জিনিস। দুর্ভাগ্যক্রমে, এটি আমার কাছে মনে হচ্ছে সবচেয়ে বড় "সি ++" লাইব্রেরিতে স্ট্যাক বরাদ্দ এবং / অথবা আরআইআই সর্বত্র পয়েন্টারদের পক্ষে রাখা বন্ধ করা থাকে, প্রায়শই কোনও অকারণেই অকারণে। সুতরাং, তারা প্রকৃত সি ++ নয়, 'সি ক্লাস সহ' রয়েছে being
আন্ডারস্কোর_ডে

16

আমি এখন অনেক অনেক বছর ধরে ডেভস্টুডিও ব্যবহার করছি এবং এটি সর্বদা আমাকে অবাক করে দেয় ঠিক কতজন প্রোগ্রামার ডিবাগ রান টাইম লাইব্রেরিতে উপলব্ধ মেমরি বিশ্লেষণ সরঞ্জামগুলি সম্পর্কে জানেন না। এখানে শুরু করার জন্য কয়েকটি লিঙ্ক এখানে রয়েছে:

হিপ বরাদ্দ অনুরোধ ট্র্যাকিং - বিশেষত অনন্য বরাদ্দ অনুরোধ নম্বর উপর বিভাগ

_CrtSetDbgFlag

_CrtSetBreakAlloc

অবশ্যই আপনি যদি ডেভস্টুডিও ব্যবহার না করেন তবে এটি বিশেষ সহায়ক হবে না।


10

আমি বিস্মিত হয়েছি কেউ উইন্ডোজ ওএসের জন্য ডিবাগডিয়াগের কথা উল্লেখ করেনি
এটি রিলিজ বিল্ডগুলিতে এবং এমনকি গ্রাহকের সাইটেও কাজ করে।
(আপনাকে কেবলমাত্র প্রকাশের সংস্করণ পিডিবি রাখতে হবে এবং মাইক্রোসফ্টের পাবলিক সিম্বল সার্ভারটি ব্যবহার করার জন্য ডিবাগডিয়াগ কনফিগার করতে হবে)


3
লিঙ্কটি আর কাজ করে না, ডকুমেন্টেশনের জন্য এখানে চেষ্টা করুন: সমর্থন. microsoft.com/kb/2580960
/en-us/download/details.aspx?id=26798

7

ভিজ্যুয়াল লিক সনাক্তকারী একটি খুব ভাল সরঞ্জাম, এটি ভিসি 9 রানটাইমগুলিতে কলগুলি সমর্থন করে না (উদাহরণস্বরূপ MSVCR90D.DLL)।


1
এই সরঞ্জামটি সত্যই নিখুঁত! এটি _CrtDumpMemoryLeaks () ব্যবহার করতে আপনার সমস্যা বাঁচায়; এবং বন্ধুরা, এমএসডিএন-তে বর্ণিত হিসাবে। কেবল একটি অন্তর্ভুক্ত এবং এটি সমস্ত প্রকাশ করে! এমনকি পুরানো সি লাইব্রেরিতেও কাজ করে!
m_p গ্ল্যাডিয়েটর

নতুন সংস্করণ (ভিএস ২০১৩ এর জন্য) এখানে: vld.codeplex.com
দানান

7

ডিবাগ মোডে মাইক্রোসফ্ট ভিসি ++ মেমরি ফাঁস দেখায়, যদিও এটি আপনার ফাঁস কোথায় তা দেখায় না।

আপনি সি ব্যবহার করে থাকেন ++, আপনি সবসময় নতুন স্পষ্টভাবে ব্যবহার এড়িয়ে পারেন: আপনি vector, string, auto_ptr(প্রাক সি ++ 11; দ্বারা প্রতিস্থাপিত unique_ptrC ++ 11), unique_ptr(সি ++ 11) এবং shared_ptr(সি ++ 11) আপনার সহায়।

যখন নতুন অনিবার্য হয় না, তখন এটি কোনও কনস্ট্রাক্টারে লুকিয়ে রাখার চেষ্টা করুন (এবং কোনও ডেস্ট্রাক্টরে মুছে ফেলুন); তৃতীয় পক্ষের API গুলির জন্য একই কাজ করে।


1
এবং তারপরে 3 বা 5 এর নিয়মটি ভুলে যাবেন না
হুমাম হেলফাউই

4

এখানে বিভিন্ন প্রতিস্থাপন "ম্যালোক" লাইব্রেরি রয়েছে যা আপনাকে শেষে কোনও ফাংশন কল করার অনুমতি দেবে এবং এটি আপনাকে সমস্ত নিঃসৃত স্মৃতি সম্পর্কে বলবে এবং অনেক ক্ষেত্রে কে এটিকে প্রথম স্থানটিতে দূষিত করেছে (বা নতুন করেছে) ।


4

আপনি যদি এমএস ভিসি ++ ব্যবহার করে থাকেন তবে আমি কোডেপ্রজেক্ট থেকে জোচেন কালম্বাচের লিকফাইন্ডার থেকে এই নিখরচায় সরঞ্জামটির সর্বাধিক প্রস্তাব দিতে পারি ।

আপনি কেবল আপনার প্রকল্পে ক্লাস যুক্ত করুন, এবং কল করুন

InitAllocCheck(ACOutput_XML)
DeInitAllocCheck()

কোডের আগে এবং পরে আপনি লিক পরীক্ষা করতে চান।

আপনি একবার কোডটি তৈরি এবং চালনা করার পরে, জোচেন একটি ঝরঝরে জিইউআই সরঞ্জাম সরবরাহ করে যেখানে আপনি ফলস্বরূপ .xmlleaks ফাইলটি লোড করতে পারেন এবং কল স্ট্যাকের মাধ্যমে নেভিগেট করতে পারেন যেখানে কোডটির আপত্তিকর লাইনটি অনুসন্ধানের জন্য প্রতিটি ফাঁস তৈরি হয়েছিল।

যৌক্তিক (বর্তমানে আইবিএমের মালিকানাধীন) প্যুরিফাইপ্লাস একই রকম ফ্যাশনে ফাঁসের চিত্র তুলে ধরেছে, তবে আমি ফাঁস ফাইন্ডার সরঞ্জামটি ব্যবহার করা সহজভাবে খুঁজে পেয়েছি যার বোনাসটি কয়েক হাজার ডলার ব্যয় করে না!


1
আমি লিকফাইন্ডারটি পরীক্ষা করে দেখেছি এবং এটি ঠিক আছে, তবে কেবল এফওয়াইআই এটি x64 এর মতো কাজ করবে না কারণ এতে ইনলাইন অ্যাসেম্বলি রয়েছে।
জাচ


3

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


2

আমি মনে করি যে এই প্রশ্নের কোনও সহজ উত্তর নেই। আপনি কীভাবে এই সমস্যার সমাধান করতে পারেন তা নির্ভর করে আপনার প্রয়োজনীয়তার উপর। আপনার কি ক্রস প্ল্যাটফর্ম সমাধান দরকার? আপনি কি নতুন / মুছে ফেলা বা ম্যালোক / ফ্রি (বা উভয়) ব্যবহার করছেন? আপনি কি সত্যিই কেবল "ফাঁস" খুঁজছেন বা বাফার ওভাররানস (বা আন্ডারআনস) সনাক্তকরণের মতো আরও ভাল সুরক্ষা চান?

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

আমি ইউনিক্স পক্ষ সম্পর্কে সহায়তা দেওয়ার জন্য পর্যাপ্ত পরিমাণে জানি না, যদিও আবার অন্যদেরও রয়েছে।

তবে কেবল ফাঁস সনাক্তকরণের বাইরেও বাফার ওভাররনস (বা আন্ডারআনস) এর মাধ্যমে মেমরি দুর্নীতি সনাক্ত করার ধারণা রয়েছে। এই ধরণের ডিবাগ কার্যকারিতা হ'ল আমি মনে করি প্লেইন লিক সনাক্তকরণের চেয়ে আরও কঠিন। আপনি যদি সি ++ অবজেক্টের সাথে কাজ করে থাকেন তবে এই ধরণের সিস্টেমটি আরও জটিল কারণ পলিমারহপিক ক্লাসগুলি মুছে ফেলা হচ্ছে এমন সত্যিকারের বেস পয়েন্টার নির্ধারণের ক্ষেত্রে বিভিন্ন কারণে মুছে ফেলা যায়। আমি কোনও ভাল "ফ্রি" সিস্টেমের কথা জানি না যা অতিরিক্ত লোকদের সুরক্ষা দেয় de আমরা একটি সিস্টেম লিখেছি (ক্রস প্ল্যাটফর্ম) এবং এটি বেশ চ্যালেঞ্জিং বলে মনে হয়েছে।


2

আমি অতীতে সময়ে কিছু ব্যবহার করেছি এমন কিছু প্রস্তাব দিতে চাই: উত্সাহী ফাঁস পরীক্ষক যা উত্স স্তর এবং মোটামুটি স্বয়ংক্রিয়। আমি এটিকে তিনটি কারণে দিচ্ছি:

  1. আপনি এটি দরকারী মনে হতে পারে।

  2. যদিও এটি কিছুটা কুরুচিপূর্ণ, তবে আমি আমাকে আলিঙ্গন করতে দেব না।

  3. যদিও এটি কিছু উইন 32 হুকের সাথে আবদ্ধ, এটি হ্রাস করা সহজ হওয়া উচিত।

এমন কিছু জিনিস রয়েছে যা ব্যবহার করার সময় আপনাকে অবশ্যই যত্নবান হতে হবে: newঅন্তর্নিহিত কোডটিতে ঝুঁকির জন্য এমন কিছু করবেন না, যেগুলি লিকচেক। ইমেজ ডাম্প করে এমন কোডটি চালু (এবং কোনও সমস্যা সমাধান করুন), আপনি একটি বিশাল ফাইল তৈরি করতে পারেন।

নকশার অর্থ হ'ল শিরোনাম সহ সমস্ত কিছু পুনরায় সংবিধান না করে আপনাকে চেকারটি চালু এবং বন্ধ করার অনুমতি দেয়। Leakcheck.h অন্তর্ভুক্ত করুন যেখানে আপনি চেকিং এবং একবার পুনরায় বিল্ড করতে চান। এরপরে, LEAKCHECK # সংজ্ঞাযুক্ত বা তার সাথে ছাড়াই leakcheck.cpp সংকলন করুন এবং তারপরে এটি চালু এবং বন্ধ করতে পুনরায় সংযোগ করুন। আনলিকচেক সহ অন্তর্ভুক্ত এটি কোনও ফাইলে স্থানীয়ভাবে বন্ধ করে দেবে। দুটি ম্যাক্রো সরবরাহ করা হয়েছে: CLEARALLOCINFO () একই ফাইল এবং লাইনের যথাযথভাবে অভিযোগ এড়াতে পারবেন যখন আপনি বরাদ্দকরণ কোডটি লিকচেক না অন্তর্ভুক্ত করবেন তখন। ALLOCFENCE () কেবলমাত্র কোনও বরাদ্দ না করে উত্পন্ন প্রতিবেদনে একটি লাইন ফেলে দেয়।

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

আপনি এটি এখানে খুঁজে পেতে পারেন: http://www.cse.ucsd.edu/~tkammeye/leakcheck.html


2

লিনাক্সের জন্য: গুগল পারফ্টুলগুলি চেষ্টা করে দেখুন

অনেকগুলি সরঞ্জাম রয়েছে যা সমান বরাদ্দ / বিনামূল্যে গণনা করে, গল্জ পারফেক্টুলগুলির পক্ষে:

  • বেশ দ্রুত (ভালগ্রাইন্ডের তুলনায়: খুব দ্রুত)
  • ফলাফলের দুর্দান্ত গ্রাফিকাল প্রদর্শন নিয়ে আসে
  • অন্যান্য দরকারী ক্ষমতা রয়েছে: সিপিইউ-প্রোফাইলিং, মেমরি-ব্যবহারের প্রোফাইলিং ...


2

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

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


2

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

একটি খুব সম্পূর্ণ এবং দ্রুত সরঞ্জাম।


মেমোরি ভ্যালিডেটর সি # এর জন্য ফাইলের নাম এবং লাইন নম্বরও সরবরাহ করে যা আপনার স্থানীয় কোডকে কল করে। x64 সংস্করণটি বিটাতে রয়েছে
স্টিফেন কেলেট

2

আপনি কি কলগুলি রেকর্ড করে তারপরে কলটি সত্যিকারের ফাংশনে পৌঁছে দিয়ে নিজের সিস্কল ফাংশনগুলিকে ইন্টারপোল্ট করে বরাদ্দগুলি গণনা করছেন এবং নিস্তার করছেন?

আপনি লিখিত না যা কোড থেকে উদ্ভূত কলগুলি ট্র্যাক করে রাখতে পারেন এটি কেবলমাত্র।

Ld.so এর জন্য ম্যান পৃষ্ঠাটি একবার দেখুন। অথবা কিছু সিস্টেমে ld.so.1।

এছাড়াও গুগল এলডি_প্রেলএড করুন এবং আপনি www.itworld.com- এ প্রযুক্তিটির ব্যাখ্যা দেওয়ার জন্য কিছু আকর্ষণীয় নিবন্ধ পাবেন।


1

কমপক্ষে এমএস ভিসি ++ এর জন্য সি রানটাইম লাইব্রেরিতে বেশ কয়েকটি ফাংশন রয়েছে যা আমি অতীতে সহায়ক হয়েছি। _Crt*ফাংশনগুলির জন্য এমএসডিএন সহায়তা পরীক্ষা করুন ।


1

পল নেটলের এমএমজিআর আমার একটি দীর্ঘ সময়ের প্রিয় সরঞ্জাম। আপনি আপনার উত্স ফাইলগুলিতে mmgr.h অন্তর্ভুক্ত করেন, TEST_MEMORY সংজ্ঞা দিন এবং এটি আপনার অ্যাপ্লিকেশন চলাকালীন ঘটে যাওয়া মেমরির সমস্যায় পূর্ণ একটি পাঠ্য ফাইল সরবরাহ করে।


1

সাধারণ কোডিং গাইডলাইন:

  • সংস্থানগুলি একই "স্তর" (ফাংশন / শ্রেণি / লাইব্রেরি) এ বরাদ্দ করা হবে যেখানে তাদের বরাদ্দ দেওয়া উচিত।
  • যদি এটি সম্ভব না হয় তবে কিছু স্বয়ংক্রিয় অবলম্বন ব্যবহার করার চেষ্টা করুন (ভাগ করে নেওয়া পয়েন্টারটি বাড়ান ...)

1

মেমোরি ডিবাগিং সরঞ্জামগুলি তাদের ওজনের সোনার পক্ষে মূল্যবান তবে বেশ কয়েক বছর ধরে আমি খুঁজে পেয়েছি যে বেশিরভাগ স্মৃতি / রিসোর্স লিককে প্রথম স্থানে কোড করা থেকে রোধ করতে দুটি সহজ ধারণা ব্যবহার করা যেতে পারে।

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

  2. যতটা সম্ভব স্প্রিংলি রিটার্ন ব্যবহার করুন। যা বরাদ্দ করা হয়েছে তা সম্ভব হলে কেবল এক জায়গায় ছেড়ে দেওয়া উচিত। সংস্থান এবং রিলিজের অধিগ্রহণের শর্তাধীন পথটি যতটা সম্ভব সহজ এবং সুস্পষ্টভাবে নকশাকৃত করা উচিত।


1

এই তালিকার শীর্ষে (যখন আমি এটি পড়ি) ভালগ্রাইন্ড ছিল। আপনি যদি কোনও টেস্ট সিস্টেমে ফুটোটিকে পুনঃ উত্পাদন করতে সক্ষম হন তবে ভালগ্রাইন্ডটি দুর্দান্ত। আমি এটি দুর্দান্ত সাফল্যের সাথে ব্যবহার করেছি।

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

মন্টি কার্লো স্যাম্পলিং ছবিতে আসে। রেমন্ড চেনের ব্লগ নিবন্ধটি পড়ুন, "স্মৃতিশক্তি ফাঁস চিহ্নিত করার দরিদ্র ব্যক্তির উপায়" এবং তারপরে আমার প্রয়োগটি পরীক্ষা করে দেখুন (লিনাক্স ধরে নেওয়া হয়েছে, কেবলমাত্র x86 এবং x86-64 এ পরীক্ষা করা হয়েছে)

http://github.com/tialaramex/leakdice/tree/master


1

মটোরোলা সেল ফোন অপারেটিং সিস্টেমে কাজ করে, সমস্ত মেমরি বরাদ্দগুলি পর্যবেক্ষণ করতে আমরা মেমরি বরাদ্দ পাঠাগারটিকে হাইজ্যাক করেছি। এটি মেমরির বরাদ্দ নিয়ে অনেক সমস্যা খুঁজে পেতে সহায়তা করে। যেহেতু প্রতিরোধটি নিরাময়ের পরে ভাল হয়, তাই আমি ক্লকওয়ার্ক বা পিসি-লিন্টের মতো স্থিতিশীল বিশ্লেষণ সরঞ্জামটি ব্যবহার করার পরামর্শ দেব


স্প্লিন্ট লিঙ্কের জন্য একটি নতুন প্রতিস্থাপন।
মার্ক কেগেল

@ user14788: জিম্পেলের পিসি-লিন্ট পণ্যটি পুরানো ইউনিক্সের তুলনায় অনেক বেশি আধুনিক lint। এটিতে সি ++ এর সাথে সম্পর্কিত অনেকগুলি চেক রয়েছে, যা আফাইক স্প্লিন্ট দেয় না। উত্তরের লিঙ্কটি দেখুন (যা আমি লিন্ট থেকে পিসি-লিন্টে নামকরণ করেছি)।
ড্যান

0

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


0

সনাক্ত করুন:

ডিবাগ সিআরটি

এড়াতে:

স্মার্ট পয়েন্টার, বোহেম জিসি


0

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

http://www.hexco.de/rmdebug/


0

বেশিরভাগ মেমরির প্রোফাইলাররা আমার বৃহত জটিল উইন্ডোজ অ্যাপ্লিকেশনটিকে এমন জায়গায় ধীর করে দেয় যেখানে ফলাফল অকেজো। আমার অ্যাপ্লিকেশনটিতে ফাঁসগুলি সন্ধান করার জন্য একটি সরঞ্জাম রয়েছে যা ভালভাবে কাজ করে: UMDH - http://msdn.microsoft.com/en-us/library/ff560206%28VS.85%29.aspx


আমি দেখছি না যে মন্দা কেন ফলাফলগুলি অকেজো করে। অবশ্যই মেমরি ফাঁস হয় যা প্রোগ্রামটি গতিবেগ নির্বিশেষে ফাঁস হয়। এই সরঞ্জামগুলির মূল কথাটি ফাঁসগুলি সন্ধান করা, তাহলে সমস্যা কোথায়? এটি কি এত আস্তে চলতে পারে যে আপনি শারীরিকভাবে সমস্ত কোড পাথকে প্রোফাইল করার জন্য এটি কভার করতে পারবেন না?
আন্ডারস্কোর_

-1

Mtrace লিনাক্সের জন্য স্ট্যান্ডার্ড বিল্ট-ইন এক হিসাবে উপস্থিত বলে মনে হচ্ছে। পদক্ষেপগুলি হ'ল:

  1. বাশ
    MALLOC_TRACE = / tmp / mtrace.dat রফতানিতে MALLOC_TRACE পরিবেশে পরিবর্তনশীল MALLOC_TRACE সেট আপ করুন
    ;
  2. আপনার মূল উত্স ফাইলটির শীর্ষে # অন্তর্ভুক্ত <mcheck.h> যোগ করুন
  3. Mtrace যোগ করুন (); মেন এবং মুনট্রেস () এর শুরুতে; নীচে (প্রত্যাবর্তনের বিবৃতি দেওয়ার আগে)
  4. ডিবাগ তথ্যের জন্য -g স্যুইচ দিয়ে আপনার প্রোগ্রামটি সংকলন করুন
  5. আপনার প্রোগ্রাম চালান

  6. আপনার_প্রোগ_এক্সই_নাম /tmp/mtrace.dat এর সাথে ফাঁস তথ্য প্রদর্শন করুন
    (আমার ইনস্টল glibc_utils দিয়ে আমার ফেডোরা সিস্টেমে প্রথমে mtrace পার্ল স্ক্রিপ্টটি ইনস্টল করতে হয়েছিল   )

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