চর * x যখন একটি স্ট্রিংয়ে নির্দেশ করে যার মান "হ্যালো" সমান হয় তখন আমি কীভাবে জিডিবিতে শর্তযুক্ত ব্রেকপয়েন্ট সেট করব?


164

আমি কী উল্লেখ করতে পারি যে আমি জিডিবি লাইন এক্স-এ ব্রেক করতে চাই যখন char* xএকটি স্ট্রিংয়ে যার মান সমান হয় "hello"? যদি হ্যাঁ, কিভাবে?


দ্রষ্টব্য: strncmpএবং strstrঅন্যান্য দরকারী সি ক্যোয়ারী ফাংশন।
সিরো সান্তিলি 郝海东 冠状 病 六四 事件 法轮功

উত্তর:


198

আপনি ব্যবহার করতে পারেন strcmp:

break x:20 if strcmp(y, "hello") == 0

20লাইন নম্বর, xযে কোনও ফাইলের নাম yহতে পারে এবং কোনও পরিবর্তনশীলও হতে পারে।


9
দ্রষ্টব্য: আপনি অবশ্যই প্রোগ্রামটি ইতিমধ্যে চালাচ্ছেন যাতে GDB stdlib দেখতে পাবে। অন্যথায়:No symbol "strcmp" in current context.
সিরো সান্তিলি :45 冠状 病 六四 事件 法轮功

1
@ সিরোস্যান্টিলি 六四 事件 法轮功 包 卓 轩: কিভাবে স্টাডলিব দেখতে জিডিবি কনফিগার করবেন?
naive231

@ নায়েভ 231 "দেখে" দ্বারা আমি বোঝাতে চাইছি ফাংশনগুলি যাতে আপনি এগুলি ভেঙে ফেলতে পারেন, উত্স নয়: runগতিশীল লাইব্রেরিগুলি লোড হওয়ার জন্য আপনাকে এটির জন্য আঘাত করতে হবে। উৎস জন্য, এটি Google এবং খুঁজে পেয়েছেন: stackoverflow.com/questions/10000335/... :-)
সিরো Santilli郝海东冠状病六四事件法轮功

1
এই পদ্ধতিতে পার্শ্ব প্রতিক্রিয়া হতে পারে। $_streq@tlWitec এর থেকে পদ্ধতি আরও ভাল।
রোলগুলি

55
break x if ((int)strcmp(y, "hello")) == 0

কিছু বাস্তবায়নে জিডিবি হয়ত স্ট্রিম্পের রিটার্নের ধরণটি জানে না। তার মানে আপনাকে নিক্ষেপ করতে হবে, অন্যথায় এটি সর্বদা সত্য হিসাবে মূল্যায়ন করবে!


46

জিডিবি .5.৫ থেকে আপনি এই স্থানীয় সুবিধাজনক ফাংশনগুলি ব্যবহার করতে পারেন :

$_memeq(buf1, buf2, length)
$_regex(str, regex)
$_streq(str1, str2)
$_strlen(str)

strcmp()প্রতিটি বার ব্রেকপয়েন্টে আঘাত হানার পরে প্রক্রিয়াটিতে একটি "বিদেশী" চালানোর চেয়ে সমস্যা কম মনে হচ্ছে । এটি মাল্টিথ্রেডেড প্রক্রিয়াগুলি ডিবাগ করার জন্য বিশেষত সত্য।

নোট করুন আপনার জিডিবি পাইথন সমর্থন দিয়ে সংকলন করা দরকার যা বর্তমান লিনাক্স ডিস্ট্রোসের কোনও সমস্যা নয়। নিশ্চিত হওয়ার জন্য, আপনি এটি show configurationজিডিবির ভিতরে চালিয়ে এবং অনুসন্ধান করে পরীক্ষা করতে পারেন --with-python। এই ছোট্ট অনেলাইনার কৌশলটিও করেন:

$ gdb -n -quiet -batch -ex 'show configuration' | grep 'with-python'
             --with-python=/usr (relocatable)

আপনার ডেমো কেসের জন্য ব্যবহারটি হবে

break <where> if $_streq(x, "hello")

বা, যদি আপনার ব্রেকপয়েন্টটি ইতিমধ্যে বিদ্যমান থাকে এবং আপনি কেবল এটিতে শর্ত যুক্ত করতে চান

condition <breakpoint number> $_streq(x, "hello")

$_streqকেবলমাত্র পুরো স্ট্রিংয়ের সাথে মেলে, তাই আপনি যদি আরও কিছু ধূর্ত ব্যবহার করতে চান তবে আপনার পাইথন নিয়মিত প্রকাশের বাক্য গঠনটিকে$_regex সমর্থন করে ।

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