কীভাবে আর্গুমেন্টগুলি পাস করবেন এবং জিডিবিতে চালিত কোনও ফাইল থেকে স্টিডিন পুনর্নির্দেশ করবেন?


210

আমি সাধারণত একটি প্রোগ্রাম পরিচালনা করি:

./a.out arg1 arg2 <file

আমি জিডিবি ব্যবহার করে এটি ডিবাগ করতে চাই।

আমি set argsকার্যকারিতা সম্পর্কে সচেতন , কিন্তু এটি কেবল জিডিবি প্রম্পট থেকে কাজ করে।

উত্তর:


136

Gdb এর runমধ্যে থেকে কমান্ডটিতে যুক্তিগুলি পাস করুন ।

$ gdb ./a.out
(gdb) r < t
Starting program: /dir/a.out < t

3
rএর জন্য সংক্ষিপ্ত runএবং আপনি যে কোনও যুক্তি দিয়ে এটি অনুসরণ করতে পারেন। এই প্রশ্নের মতো, এটি হতে পারে: r arg1 arg2 <fileবা এটি হতে পারেrun arg1 arg2 <file
ফায়াত

আমার জন্য এটি কাজ করে না। তারপর আমি চেষ্টা $ gdb ./a.outতারপর (gdb) r < t arg1 arg2যা আমার জন্য কাজ করে জরিমানা। আমার ক্ষেত্রে a.out = nft arg1 = import arg2 = json এবংt = file containing json rules
mystictot

410

তুমি এটি করতে পারো:

gdb --args path/to/executable -every -arg you can=think < of

ম্যাজিক বিট হচ্ছে --args

runডিবাগিং শুরু করতে gdb কমান্ড কনসোলটি টাইপ করুন ।


24
আমি ভেবেছিলাম আমি প্রথমে এই ভুলটি পড়ছি; অদ্ভুত যে --args এক্সিকিউটেবলের আগে যায়। তবে তাই!
কওলিন ফায়ার

8
@ ক্যালিন --আরগগুলি অবশ্যই নির্বাহের আগে আসবে কারণ এটি জিডিবি-র একটি সুইচ। যদি এটি পরে আসে, জিডিবি আপনি যে যুক্তিটি ডিবাগ করছেন তার মধ্যে কার্যকর করতে চান এমন একটি যুক্তি থেকে এটি কীভাবে আলাদা করবে?
কোডিপ্পো

9
@codehippo: হ্যাঁ, আপনি নির্দিষ্ট করেন নি যদি --argsতারপর নয় কোনো আর্গুমেন্ট সম্পাদনযোগ্যতা পাস, তাই এটি কমই দ্ব্যর্থক আছে।
হালকা ঘোড়দৌড়

14
আমি এটি অনুমান করছি কারণ প্রচলিতভাবে সম্পাদনাকারীর argv[0]নাম
ক্লোডিউ

3
gdbএটি ofফাইলের কাছে নিজের ইনপুট পুনর্নির্দেশ করবে এবং এর ফলে জিডিবি এতে আদেশগুলি কার্যকর করতে চেষ্টা করবে
unkulunkulu

4

আপনার প্রোগ্রামটি পুনঃনির্দেশ এবং যুক্তি দিয়ে কার্যকর করতে যদি আপনি খালি runকমান্ড পেতে চান তবে আপনি এটি gdbব্যবহার করতে পারেন set args:

% gdb ./a.out
(gdb) set args arg1 arg2 <file
(gdb) run

আমি --argsপ্যারামিটারের সাথে একই আচরণ অর্জন করতে অক্ষম ছিলাম , gdbতীব্রভাবে পুনর্নির্দেশগুলি থেকে পালাতে পারি, অর্থাৎ

% gdb --args echo 1 2 "<file"
(gdb) show args
Argument list to give program being debugged when it is started is "1 2 \<file".
(gdb) run
...
1 2 <file
...

এটি আসলে gdb এর ইনপুট পুনঃনির্দেশ করে, আমরা এখানে যা চাই তা নয়

