আপনি কীভাবে বাইনারি ফর্ম্যাটটি ডিবাগ করবেন?


11

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

দেখে মনে হচ্ছে আপনি বাইনারিটি বিভিন্ন রূপে দেখতে পাচ্ছেন (আমার ক্ষেত্রে আমি এটি 8-বিট অংশে দশমিক সংখ্যা হিসাবে দেখতে চাই, কারণ এটি ইনপুটটির খুব কাছেই রয়েছে)। প্রকৃতপক্ষে, কিছু সংখ্যা 16 বিট, কিছু 8, কিছু 32, ইত্যাদি So তাই সম্ভবত বাইনারি দেখার জন্য কোনও উপায় থাকবে মেমরিতে হাইলাইট করা এই বিভিন্ন সংখ্যার প্রত্যেকটির সাথে way

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

আমি আরও ভাবছি যে বর্তমানে এই ধরণের জিনিসটি ডিবাগ করার সাধারণ উপায়টি কী, তাই সম্ভবত আমি সে থেকে কী চেষ্টা করব সে সম্পর্কে কিছু ধারণা পেতে পারি।


75
আপনি "হেক্সডাম্প সরাসরি ব্যবহার করুন, এবং এটি এবং এটি অতিরিক্তভাবে করুন" বলে একটি উত্তর পেয়েছেন - এবং এই উত্তরটি প্রচুর পরিমাণে উত্সাহ পেয়েছে। এবং দ্বিতীয় উত্তর, 5 ঘন্টা পরে (!), কেবল "হেক্সডাম্প ব্যবহার করুন" বলে। তাহলে আপনি প্রথমটির পক্ষে দ্বিতীয়টি গ্রহণ করলেন? সিরিয়াসলি?
ডক ব্রাউন

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

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

4
@ জওয়েন্টিং না, আসলে, বিকাশকারী সময় সাধারণত কোনও অ্যাপ্লিকেশনের সবচেয়ে ব্যয়বহুল অংশ। অবশ্যই, আপনি গুগল বা ফেসবুকে কাজ করছেন এমনটি নাও হতে পারে তবে বেশিরভাগ অ্যাপ্লিকেশন সেই স্কেলটিতে কাজ করে না। এবং যখন আপনার বিকাশকারীরা স্টাফের জন্য সময় ব্যয় করে সর্বাধিক ব্যয়বহুল সংস্থান হয়, তখন প্রোগ্রামটি পার্স করার জন্য মানব পাঠযোগ্যতা অতিরিক্ত 100 মিলিসেকেন্ডের চেয়ে অনেক বেশি গণনা করে।
jpmc26

3
@ jpmc26 আমি প্রশ্নের মধ্যে এমন কিছু দেখতে পাচ্ছি না যা আমাকে পরামর্শ দেয় যে ওপি হ'ল ফর্ম্যাটটি সংজ্ঞায়িত করছে।
জিমি জেমস

উত্তর:


76

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

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

শেষ অবধি, ভুলে যাবেন না যে আপনি আপনার ডিকোডারের জন্য ইউনিট পরীক্ষা লিখতে হবে, সঠিক-সঠিক ক্যানড ইনপুট ব্যবহার করে।


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

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

10

এটি করার প্রথম পদক্ষেপটি আপনার এমন একটি ব্যাকরণ সন্ধান বা সংজ্ঞায়িত করার একটি উপায়ের দরকার যা ডেটা কাঠামো অর্থাৎ স্কিমা বর্ণনা করে।

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

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


2
এই বৈশিষ্ট্যটি 'প্রাচীন' যুগের ভাষাগুলিতে সংরক্ষিত নয়। সি এবং সি ++ স্ট্রাক্ট এবং ইউনিয়নগুলি মেমরি প্রান্তিককরণ করা যায়। সি # এর স্ট্রাকটলআউটআউট্রিবিউট রয়েছে, যা বাইনারি ডেটা সংক্রমণ করার জন্য আমার ব্যবহার রয়েছে।
ক্যাস্পার ভ্যান ডেন বার্গ

