রানটাইম ত্রুটি হলে কী হবে?


17

কোনও প্রোগ্রামে রানটাইম ত্রুটি হলে কী হবে? কর্মসূচি বাস্তবায়ন বন্ধ হবে? ত্রুটিটি কী তা বলার জন্য আমি আরডুইনো পেতে কিছু উপায় পাচ্ছি?

উত্তর:


21

প্রথমে কী ভুল হতে পারে তার কয়েকটি উদাহরণ দেখা যাক।

একীকরণবিহীন স্থানীয় পরিবর্তনশীল

void setup() {
  int status;
  pinMode(13, OUTPUT);
  digitalWrite(13, status);
} 

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

বৈশ্বিক এবং স্থিতিশীল ভেরিয়েবলগুলির সাথে জিনিসগুলি কিছুটা পৃথক:

গ্লোবাল এবং স্ট্যাটিক ভেরিয়েবলগুলি সি স্ট্যান্ডার্ডের দ্বারা 0 এ প্রাথমিকভাবে গ্যারান্টিযুক্ত।

উত্স: এভিআর লিবিসি রেফারেন্স ম্যানুয়াল - প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী - আমার সমস্ত ভেরিয়েবলগুলি আরম্ভ করা উচিত নয়?

এর অর্থ আপনার কোডে 0 টি করে আরম্ভ করার বিষয়ে আপনার চিন্তা করা উচিত নয়। প্রকৃতপক্ষে স্মৃতি নষ্ট হতে পারে বলে বাস্তবে, আপনার সত্যই এড়ানো উচিত। কেবল 0 ছাড়া অন্য মানগুলিতে তাদের আরম্ভ করুন।

স্মৃতি ওভারফ্লো

int array[10];
int v = array[100];
array[-100] = 10;

এখানে প্রথম সমস্যাটি হ'ল আপনি জানেন না যে ভি-তে কী বরাদ্দ করা হবে তবে সবচেয়ে খারাপটি হচ্ছে আপনি জানেন না আপনি কীটি অ্যাসাইনমেন্টের সাথে -100 এর পজিশনে গোলমাল করেছেন array

একটি অবৈধ নির্দেশে যান

void doSomething( void ) { 
    for (int i = 0; i < 1000; i++); 
}

void setup () 
{
    void (*funcPtr)( void );

    funcPtr = &doSomething;
    funcPtr(); // calls doSomething();

    funcPtr = NULL;
    funcPtr(); // undefined behavior
}

প্রথম কলটি funcPtr()আসলে কল হবে doSomething()। দ্বিতীয়টির মতো কলগুলি অনির্ধারিত আচরণের দিকে নিয়ে যেতে পারে।

অন্যান্য খারাপ জিনিসগুলি ঘটতে পারে

ঠিক আছে, উদাহরণস্বরূপ, আপনি র‌্যামের বাইরে চলে যেতে পারেন। আর কি. যাই হোক না কেন, আমি মনে করি আপনার প্রোগ্রামটি চলতে থাকবে, সম্ভবত আপনি যেভাবে ইচ্ছা করেছিলেন তেমন নয়।

প্রকারের সুরক্ষা

কম্পিউটার সিস্টেমে এ জাতীয় সমস্যাগুলি সাধারণত বিভিন্ন স্তরে মোকাবেলা করা হয়:

  1. সংকলক দ্বারা
  2. প্রোগ্রামিং ভাষার রানটাইম দ্বারা (উদাহরণস্বরূপ জাভা হিসাবে)।
  3. অপারেটিং সিস্টেম বা প্রসেসরের মাধ্যমে (যদি আপনার মেমোরিতে আপনার প্রোগ্রামে সংরক্ষিত ঠিকানার জায়গার সীমানার বাইরে কোনও অবস্থান অ্যাক্সেস করে থাকে তবে ওএস বা প্রসেসরের এটি রোধ করার জন্য সুরক্ষা ব্যবস্থা থাকতে পারে)

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

উত্তরসমূহ

অনুমানগুলি হ'ল আমি উপরে বর্ণিত সমস্ত সমস্যা রানটাইম সমস্যা।

কোনও প্রোগ্রামে রানটাইম ত্রুটি হলে কী হবে?

প্রোগ্রামটি চলতে থাকবে এবং যা ঘটে তা রানটাইম ত্রুটির পার্শ্ব-প্রতিক্রিয়াগুলির উপর নির্ভর করবে। নাল ফাংশন পয়েন্টারের একটি কল সম্ভবত প্রোগ্রামটিকে অজানা স্থানে নিয়ে যাবে।

কর্মসূচি বাস্তবায়ন বন্ধ হবে?

