আমি std::vector
জিডিবির একটি বিষয়বস্তু পরীক্ষা করতে চাই , আমি কীভাবে এটি করব? ধরা যাক এটি std::vector<int>
সরলতার জন্য।
আমি std::vector
জিডিবির একটি বিষয়বস্তু পরীক্ষা করতে চাই , আমি কীভাবে এটি করব? ধরা যাক এটি std::vector<int>
সরলতার জন্য।
উত্তর:
ভেক্টর এসটিডি :: ভেক্টর মাইভেক্টর সামগ্রীগুলি দেখতে, কেবল জিডিবিতে টাইপ করুন:
(gdb) print myVector
এটি এর মতো একটি আউটপুট তৈরি করবে:
$1 = std::vector of length 3, capacity 4 = {10, 20, 30}
উপরেরটি অর্জনের জন্য আপনার জিডিবি 7 (আমি এটি জিডিবি 7.01 তে পরীক্ষা করেছি) এবং কিছু পাইথন প্রিটি-প্রিন্টার থাকা দরকার। এগুলির ইনস্টলেশন প্রক্রিয়াটি gdb উইকিতে বর্ণিত হয়েছে ।
আরও কী, উপরে ইনস্টল করার পরে, এটি Eclipse C ++ debugger GUI (এবং অন্য কোনও আইডিই, জিডিবি ব্যবহার করে, যেমনটি আমার মনে হয়) ভাল কাজ করে।
$HOME/.gdbinit
প্রয়োজনীয়। এই মুহুর্তে আমি এ জাতীয় কোনও ফাইল নেই এবং gdb
এর সামগ্রীটি সঠিকভাবে দেখিয়েছি std::vector
। যাইহোক, যেহেতু আমার "র্যাম্বলিং" প্রচেষ্টার সময় আমি সবেমাত্র ইনস্টল করেছি এবং তারপরেই অবিরাম বন্ধ করে cgdb
দিয়েছি এবং আমি ইতিমধ্যে libstdc++5
ইনস্টল করে ফেলেছি , এখনকার কাজটি চলাকালীন সুন্দর মুদ্রণ কেন কাজ করে নি তা আমার কোনও ধারণা নেই।
জিসিসি ৪.১.২ সহ, স্টাডি :: ভেক্টর <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
Cannot evaluate function -- may be inlined
_M_impl
জিডিবি 7.0+ এর অধীনে আপনার সংকলকের জন্য বিশেষ নাম ( ইত্যাদি) সন্ধান করতে, ব্যবহার করুনprint /r myVector
ডিবাগ করার সময় এসটিএল পাত্রে 'দেখা' কিছুটা সমস্যা। এখানে আমি অতীতে 3 টি পৃথক সমাধান ব্যবহার করেছি, সেগুলির কোনওটিই নিখুঁত।
1) http://clith.com/gdb_stl_utils/ থেকে জিডিবি স্ক্রিপ্টগুলি ব্যবহার করুন এই স্ক্রিপ্টগুলি আপনাকে প্রায় সমস্ত এসটিএল ধারকগুলির সামগ্রী মুদ্রণ করতে দেয়। সমস্যাটি হ'ল এটি সেট স্ট্যাকের মতো নেস্টেড পাত্রগুলির জন্য কাজ করে না।
2) ভিজ্যুয়াল স্টুডিও 2005 এর এসটিএল পাত্রে দেখার জন্য দুর্দান্ত সমর্থন রয়েছে। এটি নেস্টেড পাত্রে works
৩) ডিবাগ করার সময় আপনি যে নির্দিষ্ট আইটেমটি মুদ্রণ করতে চান তার জন্য নিজের 'প্রিন্ট' ফাংশন (বা পদ্ধতি) লিখুন এবং আইডিটি প্রিন্ট করতে জিডিবিতে থাকাকালীন 'কল' ব্যবহার করুন। নোট করুন যে আপনার প্রিন্ট ফাংশনটি কোডের কোথাও কোথাও কল করা না থাকলে জি ++ ডেড কোড নির্মূল করবে এবং 'মুদ্রণ' ফাংশনটি জিডিবি দ্বারা পাওয়া যাবে না (আপনি এই বার্তাটি পাবেন যে ফাংশনটি অন্তর্নিহিত রয়েছে তা বলে)। সুতরাং--পাল-ইনলাইন-ফাংশনগুলি সংকলন করুন
নিম্নলিখিতটি ~ / .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'}}