ব্রেকপয়েন্টগুলির একটি তালিকা সংরক্ষণ করতে জিডিবি পাচ্ছেন


129

ঠিক আছে, তথ্য বিরতি ব্রেকপয়েন্টগুলি তালিকাভুক্ত করে, তবে এই প্রশ্নে যেমন - কম্যান্ড ব্যবহার করে তাদের পুনঃব্যবহারের সাথে ভালভাবে কাজ করবে এমন বিন্যাসে নয় । জিডিবির কি আবার কোনও ইনপুট গ্রহণযোগ্য কোনও ফাইলে তাদের ফেলে দেওয়ার কোনও পদ্ধতি আছে? কখনও কখনও একটি ডিবাগিং সেশনে, পরীক্ষার জন্য ব্রেকপয়েন্টগুলির একটি সেট তৈরি করার পরে জিডিবি পুনরায় চালু করা প্রয়োজন।

.Gdbinit ফাইলটিতে - কম্যান্ডের মতো একই সমস্যা রয়েছে। তথ্য বিরতি কমান্ড মানুষের ব্যবহার জন্য একটি টেবিল কমান্ড তালিকা নয়, বরং।

বিস্তারিতভাবে বলতে গেলে, এখানে তথ্য বিরতি থেকে একটি নমুনা দেওয়া হয়েছে :

(জিডিবি) তথ্য বিরতি
নাম টাইপ ডিসপ এনব অ্যাড্রেস কি
1 ব্রেকপয়েন্টে y 0x08048517 <foo :: বার (শূন্য) +7> রাখুন

উত্তর:


204

জিডিবি 7.2 (2011-08-23) হিসাবে আপনি এখন সেভ ব্রেকপয়েন্টস কমান্ডটি ব্যবহার করতে পারেন ।