% gdb --args echo 1 2 <file
zsh: no such file or directory: file

1

আপনার প্রকল্পে জিডিবি শুরু করুন।

  1. প্রকল্প ডিরেক্টরিতে যান, যেখানে আপনি ইতিমধ্যে প্রকল্প নির্বাহযোগ্য সংকলন করেছেন। কমান্ড জিডিবি এবং এক্সিকিউটেবলের নাম নীচের মত জারি করুন:

    gdb প্রোজেক্টএক্সেকটেবল নাম name

এটি জিডিবি শুরু করে, নিম্নলিখিতগুলি মুদ্রণ করে: জিএনইউ জিডিবি (উবুন্টু 7.11.1-0ubuntu1 ~ 16.04) 7.11.1 কপিরাইট (সি) 2016 ফ্রি সফটওয়্যার ফাউন্ডেশন, ইনক। ............... .................................. "শব্দ" সম্পর্কিত আদেশগুলি সন্ধান করতে "এপ্রোপস শব্দ" টাইপ করুন .. প্রকল্পের এক্সেকিউটেবল নাম থেকে প্রতীকগুলি পড়া ... সম্পন্ন হয়েছে। (GDB)

  1. আপনি আপনার প্রোগ্রামটি চলমান শুরু করার আগে, আপনি আপনার ব্রেকপয়েন্টগুলি সেট আপ করতে চান। ব্রেক কমান্ড আপনাকে এটি করার অনুমতি দেয়। প্রধান নামের ফাংশনটির শুরুতে একটি ব্রেকপয়েন্ট সেট করতে:

    (gdb) বি প্রধান

  2. একবার আপনার (জিডিবি) প্রম্পট হয়ে গেলে রান কমান্ডটি এক্সিকিউটেবল চলমান শুরু করে। আপনি যে প্রোগ্রামটি ডিবাগ করছেন তা যদি কোনও কমান্ড-লাইন আর্গুমেন্টের প্রয়োজন হয় তবে আপনি সেগুলি রান কমান্ডের সাথে নির্দিষ্ট করে দিন। আপনি যদি "xfiles" ফাইলটিতে প্রকল্পটি চালাতে চান (যা প্রকল্প ডিরেক্টরিতে "মাল্ডার" ফোল্ডারে রয়েছে), আপনি নিম্নলিখিতটি করতে পারেন:

    (gdb) r mulder / xfiles

আশাকরি এটা সাহায্য করবে.

দাবি অস্বীকার: এই সমাধানটি আমার নয়, এটি https://web.stanford.edu/class/cs107/guide_gdb.html থেকে গৃহীত হয়েছে, জিডিবির এই সংক্ষিপ্ত গাইডটি সম্ভবত স্ট্যানফোর্ড বিশ্ববিদ্যালয়েই তৈরি হয়েছিল।


0

শেল স্তরে debugএটি ডিবাগ করতে সক্ষম হতে কেবল কোনও আদেশের সামনে টাইপ করা ভাল না gdb?

এটি নীচে এই ফাংশন। এমনকি এটি নিম্নলিখিতগুলির সাথেও কাজ করে:

"$program" "$@" < <(in) 1> >(out) 2> >(two) 3> >(three)

এটি এমন একটি কল যেখানে আপনি কোনও কিছুকে নিয়ন্ত্রণ করতে পারবেন না, সবকিছু পরিবর্তনশীল, ফাঁকা স্থান, লাইনফিড এবং শেল মেটাচার্যাক্টর থাকতে পারে। এই উদাহরণে, in, out, two, এবং threeনির্বিচারে অন্যান্য কমান্ডের যা গ্রাস বা ডেটা ফসল যা ক্ষতিগ্রস্ত করা আবশ্যক হয়।

অনুসরণ করছেন bashফাংশন পূজা gdbএমন একটি পরিবেশ প্রায় পরিচ্ছন্ন [ সারকথা ]:

debug()
{
  1000<&0 1001>&1 1002>&2 \
  0</dev/tty 1>/dev/tty 2>&0 \
  /usr/bin/gdb -q -nx -nw \
  -ex 'set exec-wrapper /bin/bash -c "exec 0<&1000 1>&1001 2>&1002 \"\$@\"" exec' \
  -ex r \
  --args "$@";
}

এটি কীভাবে প্রয়োগ করতে হবে তার উদাহরণ: কেবল debugসামনে টাইপ করুন :

আগে:

p=($'\n' $'I\'am\'evil' "  yay  ")
"b u g" "${p[@]}" < <(in) 1> >(out) 2> >(two) 3> >(three)

পরে:

p=($'\n' $'I\'am\'evil' "  yay  ")
debug "b u g" "${p[@]}" < <(in) 1> >(out) 2> >(two) 3> >(three)

এটাই. এখন এটির সাথে ডিবাগ করার জন্য এক নিখুঁত নো-ব্রেইনার gdb। কয়েকটি বিশদ বা আরও কিছু বাদে:

  • gdbস্বয়ংক্রিয়ভাবে প্রস্থান করবে না এবং তাই আপনি প্রস্থান না করা অবধি আইও পুনঃনির্দেশটি খোলা রাখে gdb। তবে আমি এটিকে একটি বৈশিষ্ট্য বলেছি।

  • আপনি সহজে argv0প্রোগ্রাম হিসাবে পাস করতে পারবেন না exec -a arg0 command args। নিম্নলিখিত এই কৌতুক করতে হবে: পর exec-wrapperপরিবর্তন "execকরতে "exec -a \"\${DEBUG_ARG0:-\$1}\"

  • 1000 ওপেনের উপরে এফডি রয়েছে, যা সাধারণত বন্ধ থাকে। এটি যদি সমস্যা 0<&1000 1>&1001 2>&1002হয় তবে পড়তে পরিবর্তন করুন0<&1000 1>&1001 2>&1002 1000<&- 1001>&- 1002>&-

  • সমান্তরালভাবে আপনি দুটি ডিবাগার চালাতে পারবেন না। কিছু অন্যান্য কমান্ড /dev/tty(বা STDIN) গ্রাস করলে সমস্যাও থাকতে পারে । এটি ঠিক করার জন্য, প্রতিস্থাপন /dev/ttyসঙ্গে "${DEBUGTTY:-/dev/tty}"। অন্য কোনও টিটিওয়াই টাইপ করুন tty; sleep infএবং তারপরে /dev/pts/60ডিবাগিংয়ের জন্য মুদ্রিত টিটিওয়াই (i। ই। ) ব্যবহার করুন DEBUGTTY=/dev/pts/60 debug command arg..। এটি শেলের পাওয়ার, এটি অভ্যস্ত হয়ে উঠুন!

ফাংশন ব্যাখ্যা:

  • 1000<&0 1001>&1 1002>&2 প্রথম 3 টি এফডি সরিয়ে দেয়
    • এটি ধরে নেওয়া হয় যে 1000, 1001 এবং 1002 এফডি বিনামূল্যে
  • 0</dev/tty 1>/dev/tty 2>&0আপনার বর্তমান টিটিওয়াইতে নির্দেশ করতে প্রথম 3 টি এফডি পুনরুদ্ধার করে। সুতরাং আপনি নিয়ন্ত্রণ করতে পারেন gdb
  • /usr/bin/gdb -q -nx -nwরান gdbপূজা gdbশেল উপর
  • -ex 'set exec-wrapper /bin/bash -c "exec 0<&1000 1>&1001 2>&1002 \"\$@\"" একটি স্টার্টআপ মোড়ক তৈরি করে, যা প্রথম 3 টি এফডি পুনরুদ্ধার করে যা 1000 বা তারও উপরে সংরক্ষণ করা হয়েছিল
  • -ex r ব্যবহার করে প্রোগ্রামটি শুরু করে exec-wrapper
  • --args "$@" প্রদত্ত আর্গুমেন্ট পাস

এত সহজ ছিল না?

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