লিনাক্সে জিডিবি-র জন্য প্রোগ্রামিমে সি বা সি ++ কোডে ব্রেকপয়েন্ট সেট করুন Set


105

আমি কীভাবে সি বা সি ++ কোডে ব্রেকআপপয়েন্ট সেট করতে পারি যা লিনাক্সে জিডিবি-র জন্য কাজ করবে?

অর্থাৎ,

int main(int argc, char** argv)
{
    /* set breakpoint here! */
    int a = 3;
    a++;  /*  In gdb> print a;  expect result to be 3 */
    return 0;
}

8
খুব একটা পার্শ্ব নোট (নিতপিকের জন্য দুঃখিত), তবে আপনি যদি বহনযোগ্যতা নিয়ে চিন্তিত হন তবে আপনি সম্ভবত নির্ভুলতা সম্পর্কেও উদ্বিগ্ন হন - তাই int mainবরং void main
স্টুয়ার্ট গোলোডেটজ

@ স্টুয়ার্ট - স্থির। কিছুক্ষণ আগে এটা করা উচিত ছিল।
জে। পোলফার

4
@ জে.পল্ফার: return 0যদিও এটি প্রয়োজনীয় নয় এবং এটি কেবল শোরগোল!
অরবিট

উত্তর:


107

একটি উপায় হ'ল একটি বাধা সংকেত দেওয়া:

#include <csignal>

// Generate an interrupt
std::raise(SIGINT);

সি তে:

#include <signal.h>
raise(SIGINT);

আপডেট : এমএসডিএন জানিয়েছে যে উইন্ডোজ সত্যই সমর্থন করে না SIGINT, সুতরাং বহনযোগ্যতা যদি উদ্বেগের বিষয় হয় তবে আপনি সম্ভবত ব্যবহার করা ভাল SIGABRT


হ্যাঁ, এটি অপারেটিং সিস্টেম / সংকলক / ডিবাগার জুড়ে কাজ করা উচিত।
হাভার্ড এস

1
আমি অন্যান্য ডিবাগারগুলি জানি না, তবে জিডিবি সিগন্যাল হ্যান্ডলিংয়ের ক্ষেত্রে বেশ নমনীয় ।
ক্যাসাবেল

4
আমরা কিছু ইউনিসিতে সিগন্যাপটি আরও ভালভাবে পেয়েছি
জেবিআরউইলকিনসন

1
উইন্ডোজ, এমএসভিসিতে আপনি __debug_break, DebugBreak বা _asm {int 3 use ব্যবহার করতে পারেন}
ফার্নান্দো গঞ্জালেজ সানচেজ

2
@ ফার্নান্দোগোঞ্জালেজ সানচেজ: আসলে ফাংশনটির নাম __debugbreak()এবং না __debug_break() , যেমন আপনি এখানে
মরিক্স দেব ২ '

27

একটি প্রকল্পে আমি কাজ করি, আমরা এটি করি:

raise(SIGABRT);  /* To continue from here in GDB: "signal 0". */

(আমাদের ক্ষেত্রে আমরা যদি ডিবাগারের বাইরে এটি ঘটে থাকে তবে আমরা শক্তভাবে ক্র্যাশ করতে চেয়েছিলাম, যদি সম্ভব হয় তবে ক্র্যাশ রিপোর্ট তৈরি করা যায় That's এটিই একটি কারণ যা আমরা স্যাব্যাবআরটিটি ব্যবহার করেছি Windows উইন্ডোজ, ম্যাক এবং লিনাক্স জুড়ে এই বহনযোগ্য প্রচেষ্টা করা হয়েছে took আমরা কয়েকটি দিয়ে শেষ করেছি # আইডিডিএফস, সহায়তার সাথে এখানে মন্তব্য করেছেন: http://hg.mozilla.org/mozilla-central/file/98fa9c0cff7a/js/src/jsutil.cpp#l66 ।)


2
যথারীতি উইন্ডোজ অন্যের মতো লাগে না :)
ম্যাথ

বিরতি অবস্থায় প্রোগ্রামটি চালিয়ে যেতে "সংকেত 0" জারি করা কি সম্ভব? 'সি' জারি না করে এই জায়গা থেকে 'এন' বা 'এস' ব্যবহার করতে সক্ষম হওয়াই ভাল লাগবে।
জেসন ডাউসেট

2
@ জেসনডুয়েস্ট যদি আপনি সত্যিই প্রোগ্রামটি বিরতি দিতে চান তবে breakpoint()আপনি আপনার প্রোগ্রামে কোনও ফাংশন যুক্ত করতে চান (এটি খালি হতে পারে বা একটি মুদ্রণ বিবৃতি থাকতে পারে) এবং এতে break breakpointআপনার যোগ করতে পারেন ~/.gdbinit
জেসন ওরেডরফ