save breakpoints <filename>
  Save all current breakpoint definitions to a file suitable for use
  in a later debugging session.  To read the saved breakpoint
  definitions, use the `source' command.

source <filename>ফাইল থেকে সংরক্ষিত ব্রেকপয়েন্টগুলি পুনরুদ্ধার করতে ব্যবহার করুন।


2
তারা যদি কোনও শেয়ারকৃত লাইব লোড থেকে আসে তবে কী হবে? এটি এনকে ডিফল্টরূপে উত্তর দেয় বলে মনে হচ্ছে ...Make breakpoint pending on future shared library load? (y or [n]) [answered N; input not from terminal]
bjackfly

2
জিডিবি স্ক্রিপ্ট এবং জিডিবিতে ওয়াইয়ের উত্তর কীভাবে দেওয়াset breakpoint pending on হয়েছে তা বর্ণিত হিসাবে @ বিজ্যাকফ্লাই ব্যবহার করুন : কীভাবে
কম্যান্ডের

নোট করুন যে যখন আপনার break g_log if log_level==G_LOG_LEVEL_CRITICALব্রেকআপপয়েন্ট শর্ত থাকে যা প্রারম্ভকালে সমাধান করা যায় না ( ), তখন কমপক্ষে gdb 7.8.1 পরবর্তী কমান্ডগুলি পার্স করা বন্ধ করবে। যদি আপনার অতিরিক্ত কমান্ড থাকে যা সেই ব্রেকপয়েন্টের জন্য কার্যকর করা উচিত, commandsলাইনের আগে conditionলাইনটি রাখুন।
লেকেনস্টেইন

@ অ্যান্ড্রি আমি আপনার সম্পাদনাটি আমার মূল ব্লককোটে ফিরিয়ে দিয়েছি কারণ পাঠ্যটি ডকুমেন্টেশনের একটি ভারব্যাটিক উদ্ধৃতি ... অন্যথায় যদি এটি আমার নিজের শব্দ না হয় তবে আমি সম্পাদনাটির সাথে একমত হব।
অ্যাকুলিচ

@ অ্যাকুলিচ: আমি দেখছি। আমি কোনও ক্ষেত্রে কোড শৈলীর চেয়ে উদ্ধৃতি শৈলীটি ব্যবহার করার পরামর্শ দেব।
অ্যান্ড্রি

26

এই উত্তরটি পুরানো। জিডিবি এখন সরাসরি সংরক্ষণ সমর্থন করে। এই উত্তর দেখুন ।

আপনি লগিং ব্যবহার করতে পারেন:

(gdb) b main
Breakpoint 1 at 0x8049329
(gdb) info break
Num     Type           Disp Enb Address    What
1       breakpoint     keep y   0x08049329 <main+16>
(gdb) set logging file breaks.txt
(gdb) set logging on
Copying output to breaks.txt.
(gdb) info break
Num     Type           Disp Enb Address    What
1       breakpoint     keep y   0x08049329 <main+16>
(gdb) q

ব্রেকস টেক্সট ফাইলটিতে এখন রয়েছে:

Num     Type           Disp Enb Address    What
1       breakpoint     keep y   0x08049329 <main+16>

একটি AWK স্ক্রিপ্ট লেখা যা এটিকে রূপান্তর করে যা ফাইল .gdbinitবা --commandফাইলের জন্য দরকারী format অথবা আপনি এমনকি স্ক্রিপ্টটি --eval-commandজিডিবি কমান্ড লাইনে আলাদা আলাদা প্রেরণ করতে পারেন ...

.Gdbinit এ এই ছোট ম্যাক্রো যুক্ত করা আপনাকে এটি করতে সহায়তা করবে:

# Call with dump_breaks file.txt
define dump_breaks
    set logging file $arg0
    set logging redirect on
    set logging on
    info breakpoints
    set logging off
    set logging redirect off
end

কেউ ঠিক সহজেই কাট-পেস্ট ব্যবহার করতে পারে তবে স্ক্রিপ্টিং পদ্ধতিটি যাবার উপায় বলে মনে হয়।
নৈমিত্তিক কোডার

1
আমি মনে করি না যে একবারে স্ক্রিপ্ট লিখে একবার কাট-পেস্ট করা সহজ, আবার এটি প্রতিবার ব্যবহার করে :) সর্বোপরি, এই কারণেই আপনি এই প্রশ্নটি প্রথম স্থানে জিজ্ঞাসা করেছিলেন, আমি মনে করি :)
জোহানেস স্কাউব - লিটব

ওম, আমি লগিং পদ্ধতির পরিবর্তে কাট এবং পেস্ট ব্যবহার করছিলাম। স্ক্রিপ্টিং এটি এখনও পর্যন্ত নিশ্চিত।
ক্যাজুয়ালকোডার 21

কি দারুন! জিডিবি ফেল! আমি এটি প্রতিদিন ব্যবহার করি এবং এর বৈশিষ্ট্যগুলি অনেক পছন্দ করি। তবে অভাব কেবল সরল বোবা।
ডিফ্ট_কোড

4
এই উত্তরটি এখন 2 বছরেরও বেশি পুরানো হয়েছে সুতরাং আপনি যদি জিডিবির নতুন সংস্করণ ব্যবহার করেন তবে এটি অপ্রচলিত হতে পারে। Gdb 7.2 হিসাবে আপনি এখন save breakpointsকমান্ডটি ব্যবহার করতে পারেন ।
অ্যাকুলিচ

11

আপনার জিডিবি কমান্ড এবং ব্রেকপয়েন্টগুলি একটি .gdbinit ফাইলে রাখুন যেমন আপনি gdb>প্রম্পটে টাইপ করতে পারেন এবং জিডিবি সেগুলি স্বয়ংক্রিয়ভাবে লোড হবে এবং প্রারম্ভকালে চালাবে। এটি প্রতি ডিরেক্টরি ফাইল, যাতে আপনার বিভিন্ন প্রকল্পের জন্য আলাদা আলাদা ফাইল থাকতে পারে।


1
এটি আসলে কাজ করতে ব্যর্থ হয়, আমি "সতর্কতা: সেভ-ট্রসেপয়েন্টস: সংরক্ষণ করার জন্য কোনও ট্র্যাসপয়েন্টস" পাই না। ' ব্রেকপয়েন্টগুলি সেট করা সত্ত্বেও এটি
g.৮

এটি আমার পক্ষে কাজ করে। 'অ্যাড-অটো-লোড-সেফ-পাথ /home/johnny/src/.gdbinit' কনটেন্ট সহ জিডিবিতে আপনার / Home / .gdbinit এর একটি গ্লোবাল .gdbinit এর উপস্থিতি প্রয়োজন এবং সুতরাং এসসিআর / ফোল্ডারেও একটি পৃথক .gdbinit রয়েছে
ট্রুথহোল্ডার

9

থেকে একটি এক্সটেনশান বেনামা এর এক্সটেনশন করার জোহানেস 'উত্তর :

.gdbinit:

define bsave
    shell rm -f brestore.txt
    set logging file brestore.txt
    set logging on
    info break
    set logging off
    # Reformat on-the-fly to a valid GDB command file
    shell perl -n -e 'print "break $1\n" if /^\d+.+?(\S+)$/g' brestore.txt > brestore.gdb
end
document bsave
  store actual breakpoints
end

define brestore
  source brestore.gdb
end
document brestore
  restore breakpoints saved by bsave
end

সঙ্গে brestoreতারপর আপনি সংরক্ষিত ব্রেকপয়েন্ট পুনরুদ্ধার করতে পারেন bsave


এখানে আরও ভাল রেইজেক্স রয়েছে: পার্ল -ne "প্রিন্ট \" ব্রেক \ $ 1 \ n \ "যদি /at\s(.*:\d+)/" brestore.txt
জর্জ গডিক

6

থেকে এক্সটেনশন জোহানেস থেকে উত্তর : আপনি পারা স্বয়ংক্রিয়ভাবে আউটপুট ফরম্যাট info breakএকটি বৈধ, GDB কমান্ড ফাইলে:

.gdbinit:

define bsave
   shell rm -f brestore.txt
   set logging file brestore.txt
   set logging on
   info break
   set logging off
   # Reformat on-the-fly to a valid gdb command file
   shell perl -n -e 'print "break $1\n" if /^\d+.+?(\S+)$/g' brestore.txt > brestore.gdb
end
document bsave
  store actual breakpoints
end

এর পরে আপনার একটি বৈধ কমান্ডফাইল রয়েছে brestore.gdb

অ্যাপ্লিকেশনটি সংকলিত হওয়ার পরে এটি আমার পক্ষে কাজ করেছিল -g

আমি এটি সফলভাবে উবুন্টু 9.10 (কারমিক কোয়ালা) এ জিডিবি ভি 6.8 দিয়ে পরীক্ষা করেছি ।


1
এই স্নিপেট জন্য আপনাকে ধন্যবাদ! দুর্দান্ত কাজ করে। ম্যাক ওএস 10.5.8 এ কার্বনএম্যাকস জিএনইউ ইমাস্যাক্স 22.3.1 (i386-আপেল-ডারভিন 9.6.0, কার্বন সংস্করণ 1.6.0) এ GNU gdb 6.3.50-20050815 (অ্যাপল সংস্করণ gdb-966) সহ সফলভাবে পরীক্ষা করা হয়েছে।
পেস্টোফাগাস


3

ব্রেকডপয়েন্টগুলি সংরক্ষণ এবং পুনরুদ্ধার করার জন্য জিডিবি কমান্ড হিসাবে bsave এবং brestore কে সংজ্ঞায়িত করতে নিম্নলিখিতটি ~ / .gdbinit এ রাখুন ।

define bsave
    save breakpoints ~/.breakpoints
end

define brestore
   source ~/.breakpoints
end

1

সতর্কতা: বর্তমান আউটপুট প্রোটোকল পুনঃনির্দেশ সমর্থন করে না

TUI মোডে লগিং সক্ষম করার চেষ্টা করার সময় আমি জিডিবিতেও এই ত্রুটি / সতর্কতা পেয়েছি । যাইহোক, লগিং "নন-টিইউআই" মোডে থাকাকালীন কাজ করে বলে মনে হচ্ছে। আমি যখনই কিছু লগ ইন করতে চাই তাই আমি টিইউআই মোডটি ছেড়ে দিই। (টিউআইআই মোডে Ctrl+X , Ctrl+A সহ পিছনে টগল করুন )।

আমি কীভাবে কাজ করি তা এখানে:

  1. জিডিবি শুরু করুন (সাধারণ মোডে)
  2. লগিং সক্ষম করুন: set logging on- এখন এটি অভিযোগ করা উচিত নয়।
  3. TUI মোডে পিছনে / পিছনে টগল করুন এবং জিডিবি স্টাফ করুন
  4. যখনই আমি কোনও লগইন করতে চাই (বিশাল ব্যাকট্রেস ডাম্পের মতো) - টগল করুন সাধারণ মোডে

ওহ, এবং যদি আপনি "স্ক্রিন" ব্যবহার করতে চান (যেমন আমি করি) তবে এটি কিছুটা অগোছালো হয়ে উঠবে, কারণ এটি একই হটকি ব্যবহার করে ys
ম্যাগনাক্স

1

একটি নির্দিষ্ট ফাইলে ব্রেকপয়েন্টগুলি সংরক্ষণ / লোড করতে দরকারী পূর্ববর্তী উত্তরের নিম্নলিখিত সংযোজনগুলি আমি খুঁজে পেয়েছি।

  • ব্রেকপয়েন্টগুলি সংরক্ষণ করুন: bsave {ফাইলের নাম}
  • ব্রেক ব্রেকপয়েন্টগুলি লোড করুন {ফাইলের নাম}

পূর্বের উত্তরের মতো, code / .gdbinit ফাইলটিতে নিম্নলিখিত কোডটি যুক্ত করুন

# Save breakpoints to a file
define bsave
    if $argc != 1
        help bsave
    else
    save breakpoints $arg0
    end
end
document bsave
Saves all current defined breakpoints to the defined file in the PWD
Usage: bsave <filename>
end

# Loads breakpoints from a file
define bload
    if $argc != 1
        help bload
    else
        source $arg0
    end
end
document bload
Loads all breakpoints from the defined file in the PWD
Usage: bload <filename>
end

0

সমস্যাটি হ'ল একটি ব্রেকপয়েন্ট নির্ধারণ করা প্রসঙ্গে সংবেদনশীল। কি হবে যদি আপনি দুই স্ট্যাটিক ফাংশন নামে আছে foo বিন্যাস ?

আপনি যদি ইতিমধ্যে foo সংজ্ঞায়িত করে এমন কোনও মডিউল ডিবাগ করে থাকেন, তবে জিডিবি আপনাকে ধরে নেবে এমনটি ধরে নিবে। কিন্তু আপনি যদি শুধু একটি ফাইলে "বিরতি foo বিন্যাস" ডাম্প এবং তারপর স্টার্ট আপ যে ফাইলটি পড়ার, এটা স্পষ্ট, যা ফাংশন হবে না foo বিন্যাস আপনি কি বলতে চান।


0

অন্য কোন ধারণা? আমি পেয়েছি

warning: Current output protocol does not support redirection

পরে

set logging on

সম্পাদনা করুন:

আমি জানি যে প্রশ্নটি "ব্রেকপয়েন্টের একটি তালিকা কীভাবে সংরক্ষণ করতে হয়", তবে আমি সবেমাত্র আবিষ্কার করেছি যে জিডিবি দিয়ে আমরা কেবল "ফাইলটিতে সংরক্ষিত" ব্রেকপয়েন্ট সেট করতে পারি

gdb> source breakpoints.txt

এর breakpoints.txtমতো ফাইলটি কোথায় :

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