1
@ ক্যাসপার্ভেনডেনবার্গ আপনি যদি না বলে থাকেন যে সি এবং সি ++ সাম্প্রতিক সময়ে এগুলিকে যুক্ত করেছে, আমি এটিকে একই যুগ হিসাবে বিবেচনা করি। মুল বক্তব্যটি হ'ল এই ফর্ম্যাটগুলি কেবল ডেটা ট্রান্সমিশনের জন্য ছিল না, যদিও সেগুলির জন্য ব্যবহৃত হয়েছিল, তারা মেমরি এবং ডিস্কে ডেটা সহ কোডটি কীভাবে কাজ করে তা সরাসরি ম্যাপ করে। এটি সাধারণভাবে নয়, নতুন ভাষাগুলি কীভাবে কাজ করতে ঝোঁক, যদিও তাদের এমন বৈশিষ্ট্য থাকতে পারে।
জিমি জেমস

@ ক্যাসপার্ভেনডেনবার্গ সি ++ আপনার মনে হয় ততটা করেন না। প্যাডিংগুলি সারিবদ্ধকরণ এবং নির্মূল করার জন্য বাস্তবায়ন-নির্দিষ্ট সরঞ্জাম ব্যবহার করে (এবং স্বীকার করা যায়, ক্রমবর্ধমান মান এই ধরণের জিনিসগুলির জন্য বৈশিষ্ট্যগুলি যুক্ত করছে) এবং সদস্য আদেশটি হ'ল ডিস্ট্রিমেন্টিক (তবে প্রয়োজনীয়ভাবে স্মৃতিতে একই নয়!)।
অরবিটে

6

এএসএন .১ , অ্যাবস্ট্রাক্ট সিনট্যাক্স নোটেশন ওয়ান, বাইনারি ফর্ম্যাট নির্দিষ্ট করার একটি উপায় সরবরাহ করে।

  • ডিডিটি - নমুনা ডেটা এবং ইউনিট পরীক্ষা ব্যবহার করে বিকাশ করুন।
  • একটি পাঠ্য ডাম্প সহায়ক হতে পারে। যদি এক্সএমএল হয় তবে আপনি সাবহাইরচির সংক্ষিপ্ত / প্রসারিত করতে পারেন।
  • এএসএন ১. আসলেই প্রয়োজন হয় না তবে একটি ব্যাকরণ ভিত্তিক, আরও ঘোষিত ফাইলের স্পেসিফিকেশন সহজ।

6
যদি এএসএন ১ পার্সারগুলিতে সুরক্ষিত দুর্বলতার কখনও শেষ না হওয়া প্যারেড কোনও ইঙ্গিত থাকে তবে এটি গ্রহণ করা বাইনারি ফর্ম্যাটগুলি ডিবাগিংয়ে অবশ্যই অবশ্যই ভাল অনুশীলন সরবরাহ করে।
চিহ্নিত করুন

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

3

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

হেক্স ডাম্পের উপরে JSON রেন্ডার করতে পারে এমন একটি সরঞ্জাম ব্যবহার করা সত্যিই দরকারী; আমি একটি ওপেন সোর্স সরঞ্জাম লিখেছিলাম যা। ডটনেটবাইটস নামে ডাইনেট বাইনারিগুলি বিশ্লেষণ করে , এখানে একটি উদাহরণ ডিএলএল এর একটি দৃশ্য দেখুন

dotNetBytes উদাহরণ


1

আমি নিশ্চিত যে আমি পুরোপুরি বুঝতে পেরেছি না, তবে মনে হয় আপনার কাছে এই বাইনারি ফর্ম্যাটটির পার্সার রয়েছে এবং আপনি এটির জন্য কোডটি নিয়ন্ত্রণ করেন। সুতরাং এই উত্তরটি সেই অনুমানের উপর নির্মিত।

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

আপনার মূলত:

byte[] arrayOfBytes; // initialized somehow
Object obj = Parser.parse(arrayOfBytes);
Logger.log(obj.ToString());

