জিডিবি সহ স্ট্যান্ডার্ড কনটেইনার (স্ট্যান্ড :: ম্যাপ) সামগ্রীগুলি পরিদর্শন করা


94

মনে হচ্ছে এই জাতীয় কিছু রয়েছে:

#include <map>
int main(){
    std::map<int,int> m;
    m[1] = 2;
    m[2] = 4;
    return 0;
}

আমি জিডিবি থেকে প্রোগ্রামটি চলমান মানচিত্রের সামগ্রীগুলি পরিদর্শন করতে সক্ষম হতে চাই।
আমি যদি সাবস্ক্রিপ্ট অপারেটরটি ব্যবহার করার চেষ্টা করি তবে আমি পেয়েছি:

(gdb) p m[1]
Attempt to take address of value not located in memory.

সন্ধানের পদ্ধতিটি ব্যবহার করে আরও ভাল ফলাফল পাওয়া যায় না:

(gdb) p m.find(1)
Cannot evaluate function -- may be inlined

এটি সম্পাদন করার কোনও উপায় আছে?


বড় মানচিত্র ছিন্ন ছাড়া সব উপাদান মুদ্রণ করতে: stackoverflow.com/questions/47743215/... আরো একটি "ফাংশন হয়তো inlined মূল্যায়ন করতে পারেন না" নিবদ্ধ: stackoverflow.com/questions/40633787/...
সিরো Santilli郝海东冠状病六四事件法轮功

উত্তর:


34

আমি মনে করি সেখানে নেই, আপনার উত্সটি অনুকূলিত হয় কিনা ইত্যাদি if তবে, জিডিবিতে এমন কিছু ম্যাক্রো রয়েছে যা আপনার জন্য এসটিএল ধারকগুলি পরিদর্শন করতে পারে:

http://sourceware.org/ML/gdb/2008-02/msg00064.html

তবে, আমি এটি ব্যবহার করি না, তাই ওয়াইএমএমভি


4
লিঙ্কের জন্য ধন্যবাদ; কেবলমাত্র ম্যাক্রোগুলি স্টাইল লাইব্রেরি সংস্করণ থেকে নির্ভরশীল, যা আমি এড়াতে পছন্দ করি। +1
পাওলো টেডেস্কো

এটি কিছুটা হতাশার কারণ যে "plist foo std :: স্ট্রিং" এর মতো আদেশগুলি সিনট্যাক্স ত্রুটি দেয়। এটি প্রদর্শিত হয় যে মান_ টাইপে কোনও বিরামচিহ্ন থাকতে পারে না।
বকলিন

4
আমি চেষ্টা করি নি, তবে এটি যদি অন্য জিডিবি-র মতো একই কাজ করে তবে একক উদ্ধৃতিতে বিরামচিহ্নযুক্ত নামটি যুক্ত করা উচিত।
jpalecek

4
দ্রষ্টব্য: এই স্ক্রিপ্টগুলিতে std :: মানচিত্রের কার্যকারিতা 32-বিট পয়েন্টার ধরণ ধরে। -৪-বিট মেশিনের জন্য, "+ 4" ফাইলের যে কোনও জায়গায় প্রতিস্থাপন করুন।
কাইল সিমেক

পোভেক্টরটি আমার জিডিবিতে সংজ্ঞায়িত করা হয়নি (সংস্করণ 7.5.91.20130417-cvs-ubuntu)।
জেফ

94

এই প্রশ্নের বিদ্যমান উত্তরগুলি খুব পুরানো। একটি সাম্প্রতিক জিসিসি এবং জিডিবির সাথে এটি জিডিবি 7.x- তে অন্তর্নির্মিত পাইথন সমর্থন এবং জিসিসির সাথে আসা লিবিস্টডিসি ++ প্রিন্ট প্রিন্টারকে কেবল টিএম ধন্যবাদ জানায়।

ওপির উদাহরণটি আমি পেয়েছি:

