আমি জিডিবিতে সি ++ ভেক্টরের উপাদানগুলি কীভাবে মুদ্রণ করব?


210

আমি std::vectorজিডিবির একটি বিষয়বস্তু পরীক্ষা করতে চাই , আমি কীভাবে এটি করব? ধরা যাক এটি std::vector<int>সরলতার জন্য।


3
অনুরূপ প্রশ্ন: স্ট্যাকওভারফ্লো.com/ প্রশ্নগুলি / 75৪৫৮৯৯ / / (উত্তরের লিঙ্কটি খুব আকর্ষণীয়)।
পাওলো টেডেসকো

নতুন, আরো এই কাজ করতে উপায় এই প্রশ্নের রয়েছে: stackoverflow.com/questions/2492020/...
dshepherd

উত্তর:


79

ভেক্টর এসটিডি :: ভেক্টর মাইভেক্টর সামগ্রীগুলি দেখতে, কেবল জিডিবিতে টাইপ করুন:

(gdb) print myVector

এটি এর মতো একটি আউটপুট তৈরি করবে:

$1 = std::vector of length 3, capacity 4 = {10, 20, 30}

উপরেরটি অর্জনের জন্য আপনার জিডিবি 7 (আমি এটি জিডিবি 7.01 তে পরীক্ষা করেছি) এবং কিছু পাইথন প্রিটি-প্রিন্টার থাকা দরকার। এগুলির ইনস্টলেশন প্রক্রিয়াটি gdb উইকিতে বর্ণিত হয়েছে ।

আরও কী, উপরে ইনস্টল করার পরে, এটি Eclipse C ++ debugger GUI (এবং অন্য কোনও আইডিই, জিডিবি ব্যবহার করে, যেমনটি আমার মনে হয়) ভাল কাজ করে।


16
ভেক্টর উপাদানগুলি সরাসরি ব্যাখ্যাযোগ্য হিসাবে এটি কাজ করে। তবে ভেক্টরটিতে আগ্রহের আইটেমগুলিতে পয়েন্টার রয়েছে কিনা তা কার্যকর হয় না।
wallyk

আমি খোলামেলাভাবে জিডিবি উইকি পৃষ্ঠাটি বিশেষত পঠনযোগ্য খুঁজে পাচ্ছি না , কারণ এটি এখন "সামান্য" পুরানো হয়ে গেছে? উদাহরণস্বরূপ, আমার ধারণা ছিল যে প্রস্তাবিত সামগ্রীটি $HOME/.gdbinitপ্রয়োজনীয়। এই মুহুর্তে আমি এ জাতীয় কোনও ফাইল নেই এবং gdbএর সামগ্রীটি সঠিকভাবে দেখিয়েছি std::vector। যাইহোক, যেহেতু আমার "র‌্যাম্বলিং" প্রচেষ্টার সময় আমি সবেমাত্র ইনস্টল করেছি এবং তারপরেই অবিরাম বন্ধ করে cgdbদিয়েছি এবং আমি ইতিমধ্যে libstdc++5ইনস্টল করে ফেলেছি , এখনকার কাজটি চলাকালীন সুন্দর মুদ্রণ কেন কাজ করে নি তা আমার কোনও ধারণা নেই।
এনরিকো মারিয়া ডি অ্যাঞ্জেলিস

257

জিসিসি ৪.১.২ সহ, স্টাডি :: ভেক্টর <int> মাইভেক্টর নামে পুরো মুদ্রণ করতে, নিম্নলিখিতটি করুন:

print *(myVector._M_impl._M_start)@myVector.size()

কেবলমাত্র প্রথম এন উপাদানগুলি মুদ্রণ করতে, করুন:

print *(myVector._M_impl._M_start)@N

ব্যাখ্যা

এটি সম্ভবত আপনার সংকলক সংস্করণের উপর নির্ভরশীল, তবে জিসিসি 4.1.2 এর জন্য অভ্যন্তরীণ অ্যারেটির পয়েন্টারটি হ'ল:

myVector._M_impl._M_start 

এবং জিডিবি কমান্ডটি পয়েন্টার পি থেকে শুরু করে একটি অ্যারের N উপাদানগুলি মুদ্রণ করতে হবে:

print P@N

বা, একটি সংক্ষিপ্ত আকারে (একটি স্ট্যান্ডার্ড .gdbinit জন্য):

p P@N

4
হেই, এটি এমন কিছু যা আমাকে আগে ছড়িয়ে দিয়েছে, তাই আমি আজ সকালে এটি সন্ধান করেছি এবং এটি নিজের কাছে একটি মেমো হিসাবে যুক্ত করেছি (জেফ নিজেই প্রস্তাবিত হিসাবে)।
জন কার্টার 11

