জিডিবি: বর্তমান লাইনটি কীভাবে মুদ্রণ করবেন বা বর্তমান লাইন নম্বরটি কীভাবে সন্ধান করবেন?


97

list কমান্ডগুলি লাইনগুলির একটি সেট মুদ্রণ করে, তবে আমার একটি একক লাইন দরকার, যেখানে আমি আছি এবং যেখানে সম্ভবত কোনও ত্রুটি ঘটেছে।


23
backtraceবা where, এমনকি info lineবা কেবল সহজভাবে bt(ব্যাকট্র্যাসের জন্য)। একটি জিডিবি টিউটোরিয়ালের জন্য dirac.org/linux/gdb
দ্বিপশু

btঅথবা backtraceবা whereফাংশন কলগুলির স্ট্যাক মুদ্রণ করুন, fবা frameকার্যকর করতে পরবর্তী লাইন মুদ্রণ করুন।
এরিক ওয়াং

উত্তর:


21

ডিবাগ করার সময় আমি একই তথ্য পাই। যদিও আমি স্ট্যাকট্রেসটি যাচাই করছি না। আমার মনে হয় আপনি সম্ভবত অপ্টিমাইজেশন পতাকা ব্যবহার করেছেন। এই লিঙ্কটি দেখুন - সম্পর্কিত কিছু।

-g3যেকোন অপ্টিমাইজেশন পতাকাটি সরানোর সাথে সংকলনের চেষ্টা করুন । তাহলে এটি কাজ করতে পারে। এইচটিএইচ!


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

107

'ফ্রেম' কমান্ড আপনাকে যা খুঁজছে তা আপনাকে দেবে। (এটি কেবল 'চ' সংক্ষেপে বর্ণিত হতে পারে)। এখানে একটি উদাহরণ:

(gdb) frame
\#0  zmq::xsub_t::xrecv (this=0x617180, msg_=0x7ffff00008e0) at xsub.cpp:139
139         int rc = fq.recv (msg_);
(gdb)

কোনও যুক্তি ছাড়াই, 'ফ্রেম' আপনাকে বলে দেয় আপনি কোথায় আছেন (একটি যুক্তি দিয়ে এটি ফ্রেম পরিবর্তন করে)। ফ্রেম কমান্ডের আরও তথ্য এখানে পাওয়া যাবে


22

কমান্ড যেখানে বা ফ্রেম ব্যবহার করা যেতে পারে। যেখানে কমান্ড ফাংশন নামের সাথে আরও তথ্য দেবে


21

মনে রাখবেন যে জিডিবি হ'ল একটি শক্তিশালী কমান্ড-নিম্ন স্তরের নির্দেশাবলীর সাবলীল - তাই সমাবেশের ধারণাগুলিতে আবদ্ধ।

আপনি যা খুঁজছেন তাকে ডি নির্দেশিকা পয়েন্টার বলা হয়, যেমন:

নির্দেশ পয়েন্টার রেজিস্টার মেমরি ঠিকানার দিকে নির্দেশ করে যা প্রসেসর পরবর্তী সময়ে কার্যকর করার চেষ্টা করবে। নির্দেশিকা নির্দেশককে 16-বিট মোডে আইপি , 32-বিট মোডে ইপ এবং 64৪ -বিট মোডে রিপ বলা হয়।

আরও বিস্তারিত এখানে

জিডিবি এক্সিকিউশনে উপলব্ধ সমস্ত রেজিস্টারগুলি এর সাথে প্রদর্শিত হতে পারে:

(gdb) info registers

এটির সাহায্যে আপনি জানতে পারবেন আপনার প্রোগ্রামটি কোন মোডে চলছে (এইগুলির মধ্যে কোন রেজিস্ট্রার রয়েছে তা দেখে)

তারপর (এখানে সবচেয়ে সাধারণ রেজিস্টার ব্যবহার চেরা আজকাল প্রতিস্থাপন eip বা খুব কমই IP প্রয়োজনে):

(gdb)info line *$rip

আপনি লাইন নম্বর এবং ফাইল উত্স প্রদর্শন করবে

(gdb) list *$rip

কিছু আগে এবং পরে আপনাকে সেই লাইনটি প্রদর্শন করবে

তবে সম্ভবত

(gdb) frame

অনেক ক্ষেত্রে যথেষ্ট হতে হবে।


4
আমার বিশ্বাস জিডিবি 16-বিট মোড সমর্থন করে না, তাই ipএখানে কখনও ব্যবহৃত হয় না। এছাড়াও, পরিবর্তে স্পষ্টভাবে প্রোগ্রাম কাউন্টার নাম বানান, আপনি GDB এর ওরফে জন্য ব্যবহার করতে পারেন: $pc। সুতরাং x/10i $pcবর্তমান নির্দেশ পয়েন্টার 10 নির্দেশাবলী অবতরণ স্থাপত্য নির্বিশেষে হবে - এটা মধ্যে i386,, x86_64 কাজ করবে, এআরএম ইত্যাদি ..
রুসলান

4

উপরের সমস্ত উত্তর সঠিক, আমি যা পছন্দ করি তা হল টুই মোড (সিটিআরএল + এক্সএ বা 'টুই সক্ষম') ব্যবহার করা যা আপনার অবস্থান এবং একটি পৃথক উইন্ডোতে ফাংশন দেখায় যা ব্যবহারকারীদের জন্য খুব সহায়ক। আশা করি এটিও সাহায্য করবে।

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