(gdb) print m
$1 = std::map with 2 elements = {[1] = 2, [2] = 4}

যদি এটি স্বয়ংক্রিয়ভাবে কাজ না করে তবে আপনি জিডিবি উইকের এসটিএল সমর্থন পৃষ্ঠায় প্রথম বুলেট পয়েন্টটি দেখতে পাচ্ছেন ।

আপনি নিজের ধরণের জন্য পাইথন সুন্দর প্রিন্টারও লিখতে পারেন, জিডিবি ম্যানুয়ালটিতে প্রেটি প্রিন্টিং দেখুন ।


4
হ্যাঁ, তবে অন্যান্য প্রশ্নগুলি এর সদৃশ হিসাবে বন্ধ হয়ে যাচ্ছে, তাই আমি চাইছিলাম এটির সাম্প্রতিক তথ্য থাকতে পারে।
জোনাথন ওয়েকেলি

4
আমি জিডিবি 7.2 এবং উপরের কাজগুলি ব্যবহার করছি ... আপনার যদি একটি ছোট সংগ্রহ থাকে। এসটিএল বাস্তবায়নের অভ্যন্তরীণ কাঠামো ব্যবহার করা ছাড়া অন্য 4K ভেক্টর থেকে 1543 উপাদানটি মুদ্রণের কোনও উপায় আমি এখনও খুঁজে পাইনি।
প্যাভন

4
হ্যাঁ, জিডিবি 7.2 এবং আইসিপিসি সংকলকটিতে আমি ত্রুটি পেয়েছি Could not find operator[]
প্যাভন

13
দুর্ভাগ্যক্রমে এটি সমস্ত ডিস্ট্রোজে "জাস্ট ওয়ার্ক" করে না। এটা তোলে উবুন্টু 13.10 ডিফল্টরূপে ইনস্টল করা নেই এবং সেখানে সমস্যার যখন আপনি এটি ম্যানুয়ালি ইনস্টল করার চেষ্টা
nietaki

4
@ রাজেহ, ফেডোরা, আরএইচইল (এবং আরএইচইএল ক্লোন)। সেখানে অগ্রগতি একটি ফিক্স প্রিন্টার এছাড়াও ডিস্ট্রো কাজ যেখানে, GDB পাইথন 3 লিঙ্ক আছে কি না এর
জনাথন Wakely

24

এখানে সর্বদা সুস্পষ্ট থাকে: নিজের পরীক্ষা-ফাংশনটি সংজ্ঞায়িত করুন ... জিডিবি থেকে কল করুন। যেমন:

#define SHOW(X) cout << # X " = " << (X) << endl

void testPrint( map<int,int> & m, int i )
{
  SHOW( m[i] );
  SHOW( m.find(i)->first );
}

int
main()
{
    std::map<int,int> m;
    m[1] = 2;
    m[2] = 4;
    return 0;  // Line 15.
}

এবং:

....
Breakpoint 1 at 0x400e08: file foo.C, line 15.
(gdb) run
Starting program: /tmp/z/qD 

Breakpoint 1, main () at qD.C:15
(gdb) call testPrint( m, 2)
m[i] = 4
(*m.find(i)).first = 2
(gdb) 

16
যতক্ষণ প্রক্রিয়া চলছে। কোর-ডাম্পগুলির জন্য এতটা কার্যকর নয়।
শান রিলে

4
এটি কেবলমাত্র এসটিএল দিয়ে নয়, সাধারণভাবে জিডিবি দরকারী পরামর্শ। আমি প্রচুর হার্ড-টু-পুনরুদ্ধার ডেটার জন্য জিডিবি হেল্পারের পুরো লাইব্রেরিটি রাখি, যেমন, লিখন_কুদা_আরে_আস_আইমেজ ()। নোট করুন যে কিছু সংকলকগুলি কল করা হয়নি এমন কোনও ফাংশন সরিয়ে ফেলবে, তাই আমি আমার প্রধানের "রিটার্ন 0;" পরে প্রতিটি সহায়ক ফাংশনে একটি কল রাখি। তাদের বাহ্যিক "সি" দিয়ে ঘোষণা করা তাদের জিডিবি থেকে কল করা আরও সহজ করে তোলে।
কাইল সিমেক