26

তাকিয়ে এখানে , আমি নিম্নলিখিত পদ্ধতিতে পাওয়া যায়নি:

void main(int argc, char** argv)
{
    asm("int $3");
    int a = 3;
    a++;  //  In gdb> print a;  expect result to be 3
}

এটি আমার কাছে স্পর্শের মত মনে হচ্ছে। এবং আমি মনে করি এটি কেবল x86 আর্কিটেকচারে কাজ করে।


3
এবং কেবল সংস্থাগুলি সহ এটিএন্ডটি অ্যাসেম্বলি সিনট্যাক্স সমর্থন করে। বিশেষত, মাইক্রোসফ্ট সংকলক ( cl.exe) এই সিনট্যাক্স সমর্থন করে না, তবে একটি পৃথক বাক্য গঠন ব্যবহার করে।
হাভার্ড এস

প্রশ্নটি লিনাক্স সম্পর্কে ছিল, সুতরাং আমি অনুমান করি যে আমরা অনুমান করতে পারি যে জিসিসি সিনট্যাক্স x86 এর জন্য কাজ করবে।
জেএস।

বিটিডাব্লু - আমি আমার x86 মেশিনে উপরেরটি ব্যবহার করে দেখেছি এবং এটি কার্যকর হয়েছে। এটি করার আরও ভাল উপায় থাকলে আমি আগ্রহী ছিলাম was দেখে মনে হচ্ছে।
জে। পোলফার

2
আমি উইন্ডোজগুলিতে মিংডাব্লু ব্যবহার করছি যাতে অন্য পরামর্শগুলি আমাকে সহায়তা করতে পারে না। সিগিন্ট সিগন্যাল বাড়াতে কেবল অ্যাপ্লিকেশনটি সমাপ্ত হয়, মাইনডাব্লিউ শিরোনামগুলিতে SIGTrap সংজ্ঞায়িত হয় না ... ইন্ট ইনস্ট্রাকশন ব্যবহার করা সাইনপ্রেটকে প্রেরণ করে এবং যথাযথ লাইনে জিডিবি ব্রেকগুলি সুন্দরভাবে প্রেরণ করে।
মাচ্তা

লিনাক্সে, int 3একটি সিগরাট উত্থাপন করে।
সিরো সান্তিলি 郝海东 冠状 病 六四 事件 法轮功

12

__asm__("int $3"); কাজ করা উচিত:

int main(int argc, char** argv)
{
    /* set breakpoint here! */
    int a = 3;
    __asm__("int $3");
    a++;  /*  In gdb> print a;  expect result to be 3 */
    return 0;
}

1
আমি এটি পছন্দ করি #define, যাতে আমার টুটি সিনট্যাক্সটি মনে রাখে না। আমি এটি আমার কোড জুড়ে ছিটিয়েছি, কখনও কখনও এর জায়গায় assert(), ডিবিগগার থামানোর পরে আসুন আমাকে সমস্ত ভেরিয়েবল এবং স্ট্যাক পরীক্ষা করতে দিন। এবং, অবশ্যই,
দৃsert়তার

মজার বিষয় হল যে "লিনাক্স" এবং "জিডিবি" এর প্রশ্নগুলির সীমাবদ্ধতা সমাবেশকে অবলম্বন করার বাইরে প্রচুর বিকল্প দেয়, যা অন্য কোনও কিছু না হলে বহনযোগ্যতার জন্য সর্বদা সর্বশেষতম অবলম্বন হওয়া উচিত। অন্যান্য উত্তরগুলি দেখুন দয়া করে।
বেনজামিন ক্রফোর্ড Ctrl-Alt-Tut

5

সফ্টওয়্যার ব্রেকপয়েন্টগুলির জন্য ডেডিকেটেড সিগন্যালটি ব্যবহার না করে এতগুলি উত্তর দেখে হতাশাবোধ SIGTRAP:

#include <signal.h>

raise(SIGTRAP); // At the location of the BP.

1

ওএস এক্স-এ আপনি কেবল কল করতে পারেন std::abort()(এটি লিনাক্সেও একই রকম হতে পারে)


কোন গ্রন্থাগার?
অ্যালেক্স

এটি স্ট্যান্ডার্ড সি ++ লাইব্রেরির অংশ এবং ক্রস প্ল্যাটফর্ম যেখানে C ++ 11- অনুবর্তী কম্পাইলারগুলি উপস্থিত রয়েছে। এটি তবে SIGABRT উত্থাপন করে, যা প্রকৃতপক্ষে এই পরিস্থিতিতে উত্থাপনের জন্য উপযুক্ত সংকেত নয়।
বেনজামিন ক্রফোর্ড Ctrl-Alt-Tut
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.