3
এছাড়াও আপনি যদি কেবল একটি নির্দিষ্ট ভেক্টর উপাদান চান, মাইভেক্টর ।_এম_আইএমপিএল_এম_স্টার্ট + এন (নবম উপাদানটির জন্য)
মেরিনার ২

1
আমার জন্য কাজ করছে না। Cannot evaluate function -- may be inlined
wallyk

1
একটি একক উপাদান মুদ্রণ করতে, উদাহরণস্বরূপ ২ য় উপাদান: মুদ্রণ করুন (myVector._M_impl._M_start) [2]
jfritz42

2
_M_implজিডিবি 7.0+ এর অধীনে আপনার সংকলকের জন্য বিশেষ নাম ( ইত্যাদি) সন্ধান করতে, ব্যবহার করুনprint /r myVector
এপোনামাস

14

ডিবাগ করার সময় এসটিএল পাত্রে 'দেখা' কিছুটা সমস্যা। এখানে আমি অতীতে 3 টি পৃথক সমাধান ব্যবহার করেছি, সেগুলির কোনওটিই নিখুঁত।

1) http://clith.com/gdb_stl_utils/ থেকে জিডিবি স্ক্রিপ্টগুলি ব্যবহার করুন এই স্ক্রিপ্টগুলি আপনাকে প্রায় সমস্ত এসটিএল ধারকগুলির সামগ্রী মুদ্রণ করতে দেয়। সমস্যাটি হ'ল এটি সেট স্ট্যাকের মতো নেস্টেড পাত্রগুলির জন্য কাজ করে না।

2) ভিজ্যুয়াল স্টুডিও 2005 এর এসটিএল পাত্রে দেখার জন্য দুর্দান্ত সমর্থন রয়েছে। এটি নেস্টেড পাত্রে works

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


11

নিম্নলিখিতটি ~ / .gdbinit এ রাখুন

define print_vector
    if $argc == 2
        set $elem = $arg0.size()
        if $arg1 >= $arg0.size()
            printf "Error, %s.size() = %d, printing last element:\n", "$arg0", $arg0.size()
            set $elem = $arg1 -1
        end
        print *($arg0._M_impl._M_start + $elem)@1
    else
        print *($arg0._M_impl._M_start)@$arg0.size()
    end
end

document print_vector
Display vector contents
Usage: print_vector VECTOR_NAME INDEX
VECTOR_NAME is the name of the vector
INDEX is an optional argument specifying the element to display
end

জিডিবি পুনরায় চালু করার পরে (বা সোর্সিং ~ / .gdbinit), এর মতো সম্পর্কিত সহায়তাটি দেখান

gdb) help print_vector
Display vector contents
Usage: print_vector VECTOR_NAME INDEX
VECTOR_NAME is the name of the vector
INDEX is an optional argument specifying the element to display

ব্যবহারের উদাহরণ:

(gdb) print_vector videoconfig_.entries 0
$32 = {{subChannelId = 177 '\261', sourceId = 0 '\000', hasH264PayloadInfo = false, bitrate = 0,     payloadType = 68 'D', maxFs = 0, maxMbps = 0, maxFps = 134, encoder = 0 '\000', temporalLayers = 0 '\000'}}

2
কোডের জন্য আপনাকে ধন্যবাদ! আমার মনে হয় একটি টাইপো আছে এবং "মুদ্রণ * (g arg0._M_impl._M_start + $ এলেম) @ 1" "মুদ্রণ * (g arg0._M_impl._M_start + $ আরজি 1) @ 1" হওয়া উচিত? আমি নিম্নলিখিত পরিবর্তনটি ব্যবহার করছি: মুদ্রণ_ভেક્ટર সংজ্ঞায়িত করুন যদি $ argc == 2 যদি $ arg1> = $ arg0.size () - 1 টি প্রিন্টফ "ত্রুটি,% s.size () =% d, শেষ উপাদান মুদ্রণ করছে: \ n", " $ arg0 ", $ arg0.size () - 1 টি প্রিন্ট * ($ arg0._M_impl._M_start + $ আরজি 1) @ 1 অন্য প্রিন্ট * ($ arg0._M_impl._M_start) @ $ arg0.size () শেষ প্রান্ত
user1541776

এল ম্যাগনিফিকো!
মোচাস

0

পার্টিতে কিছুটা দেরি, তাই পরবর্তী সময় আমি যখন এই অনুসন্ধান করি তখন বেশিরভাগ ক্ষেত্রে আমার কাছে একটি অনুস্মারক!

আমি ব্যবহার করতে সক্ষম হয়েছি:

p/x *(&vec[2])@4

vecশুরু থেকে 4 টি উপাদান (হেক্স হিসাবে) মুদ্রণ করতে vec[2]

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