20

stl-views.gdbসেরা উত্তর ছিল ব্যবহার করা হয়, কিন্তু আর না।

এটি GDBএখনও মূল লাইনটিতে সংহত হয়নি, তবে আপনি 'ধনু-ট্রোমাই-পাইথন' শাখাটি ব্যবহার করছেন তা এখানে :

(gdb) list
1   #include <map>
2   int main(){
3       std::map<int,int> m;
4       m[1] = 2;
5       m[2] = 4;
6       return 0;
7   }
(gdb) break 6
Breakpoint 1 at 0x8048274: file map.cc, line 6.
(gdb) run

Breakpoint 1, main () at map.cc:6
6       return 0;
(gdb) print m
$1 = std::map with 2 elements = {
  [1] = 2,
  [2] = 4
}
(gdb) quit

11

ডি-রেফারেন্সিং এসটিএল ধারকগুলি চেষ্টা করুন: এই পৃষ্ঠায়: http://www.yolinux.com/TUTORIALS/GDB-Commands.html


এগুলি দেখতে ব্যবসায় হবে!
রিচার্ড কর্ডেন

তারা আসলে পূর্ববর্তী উত্তরের মতো একই ম্যাক্রো :) :) আমি ভয় করি যে এর চেয়ে সহজ সমাধানের কোনও সমাধান নেই।
পাওলো টেডেস্কো

হুকুম কী? আপনি প্রচুর পরিমাণে অপ্রাসঙ্গিক তথ্য দিয়ে আমাদের অফ-সাইট চালিয়েছেন। আমি "জিডিবি কীভাবে শুরু করব" এবং অন্যান্যগুলিতে আগ্রহী নই।
jww

0

উপরের উত্তরগুলি কার্যকর এবং জরিমানা। আপনি যদি stl-view.gdb ব্যবহার করছেন তবে এর ভিতরে থাকা মানচিত্র এবং উপাদানগুলি দেখার সঠিক উপায় এখানে। আপনার মানচিত্রটি নীচে দেওয়া যাক: std::map<char, int> myMap;

(gdb) pmap myMap char int

অর্থাত্ pmap <variable_name> <left_element_type> <right_element_type>মানচিত্রে উপাদানগুলি দেখতে।

আশা করি এইটি কাজ করবে.


-1

আপনি Cannot evaluate function -- may be inlinedযখন আপনার প্রোগ্রামটি সংকলন করেন তখন আপনার সংকলক DWARF-2 (বা 3 বা 4) ডিবাগিংয়ের তথ্য ব্যবহার করে তা নিশ্চিত করে দ্বিতীয় সমস্যাটি ( ) পেতে পারেন । DWARF-2 ইনলাইনিং তথ্য অন্তর্ভুক্ত করে, তাই আপনি আপনার ধারকটির উপাদানগুলিতে অ্যাক্সেস করতে বর্ণিত যে কোনও পদ্ধতি ব্যবহার করতে সক্ষম হওয়া উচিত std::map

DWARF-2 ডিবাগ তথ্যের -gdwarf-2সাথে সংকলন করতে, আপনার সংকলন কমান্ডে পতাকাটি যুক্ত করুন ।


4
ওম, কোনও ফাংশনটি কোথায় অন্তর্ভুক্ত হয়েছে তা জেনে জিডিবির পক্ষে সেই ফাংশনের কলগুলির মূল্যায়ন করা সম্ভব হয় না; ফাংশনটির একটি অন-লাইন অনুলিপিটিতে জিডিবির সত্যই অ্যাক্সেস দরকার!
স্যামবি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.