আমি সাধারণত একটি প্রোগ্রাম পরিচালনা করি:
./a.out arg1 arg2 <file
আমি জিডিবি ব্যবহার করে এটি ডিবাগ করতে চাই।
আমি set args
কার্যকারিতা সম্পর্কে সচেতন , কিন্তু এটি কেবল জিডিবি প্রম্পট থেকে কাজ করে।
আমি সাধারণত একটি প্রোগ্রাম পরিচালনা করি:
./a.out arg1 arg2 <file
আমি জিডিবি ব্যবহার করে এটি ডিবাগ করতে চাই।
আমি set args
কার্যকারিতা সম্পর্কে সচেতন , কিন্তু এটি কেবল জিডিবি প্রম্পট থেকে কাজ করে।
উত্তর:
Gdb এর run
মধ্যে থেকে কমান্ডটিতে যুক্তিগুলি পাস করুন ।
$ gdb ./a.out
(gdb) r < t
Starting program: /dir/a.out < t
$ gdb ./a.out
তারপর (gdb) r < t arg1 arg2
যা আমার জন্য কাজ করে জরিমানা। আমার ক্ষেত্রে a.out = nft
arg1 = import
arg2 = json
এবংt = file containing json rules
তুমি এটি করতে পারো:
gdb --args path/to/executable -every -arg you can=think < of
ম্যাজিক বিট হচ্ছে --args
।
run
ডিবাগিং শুরু করতে gdb কমান্ড কনসোলটি টাইপ করুন ।
--args
তারপর নয় কোনো আর্গুমেন্ট সম্পাদনযোগ্যতা পাস, তাই এটি কমই দ্ব্যর্থক আছে।
argv[0]
নাম
gdb
এটি of
ফাইলের কাছে নিজের ইনপুট পুনর্নির্দেশ করবে এবং এর ফলে জিডিবি এতে আদেশগুলি কার্যকর করতে চেষ্টা করবে
আপনার প্রোগ্রামটি পুনঃনির্দেশ এবং যুক্তি দিয়ে কার্যকর করতে যদি আপনি খালি 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
আপনার প্রকল্পে জিডিবি শুরু করুন।
প্রকল্প ডিরেক্টরিতে যান, যেখানে আপনি ইতিমধ্যে প্রকল্প নির্বাহযোগ্য সংকলন করেছেন। কমান্ড জিডিবি এবং এক্সিকিউটেবলের নাম নীচের মত জারি করুন:
gdb প্রোজেক্টএক্সেকটেবল নাম name
এটি জিডিবি শুরু করে, নিম্নলিখিতগুলি মুদ্রণ করে: জিএনইউ জিডিবি (উবুন্টু 7.11.1-0ubuntu1 ~ 16.04) 7.11.1 কপিরাইট (সি) 2016 ফ্রি সফটওয়্যার ফাউন্ডেশন, ইনক। ............... .................................. "শব্দ" সম্পর্কিত আদেশগুলি সন্ধান করতে "এপ্রোপস শব্দ" টাইপ করুন .. প্রকল্পের এক্সেকিউটেবল নাম থেকে প্রতীকগুলি পড়া ... সম্পন্ন হয়েছে। (GDB)
আপনি আপনার প্রোগ্রামটি চলমান শুরু করার আগে, আপনি আপনার ব্রেকপয়েন্টগুলি সেট আপ করতে চান। ব্রেক কমান্ড আপনাকে এটি করার অনুমতি দেয়। প্রধান নামের ফাংশনটির শুরুতে একটি ব্রেকপয়েন্ট সেট করতে:
(gdb) বি প্রধান
একবার আপনার (জিডিবি) প্রম্পট হয়ে গেলে রান কমান্ডটি এক্সিকিউটেবল চলমান শুরু করে। আপনি যে প্রোগ্রামটি ডিবাগ করছেন তা যদি কোনও কমান্ড-লাইন আর্গুমেন্টের প্রয়োজন হয় তবে আপনি সেগুলি রান কমান্ডের সাথে নির্দিষ্ট করে দিন। আপনি যদি "xfiles" ফাইলটিতে প্রকল্পটি চালাতে চান (যা প্রকল্প ডিরেক্টরিতে "মাল্ডার" ফোল্ডারে রয়েছে), আপনি নিম্নলিখিতটি করতে পারেন:
(gdb) r mulder / xfiles
আশাকরি এটা সাহায্য করবে.
দাবি অস্বীকার: এই সমাধানটি আমার নয়, এটি https://web.stanford.edu/class/cs107/guide_gdb.html থেকে গৃহীত হয়েছে, জিডিবির এই সংক্ষিপ্ত গাইডটি সম্ভবত স্ট্যানফোর্ড বিশ্ববিদ্যালয়েই তৈরি হয়েছিল।
শেল স্তরে 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 টি এফডি সরিয়ে দেয়
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 "$@"
প্রদত্ত আর্গুমেন্ট পাসএত সহজ ছিল না?
r
এর জন্য সংক্ষিপ্তrun
এবং আপনি যে কোনও যুক্তি দিয়ে এটি অনুসরণ করতে পারেন। এই প্রশ্নের মতো, এটি হতে পারে:r arg1 arg2 <file
বা এটি হতে পারেrun arg1 arg2 <file