এবং এটি এটির ব্যবহারের দৃষ্টিকোণ থেকে। অবশ্যই এটির ToStringজন্য আপনার Objectশ্রেণি / কাঠামো / যা কিছু জন্য ফাংশনটি বাস্তবায়ন / ওভাররাইড করা প্রয়োজন এবং কোনও নেস্টেড ক্লাস / স্ট্রাক্ট / ত্রিমাত্রীদের জন্য আপনাকে এটি করতে হবে।

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

আপনার ToStringদেখতে এই মত দেখাচ্ছে:

return String.Format("%d,%d,%d,%d", int32var, int16var, int8var, int32var2);

// OR

return String.Format("%s:%d,%s:%d,%s:%d,%s:%d", varName1, int32var, varName2, int16var, varName3, int8var, varName4, int32var2);

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

এটি এমন কিছু যা আপনার কেবল একবারে করা উচিত এবং আপনি পার্সার তৈরি করার সময় এটি করতে পারেন। এবং এটি কেবল তখনই পরিবর্তিত হবে যখন বাইনারি ফর্ম্যাট পরিবর্তিত হবে (যা ইতিমধ্যে আপনার পার্সারে পরিবর্তনের অনুরোধ জানাবে)।

অনুরূপ শিরাতে: কিছু ভাষায় এক্সএমএল বা জেএসএন-তে ক্লাসগুলি পরিবর্তনের জন্য শক্তিশালী বৈশিষ্ট্য রয়েছে। সি # এটি বিশেষত ভাল। আপনাকে আপনার বাইনারি ফর্ম্যাটটি ছেড়ে দিতে হবে না, আপনি কেবল ডিবাগ লগিং স্টেটমেন্টে এক্সএমএল বা জেএসএন করেন এবং আপনার প্রকাশের কোডটি একা রেখে যান।

আমি ব্যক্তিগতভাবে হেক্স ডাম্প রুটে না যাওয়ার পরামর্শ দিই, কারণ এটির ত্রুটি হওয়ার আশঙ্কা রয়েছে (আপনি কি ডান বাইটে শুরু করেছিলেন, আপনি যখন নিশ্চিত হন যে আপনি বাম থেকে ডান পড়ছেন তখনই আপনি সঠিক ইন্ডিয়ানেশনটি "দেখছেন" ইত্যাদি) ।

উদাহরণ: আপনার ToStringsথুতু ভেরিয়েবল বলুন a,b,c,d,e,f,g,h। আপনি আপনার প্রোগ্রামটি চালাচ্ছেন এবং এর সাথে একটি ত্রুটি লক্ষ্য করুন g, তবে সমস্যাটি সত্যিই শুরু হয়েছিল c(তবে আপনি ডিবাগ করছেন, সুতরাং আপনি এখনও এটি বুঝতে পারেন নি)। আপনি যদি ইনপুট মানগুলি (এবং আপনার হওয়া উচিত) জানেন তবে আপনি তাত্ক্ষণিকভাবে দেখতে পাবেন cযেখান থেকেই সমস্যা শুরু হয়।

হেক্স ডাম্পের সাথে তুলনা করুন যা আপনাকে কেবল বলে দেয় 338E 8455 0000 FF76 0000 E444 ....; যদি আপনার ক্ষেত্রগুলি আকারের আকার পরিবর্তিত হয়, কোথা থেকে cশুরু হয় এবং মানটি কী হয় - একটি হেক্স সম্পাদক আপনাকে বলবে তবে আমার বক্তব্যটি হ'ল এটি ত্রুটি প্রবণ এবং সময়সাপেক্ষ। কেবল তা-ই নয়, আপনি কোনও হেক্স দর্শকের মাধ্যমে সহজেই / দ্রুত কোনও পরীক্ষা স্বয়ংক্রিয় করতে পারবেন না। ডেটা বিশ্লেষণের পরে একটি স্ট্রিং প্রিন্ট করা আপনাকে জানাবে যে আপনার প্রোগ্রামটি 'চিন্তাভাবনা' ঠিক কী, এবং স্বয়ংক্রিয় পরীক্ষার পথে এক ধাপ।

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