কেন জিডিবি "<মান অপ্টিমাইজড আউট>" ​​হিসাবে লাইন এবং প্রিন্ট ভেরিয়েবলগুলির মধ্যে অপ্রত্যাশিতভাবে লাফ দেয়?


84

জিডিবির এই আচরণটি কি কেউ ব্যাখ্যা করতে পারেন?

903 লাইন কার্যকর করার পরে কেন এটি আবার 905 908 910 এর জন্য একই কার্যকর করে?

অন্য জিনিস হ'ল foundএকটি boolটাইপ ভেরিয়েবল, সুতরাং এটি কেন দেখাচ্ছে value optimized out? আমি foundপাশাপাশি মান সেট করতে সক্ষম নই ।

এটি একটি সংকলক অপ্টিমাইজেশন বলে মনে হচ্ছে (এই ক্ষেত্রে এটির -O2); আমি কীভাবে এখনও এর মান সেট করতে পারি found?


8
ডিবাগ করার সময়, সাধারণত -O0 দিয়ে সংকলন করা ভাল ধারণা হিসাবে অনুকূলিতকরণ যেমন ধরণের সমস্যার দিকে পরিচালিত করে।
LiraNuna

উত্তর:


115

অপ্টিমাইজড কোডটি ডিবাগ করতে, সমাবেশ / মেশিনের ভাষা শিখুন।

জিডিবি টিইউআই মোড ব্যবহার করুন। আমি বিয়োগটি এবং এন্টার লিখলে আমার জিডিবি'র অনুলিপি এটি সক্ষম করে। তারপরে সিক্স 2 টাইপ করুন (এটি কন্ট্রোল চেপে ধরে এক্স টি চাপুন, উভয়কে ছেড়ে দিন এবং 2 টিপুন)। এটি এটিকে বিভক্ত উত্স এবং বিচ্ছিন্ন ডিসপ্লেতে রাখবে। তারপরে একবারে একটি মেশিনের নির্দেশাবলী ব্যবহার করুন stepiএবং nextiসরান। টিউআই উইন্ডোগুলির মধ্যে স্যুইচ করতে Cx o ব্যবহার করুন।

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

আপনি কোনও জিডিবি কমান্ড ব্যবহার করে একটি রেজিস্ট্রারের মান প্রদর্শন করতে পারেন p $eax


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

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

@ জ্যান লিঙ্কস: আমি নিশ্চিত না যে আমি আপনার বিশ্লেষণের সাথে একমত। DWARF প্রতীকগুলিতে রেজিস্টারগুলি থেকে মান আহরণের জন্য পর্যাপ্ত তথ্য রয়েছে। সম্ভবত এখানে বোঝানো যা হ'ল সংকলকটি নির্ধারণ করেছে যে চলকটি বর্তমান লাইনে পৌঁছানোর সময় দ্বারা পরিবর্তনশীলটি নিরাপদে ফেলে দেওয়া যেতে পারে। সেক্ষেত্রে স্টোরেজ যেখানে পরিবর্তনশীল জীবন সম্ভবত অন্য কোনও কিছুর জন্য পুনরায় ব্যবহার করা হয়েছে। আমি মনে করি আপনি সঠিক বলেছেন যে চলকটি নিবন্ধিত থাকলে সাধারণত এটি ঘটবে।
ইয়ান নি-লুইস

@ ইয়াননি-লুইস: আপনি জানেন না যে আপনি দ্বৈরফের কোন সংস্করণটি ব্যবহার করছেন তবে আমার অভিজ্ঞতায় জিডিবি কোনও ভেরিয়েবল মুদ্রণ করতে পারে না যা একটি রেজিস্টারে সঞ্চিত রয়েছে।
ঝ্যান লিংস

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

75

অপ্টিমাইজেশন ছাড়াই পুনরায় কম্পাইল করুন (জিসিসিতে -O0)।


17
এমনকি -O0 অপ্টিমাইজড কোড তৈরি করতে পারে (এই মুহুর্তের সাথে লড়াই করার চেষ্টা করছে), তবে আমি কেন তা নিশ্চিত নই।
ক্রিস গ্রেগ

@ ক্রিসগ্রিগ আমিও একই সমস্যা পেয়েছি! আপনি কি সমস্যাটি খুঁজে পেয়েছেন?
পাওলো এম

4
@ পলম দেখে মনে হচ্ছে এটি কোনও ঝনঝন সমস্যা হতে পারে, তাই দুর্ভাগ্যক্রমে, ডিবাগিংয়ের উদ্দেশ্যে আমি g ++ দিয়ে সংকলন করছি।
ক্রিস গ্রেগ

প্রায়শই এটি কোনও সমাধান নয় - বিশেষত যদি আপনার উত্পাদন থেকে একটি মূল ডাম্প থাকে এবং / অথবা আপনি বিকাশের পরিবেশে সমস্যাটি পুনরুত্পাদন করতে অক্ষম হন।
smbear

39

ঘোষণা পাওয়া হিসাবে "উদ্বায়ী"। এটি সংযোজকটিকে এটি অপ্টিমাইজ না করার কথা বলা উচিত।


4
আমি যখন জিডিবি ডিবাগারে কিছু ভেরিয়েবলকে "অস্থির" ঘোষণা করি তখনও এটি এটিকে অপটিমাইজড ভেরিয়েবল হিসাবে দেখায়! এর মধ্যে আর কি আছে?
এম.রেজ

11

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

অপটিমেশন ছাড়া কম্পাইল?


6

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

সাধারণত এমন কিছু সংকলন করে:

"বুল" কীভাবে আসলে কোথাও সংরক্ষণ করা হয় তা লক্ষ্য করুন।


4

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


4

অপ্টিমাইজড প্রোগ্রামগুলি ডিবাগ করার সময় (বাগটি ডিবাগ বিল্ডগুলিতে প্রদর্শিত না হলে এটি প্রয়োজনীয় হতে পারে), আপনাকে প্রায়শই উত্পন্ন সমাবেশ সংকলকটি বুঝতে হবে।

আপনার বিশেষ ক্ষেত্রে, রিটার্নের মানটি cpnd_find_exact_ckptinfoরেজিস্টারে সংরক্ষণ করা হবে যা আপনার প্ল্যাটফর্মে রিটার্ন মানগুলির জন্য ব্যবহৃত হয়। উপর ix86, যে হবে %eax। উপর x86_64: %raxইত্যাদি আপনি '[আপনার প্রসেসর] পদ্ধতি কলিং কনভেনশন' এর জন্য google করার প্রয়োজন হতে পারে যদি এটি এর উপরের কোনটিই নয়।

আপনি এই নিবন্ধটিকে পরীক্ষা GDBকরতে পারেন এবং এটি সেট করতে পারেন। যেমন চালু ix86:


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