আমি কিভাবে জিডিবিতে একটি দীর্ঘ স্ট্রিংয়ের পূর্ণ মানটি মুদ্রণ করব?


376

আমি জিডিবিতে সি-স্ট্রিংয়ের পূর্ণ দৈর্ঘ্য মুদ্রণ করতে চাই। ডিফল্টরূপে এটি সংক্ষেপিত হচ্ছে, আমি কীভাবে জিডিবিকে পুরো স্ট্রিং মুদ্রণ করতে বাধ্য করব?

উত্তর:


504
set print elements 0

জিডিবি ম্যানুয়াল থেকে :

set print elements number-of-elements
একটি অ্যারে জিডিবি এর কতগুলি উপাদান মুদ্রণ করবে তার একটি সীমা নির্ধারণ করুন। জিডিবি যদি বড় অ্যারে প্রিন্ট করে তবে set print elementsকমান্ড দ্বারা নির্ধারিত উপাদানগুলির সংখ্যা মুদ্রণের পরে এটি মুদ্রণ বন্ধ করে দেয় । এই সীমাটি স্ট্রিং প্রদর্শনের ক্ষেত্রেও প্রযোজ্য। যখন, GDB শুরু এই সীমা 200. সেট করা হয় সেটিং সংখ্যা অফ উপাদানের শূন্য মানে যে মুদ্রণ সীমাহীন

4
আজকাল আপনার প্রয়োজন হতে পারে "সেট মুদ্রণ পুনরাবৃত্তি 0", অন্যথায় জিডিবি স্ট্রিং / অ্যারের পুনরাবৃত্তি উপাদানগুলি বাদ দেবে।
জন লিন্ডগ্রেন

এটি অ্যারের ধরণের ক্ষেত্রেও প্রযোজ্য
ট্রেভর বয়েড স্মিথ

1
আপনার "সর্বাধিক মান-মাপের আনলিমিটেড সেট করতে" দরকার হতে পারে।
এমএস

100

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


2
এই উত্তরটি "প্রিন্ট উপাদান 0 সেট করুন" (আমার উদ্দেশ্যে) এর চেয়েও ভাল কারণ এটি নিউলাইন / ক্যারেজ রিটার্ন অক্ষরগুলিকে পালানোর পরিবর্তে সম্মান করে।
mhenry1384

6
ভাল সমাধান, কিন্তু কোর ডাম্প ফাইল বিশ্লেষণ করার চেষ্টা করার সময় কাজ করে না
এল্ল্যাফার

উজ্জ্বল পরামর্শ সন্ধ্যাবশত, আমি চাই যে আমি অনাকাঙ্কিত আউটপুট পাওয়ার জন্য এটি একটি অনুলিপি করে একটি
প্রিন্টফোন

4
দ্রষ্টব্য: আপনি যদি কোনও লাইভ প্রোগ্রাম ডিবাগ করেন তবে এই বিকল্পটি কেবলমাত্র কাজ করে। আপনি যখন কোনও মূল ফাইলটি ডিবাগ করছেন তখন আপনি জিডিবির "কল" কমান্ডটি ব্যবহার করতে পারবেন না।
সলোমন

1
বুদ্ধিমান হওয়ার জন্যও জিডিবি দরকার, যা ক্রমবর্ধমানভাবে কেস হিসাবে দেখা যাচ্ছে না (আমার ম্যাক ওএস এক্স মেশিনে আমি "কোনও প্রতীক" রাখি না "পেয়েছি)
মাইকেল

39

তৃতীয় বিকল্প রয়েছে: এক্স কমান্ড, যা আপনাকে বিশ্বব্যাপী সেটিং পরিবর্তন না করে নির্দিষ্ট কমান্ডের জন্য একটি পৃথক সীমা নির্ধারণ করতে দেয়। স্ট্রিংয়ের প্রথম 300 টি অক্ষর মুদ্রণ করতে আপনি ব্যবহার করতে পারেন x/300s your_string। আউটপুটটি পড়তে কিছুটা শক্ত হতে পারে। উদাহরণস্বরূপ একটি এসকিউএল ক্যোয়ারী ফলাফল মুদ্রণ:

(gdb) x / 300sb stmt.c_str ()
0x9cd948: "নিবন্ধ নির্বাচন করুন ..."
0x9cd958: "আর্টিকেল থেকে owণী" ...
..

3
আমি ভাবছিলাম "x / 300sb" বলতে কী বোঝায়? এই চিট শিট (পিডিএফ) এর সাহায্যে , আমি "x / 300sb সিএসটি" কে "সিএসএসে মেমরির এক্সামাইন 300 ইউনিট (বাইটস) হিসাবে অনুবাদ করেছি, একটি এনআরএল-টার্মিনেটেড স্ট্রিং (এস) হিসাবে ব্যাখ্যা করা হয়েছে।" আপনার স্ট্রিংয়ের দৈর্ঘ্য যদি 100 হয়, তবে আপনি প্রচুর আবর্জনা দেখতে পাবেন, কারণ সমস্ত 300 বাইট প্রিন্ট করা হয়েছে, সেগুলি বোধগম্য হোক বা না হোক। তবুও আমাকে পরিচয় করিয়ে দেওয়ার জন্য +1 x!
রব ডব্লু

39

printfকমান্ড সম্পূর্ণ স্ট্রিং প্রিন্ট হবে:

(gdb) printf "%s\n", string

2
দুঃখিত তবে এটি সত্য নয়
উমনিওব

11
এটি সীমাটিকে সম্মান করে বলে মনে হচ্ছে set print elements nnnএবং আপনি যদি না করেন তবে সম্পূর্ণ স্ট্রিংটি মুদ্রণ করবে না set print elements 0
লাকাতা

3
আমি যখন এটি চেষ্টা করি তখনই আমি পাই: "মান পূর্ণসংখ্যায় রূপান্তর করা যায় না।"
ফিলিপ লুডভিগ

2
এসটিডি :: স্ট্রিং জন্য আপনাকে string.c_str দরকার () এড়ানোর জন্য "মান পূর্ণসংখ্যা রূপান্তরিত করা যাবে না" ত্রুটি
পল মধ্যে Childs

21

এটি সম্পূর্ণ করার জন্য:

(gdb) p (char[10]) *($ebx)
$87 =   "asdfasdfe\n"

আপনাকে অবশ্যই একটি দৈর্ঘ্য দিতে হবে, তবে সেই স্ট্রিংয়ের উপস্থাপনা পরিবর্তন করতে পারে:

(gdb) p/x (char[10]) *($ebx)
$90 =   {0x61,
  0x73,
  0x64,
  0x66,
  0x61,
  0x73,
  0x64,
  0x66,
  0x65,
  0xa}

আপনি যদি তাদের মানগুলি দিয়ে ডিবাগ করতে চান তবে এটি কার্যকর হতে পারে


1

ব্যবহার set elements ...সর্বদা সর্বোত্তম উপায় নয়। এটি আলাদা হবে যদি দরকারী set string-elements ...

সুতরাং, আমি আমার .gdbinit এ এই ফাংশনগুলি ব্যবহার করি:

define pstr
  ptype $arg0._M_dataplus._M_p
  printf "[%d] = %s\n", $arg0._M_string_length, $arg0._M_dataplus._M_p
end

define pcstr
  ptype $arg0
  printf "[%d] = %s\n", strlen($arg0), $arg0
end

আদেশ সহকারে:

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