পিনপয়েন্টিং "শর্তসাপূর্ণ লাফ বা সরানো অবিচ্ছিন্ন মান (গুলি)" ভলগ্রাইন্ড বার্তার উপর নির্ভর করে


166

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

দেখে মনে হচ্ছে যে ভ্যালগ্রিন্ডটি সেই স্থানটি দেখায় যেখানে ইউনিটযুক্ত মানটি ব্যবহার করা শেষ হয় তবে অবিরাম মানটির উত্স হয় না।

==11366== Conditional jump or move depends on uninitialised value(s)
==11366==    at 0x43CAE4F: __printf_fp (in /lib/tls/i686/cmov/libc-2.7.so)
==11366==    by 0x43C6563: vfprintf (in /lib/tls/i686/cmov/libc-2.7.so)
==11366==    by 0x43EAC03: vsnprintf (in /lib/tls/i686/cmov/libc-2.7.so)
==11366==    by 0x42D475B: (within /usr/lib/libstdc++.so.6.0.9)
==11366==    by 0x42E2C9B: std::ostreambuf_iterator<char, std::char_traits<char> > std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::_M_insert_float<double>(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, char, double) const (in /usr/lib/libstdc++.so.6.0.9)
==11366==    by 0x42E31B4: std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::do_put(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, double) const (in /usr/lib/libstdc++.so.6.0.9)
==11366==    by 0x42EE56F: std::ostream& std::ostream::_M_insert<double>(double) (in /usr/lib/libstdc++.so.6.0.9)
==11366==    by 0x81109ED: Snake::SnakeBody::syncBodyPos() (ostream:221)
==11366==    by 0x810B9F1: Snake::Snake::update() (snake.cpp:257)
==11366==    by 0x81113C1: SnakeApp::updateState() (snakeapp.cpp:224)
==11366==    by 0x8120351: RoenGL::updateState() (roengl.cpp:1180)
==11366==    by 0x81E87D9: Roensachs::update() (rs.cpp:321)

যেমন দেখা যায়, এটি বেশ ক্রিপ্টিক হয়ে যায় .. বিশেষত কারণ যখন এটি ক্লাস :: মেথডএক্স দ্বারা বলা হচ্ছে তখন এটি কখনও কখনও ostream ইত্যাদির দিকে সরাসরি নির্দেশ করে ইত্যাদি সম্ভবত এটি অপ্টিমাইজেশনের কারণে?

==11366==    by 0x81109ED: Snake::SnakeBody::syncBodyPos() (ostream:221)

এটার মতই. আমি কি অনুপস্থিত কিছু আছে? অতি দীর্ঘ প্রিন্টফ গোয়েন্দা কাজের অবলম্বন না করে খারাপ মানগুলি ধরার সর্বোত্তম উপায় কী?

হালনাগাদ:

আমি কী ভুল ছিল তা জানতে পেরেছিলাম, তবে আশ্চর্যের বিষয়টি হ'ল, ভালগ্রাইন্ড প্রথমে খারাপ মানটি ব্যবহার করার সময় এটি রিপোর্ট করে নি। এটি একটি গুণ গুণে ব্যবহৃত হয়েছিল:

movespeed = stat.speedfactor * speedfac * currentbendfactor.val;

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

উত্তর:


230

--track-origins=yesঅবিচ্ছিন্ন মানগুলির উত্স ট্র্যাক করতে ভ্যালগ্রিন্ড বিকল্পটি ব্যবহার করুন । এটি এটিকে আরও ধীর করে তুলবে এবং আরও মেমরি গ্রহণ করবে, তবে আপনাকে যদি অবিচ্ছিন্ন মানটির মূলটি খুঁজে বের করতে হবে তবে এটি খুব সহায়ক হতে পারে।

আপডেট: অবিচ্ছিন্ন মানটি যে বিন্দুতে রিপোর্ট করা হয়েছে সে সম্পর্কে, ভ্যালগ্র্যান্ড ম্যানুয়াল জানিয়েছে :

আপনার প্রোগ্রামটি জাঙ্ক (অবিচ্ছিন্ন) ডেটা যতটা পছন্দ পছন্দ করে তার চারপাশে অনুলিপি করতে পারে তা বোঝা গুরুত্বপূর্ণ। মেমচেক এটি পর্যবেক্ষণ করে এবং ডেটা ট্র্যাক করে রাখে, তবে অভিযোগ করে না। কেবলমাত্র একটি অভিযোগ জারি করা হয় যখন আপনার প্রোগ্রামটি এমনভাবে অবিচ্ছিন্ন ডেটা ব্যবহার করার চেষ্টা করে যা আপনার প্রোগ্রামের বাহ্যিকভাবে দৃশ্যমান আচরণকে প্রভাবিত করতে পারে।

থেকে Valgrind- র প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী :

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


1
এই বৈশিষ্ট্যটি ব্যবহার করার জন্য ন্যূনতম ভালগ্রাইন্ড সংস্করণটি কী? আমি ৩.৩.০ ব্যবহার করছি এবং এটি বিকল্পটি পছন্দ করবে বলে মনে হচ্ছে না।
রবার্ট এস বার্নেস

8
@ রবার্ট: - ট্র্যাক-অরিজিনগুলি
ভ্যালগ্রিন্ড

20

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

আপনার যদি আরও সহায়তার প্রয়োজন হয় তবে উত্স কোডের প্রাসঙ্গিক বিভাগগুলি পোস্ট করা কাউকে আরও নির্দেশিকা দেওয়ার অনুমতি দিতে পারে।

সম্পাদনা

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

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


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

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