আরডুইনো সি কোডে মেমরি ওভারফ্লো ত্রুটিগুলি কীভাবে আবিষ্কার করবেন?


10

আরডুইনোতে কোড আপলোড করার পরে সিরিয়াল মনিটরে বেশ কয়েকবার আমার সন্দেহজনক আউটপুট হয়েছিল: যেমন শ্বেতস্পেসের চিরস্থায়ী আউটপুট বা হঠাৎ স্ট্রিং বা স্ক্র্যাম্বলড স্ট্রিংয়ের কাটা।

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

আরডুইনো আইডিই দ্বারা প্রদর্শিত না হওয়া ত্রুটিগুলি কীভাবে আবিষ্কার করব?

উত্তর:


10

MemoryFree গ্রন্থাগার আপনি মেমরি ব্যবহারের সঙ্গে ঝুঁকি খুঁজে পেতে সাহায্য করতে পারেন।

উদাহরণ:

#include <MemoryFree.h>

// On Arduino Duemilanove with ATmega328:
//
// Reported free memory with str commented out:
// 1824 bytes
//
// Reported free memory with str and Serial.println(str) uncommented:
// 1810
//
// Difference: 14 bytes (13 ascii chars + null terminator)

// 14-bytes string
//char str[] = "Hello, world!";


void setup() {
    Serial.begin(115200);
}


void loop() {
    //Serial.println(str);

    Serial.print("freeMemory()=");
    Serial.println(freeMemory());

    delay(1000);
}

আমি নিশ্চিত নই যে মেমরিফ্রি স্ট্যাক পয়েন্টারের জন্য অ্যাকাউন্ট করে। যদি আপনার স্ট্যাক পয়েন্টারটি আপনার হ্যাপ পয়েন্টারের সাথে সংঘর্ষিত হয় তবে আপনি বিভাগীয় ত্রুটিগুলি অনুভব করতে পারেন।


7

র‌্যাম ক্লান্তির সবচেয়ে সাধারণ কারণ হ'ল স্ট্রিং অবজেক্ট ব্যবহার করা বা প্রচুর ধ্রুবক-অক্ষর অ্যারে (সি-স্টাইল স্ট্রিং) ব্যবহার করা।

পরবর্তীতে আইডিই 1.0.4 এর মধ্যে ম্যালোকের জন্য একটি ফিক্স অন্তর্ভুক্ত রয়েছে যা স্ট্রিং-অবজেক্টটি দীর্ঘকাল ধরে জর্জরিত রয়েছে।

ধ্রুবক-অক্ষরযুক্ত স্ট্রিং দ্বারা নষ্ট র‌্যামটি হ্রাস করতে:

Serial.print("Hello World");  // This consumes RAM!

আপনি এফ () ম্যাক্রো ব্যবহার করতে পারেন। এই ম্যাক্রোটি চরিত্রের অ্যারেটিকে PROGMEM এ থাকতে বাধ্য করবে। অ্যারে ব্যবহার করা হয়, কেবলমাত্র একটি বাইট মেমরি গ্রাস করা হয়।

Serial.print(F("Hello World"));  // Keeps the character-array in PROGMEM

মনে রাখবেন যে প্রোগেমে থাকা স্ট্রিংগুলি রানটাইম চলাকালীন পরিবর্তন করা যাবে না।

আবিষ্কার যতদূর না যায়, কোনও ডিবাগার বা মেমরি নিয়ামক ছাড়াই, সমস্যাগুলি কোথায় ঘটছে তা খুঁজে বের করতে আপনাকে পুরানো ধাঁচের গোয়েন্দা কৌশল ব্যবহার করতে হবে।


1
সহায়ক উত্তরের জন্য আপনাকে ধন্যবাদ! আসলেই কোনও আইডিই সমর্থন মেমরি ডিবাগার নেই?
পাওয়ারটাক

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

1
আসলে এফ () সহ আপনার ইঙ্গিতটি আমাদের র‌্যামে কয়েকশো বাইট বাঁচিয়েছে!
পাওয়ারটাক

1
স্ট্রিংগুলি সহ এফ () ব্যবহার করার সময় আমি একটি সংকলন ত্রুটি পেয়েছি //। :-(
পাওয়ারটাক

আমি এই সংকলন ত্রুটিটি
আরডুইনো

3

দেখে মনে হচ্ছে আপনি এখানে রানটাইম ত্রুটির কথা বলছেন (মেমরি ফাঁস / সেগফল্ট টাইপের)।

ইতিমধ্যে লিখিত কোডে এই জাতীয় ত্রুটিগুলি আবিষ্কার করার কোনও উপায় নেই (যদি আপনি কোডের মাধ্যমে খুব সাবধানতার সাথে ঝুঁটি না করেন)। তবে কোডটি লেখার সময় এগুলি হওয়া থেকে রোধ করা বেশ সহজ । লুপগুলি বা পুনরাবৃত্ত কলগুলি লেখার সময় খুব সতর্কতা অবলম্বন করুন; নিজেকে জিজ্ঞাসা করুন "এটি কি হাতছাড়া হতে পারে?" যদি মনে হয় এটির হাত থেকে বেরিয়ে আসার সুযোগ রয়েছে তবে তার বিরুদ্ধে সুরক্ষার জন্য কোড লিখুন।

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

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