না, এটি এমনভাবে চলতে থাকবে যেন অসাধারণ কিছুই ঘটেনি, সম্ভবত আপনি যা করার ইচ্ছা করেননি তা করছেন। এটি রিসেট হতে পারে বা ভুলভাবে কাজ করতে পারে। এটি কিছু ইনপুটগুলিকে আউটপুটগুলিতে পরিণত করতে এবং একটি সেন্সর বা দুটি জ্বলতে পারে (তবে এটি অত্যন্ত অসম্ভব )।

ত্রুটিটি কী তা বলার জন্য আমি আরডুইনো পেয়ে যাবার কোনও উপায় আছে?

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

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


1
গ্রেট! আমি এখনও অবধি আরডিনো.এসইতে দেখেছি সেরা উত্তর!
দ্য হাট সহ গাই

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

5
@Ricardo - একটি মন্তব্য আমি করতে হবে অ-স্পষ্টভাবে সক্রিয়া ভেরিয়েবল না হয় অগত্যা uninitialized। ফাংশনের বাইরে সংজ্ঞায়িত চলকগুলিতে সাধারণত "স্বয়ংক্রিয় স্টোরেজ সময়কাল" বলা হয় যা পরে শূন্যে ডিফল্ট-আরম্ভ হয়। আরও তথ্যের জন্য en.cppreferences.com/w/cpp/language/default_initialization দেখুন । আরম্ভের আচরণটি এত জটিল যে এটি নির্ভর করা সম্ভবত বিপজ্জনক, তবে কম্বল বিবৃতি দেওয়া সম্ভবত কোনও দুর্দান্ত ধারণা নয় great
কনার ওল্ফ

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

1
এখানে এসআরএএম শেষ হয়ে গেলে কী ঘটে যায় তার একটি আকর্ষণীয় উদাহরণ রয়েছে: ইলেক্ট্রনিক্স.সটাকেক্সচেঞ্জ / প্রশ্নগুলি / ৪২০৯৯/২ । মূলত, স্ট্যাক ক্লোবারগুলি গাদা অংশ বা তার বিপরীতে। এটি স্ট্যাক-ফ্রেমের কিছু অংশকে দূষিত করা (ফাংশন রিটার্ন ভাঙা ইত্যাদি), বা ভেরিয়েবলগুলিতে অবৈধ ডেটা লেখার মতো আকর্ষণীয় কাজ করতে পারে।
কনার ওল্ফ

9

কোনও রানটাইম ব্যতিক্রম নেই। কেবল অপরিবর্তিত আচরণ আছে।

সত্যিই, কোন ব্যতিক্রম আছে এ সব । আপনি যদি কোনও অবৈধ অপারেশন করার চেষ্টা করেন তবে এর ফলাফলগুলি অজানা।

আপনি প্রয়োগ করেন তা বাদে কোনও রানটাইম চেকিং নেই । আপনার প্রোগ্রামটি বেয়ার-মেটাল হার্ডওয়ারে চলছে। এটি ডেস্কটপ সর্বদা রিং -0 এ চালানোর সমতুল্য , কারণ এটিমেগায় রিং থাকে না


6

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

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

এইভাবে আপনি ডেটা হারাচ্ছেন, তবে আপনি যদি বাধা মোডে AVR ডাব্লুডিটি চালান, আপনি এমসিইউ পুনরায় সেট করার আগে কিছু ডেটা সঞ্চয় করতে পারেন।

সুতরাং প্রহরী ডগ টাইমার আপনার কোডটিকে মাঝে মধ্যে অজান্তেই অন্তহীন অন্তহীন লুপগুলি থেকে রক্ষা করতে পারে।

ডকুমেন্টেশন: AVR132: বর্ধিত ওয়াচডগ টাইমার ব্যবহার করে


5

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

এটি করার একটি সাধারণ / দ্রুত / সহজ উপায় হ'ল ভেরিয়েবলের মানগুলি মুদ্রণের জন্য মুদ্রণ বিবৃতি যুক্ত করা বা কেবল যে কোনও কিছু যাতে আপনি জানেন যে প্রোগ্রামটি কোনও সমস্যা ছাড়াই কোডটিতে সেই বিন্দুতে পৌঁছেছে। এটি আপনাকে সমস্যাটিকে আরও বিচ্ছিন্ন করতে সহায়তা করবে।

আমি বিশ্বাস করি ভিজুয়ালমাইক্রো এর মধ্যে কিছু ডিবাগিং কার্যকারিতা রয়েছে।


3

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


-2

আরডুইনো পুনরায় বুট করবে (অর্থাত এটি পুনরায় চালু হবে setup()এবং loop())।


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