یک سیگنال یک رویداد ناهمزمان است که می تواند در یک برنامه اتفاق بیفتد. سیستم عامل انواع احتمالی سیگنال ها را تعریف می کند و به هر نوع نام و یک شماره می دهد. به عنوان مثال ، در یونیکس سیگینت سیگنالی است که برنامه هنگام تایپ کردن یک شخصیت قطع (اغلب ctrl-c) می شود. SIGSEGV سیگنالی است که یک برنامه از مراجعه به مکانی در حافظه به دور از همه مناطق مورد استفاده دریافت می کند. SIGALRM هنگامی اتفاق می افتد که تایمر ساعت زنگ دار خاموش شود (که فقط در صورتی اتفاق می افتد که برنامه شما زنگ هشدار داشته باشد).
برخی از سیگنال ها ، از جمله SIGALRM ، بخشی عادی از عملکرد برنامه شما هستند. دیگران ، مانند SIGSEGV ، خطاها را نشان می دهند. این سیگنال ها کشنده هستند (آنها برنامه شما را بلافاصله می کشند) اگر برنامه از قبل روش دیگری برای رسیدگی به سیگنال مشخص نشده باشد. Sigint خطایی در برنامه شما نشان نمی دهد ، اما به طور معمول کشنده است ، بنابراین می تواند هدف از وقفه را انجام دهد: برای کشتن برنامه.
GDBاین توانایی را دارد که هرگونه وقوع سیگنال را در برنامه شما تشخیص دهد. می توانید بگوییدGDBپیشاپیش برای هر نوع سیگنال چه کاری باید انجام دهید.
به طور معمول ،GDBتنظیم شده است تا اجازه دهید سیگنال های غیر موقت مانند Sigalrm به سکوت به برنامه شما منتقل شوند (تا در نقش آنها در عملکرد برنامه دخالت نکنید) اما هر زمان که سیگنال خطا اتفاق می افتد ، بلافاصله برنامه خود را متوقف کنید. می توانید این تنظیمات را با دستور دسته تغییر دهید.
اطلاعات سیگنال اطلاعات دسته
چاپ یک جدول از انواع سیگنال ها و چگونهGDBگفته شده است که هر یک را اداره کنید. می توانید از این استفاده کنید تا تعداد سیگنال های تمام انواع مشخص شده سیگنال ها را ببینید.
اطلاعات سیگنال سیگنال
اطلاعات مشابه ، اما چاپ فقط در مورد شماره سیگنال مشخص شده.
دسته اطلاعات نام مستعار سیگنال های اطلاعاتی است.
سیگنال گرفتن [سیگنال ... |' همه ' ]
برای سیگنال های مشخص شده یک نقطه صید تنظیم کنید. برای جزئیات بیشتر در مورد این دستور ، به Set Set Catchpoints مراجعه کنید.
رسیدگی به سیگنال [کلمات کلیدی…]
راه را تغییر دهیدGDBسیگنال سیگنال را کنترل می کند. سیگنال می تواند تعداد سیگنال یا نام آن باشد (در ابتدا با یا بدون "سیگ"). لیستی از تعداد سیگنال فرم "کم - بالا" ؛یا کلمه "همه" ، به معنای تمام سیگنال های شناخته شده. کلمات کلیدی آرگومان های اختیاری ، که در زیر شرح داده شده است ، می گویند چه تغییری ایجاد می کند.
کلمات کلیدی مجاز توسط دستور دسته می تواند به طور خلاصه باشد. نام کامل آنها عبارتند از:
GDBوقتی این سیگنال اتفاق می افتد ، نباید برنامه خود را متوقف کند. این ممکن است هنوز پیامی را چاپ کند که به شما می گوید سیگنال وارد شده است.
GDBوقتی این سیگنال اتفاق می افتد باید برنامه خود را متوقف کنید. این به معنای کلمه کلیدی چاپ نیز هست.
GDBباید هنگام وقوع این سیگنال پیام را چاپ کنید.
GDBاصلاً نباید از وقوع سیگنال اشاره کرد. این به معنای کلمه کلیدی Nostop نیز هست.
GDBباید به برنامه خود اجازه دهد این سیگنال را ببیند. برنامه شما می تواند سیگنال را اداره کند ، وگرنه اگر سیگنال کشنده باشد و به آن رسیدگی نشود ، ممکن است خاتمه یابد. Pass و Noignore مترادف هستند.
GDBنباید اجازه دهد برنامه شما این سیگنال را ببیند. nopass و نادیده گرفتن مترادف هستند.
هنگامی که یک سیگنال برنامه شما را متوقف می کند ، تا زمان ادامه کار ، سیگنال برای برنامه قابل مشاهده نیست. برنامه شما سیگنال را می بیند ، اگر پاس برای سیگنال مورد نظر در آن زمان عملی باشد. به عبارت دیگر ، بعد ازGDBیک سیگنال را گزارش می کند ، می توانید از دستور Handle با Pass یا Nopass استفاده کنید تا کنترل کنید که آیا برنامه شما هنگام ادامه این سیگنال را می بیند.
پیش فرض روی Nostop ، Noprint ، برای سیگنال های غیر هوادار مانند Sigalrm ، Sigwinch و Sigchld قرار دارد و برای متوقف کردن ، چاپ ، عبور برای سیگنال های اشتباه.
همچنین می توانید از دستور سیگنال برای جلوگیری از دیدن برنامه خود از سیگنال استفاده کنید ، یا باعث شود سیگنالی که به طور عادی نمی بیند ، یا هر زمان سیگنال به آن بدهد. به عنوان مثال ، اگر برنامه شما به دلیل نوعی خطای مرجع حافظه متوقف شد ، ممکن است مقادیر صحیح را در متغیرهای اشتباه ذخیره کرده و ادامه دهید ، به امید دیدن اجرای بیشتر. اما برنامه شما احتمالاً بلافاصله در نتیجه سیگنال کشنده پس از دیدن سیگنال خاتمه می یابد. برای جلوگیری از این امر ، می توانید با "سیگنال 0" ادامه دهید. به سیگنال دادن به برنامه خود مراجعه کنید.
GDBبرای پله کد اصلی بهینه می شود. اگر سیگنالی که دارای Nostop و مجموعه Pass Set است ، وارد می شود در حالی که یک دستور پله (به عنوان مثال ، مرحله ، مرحله ، بعدی) در حال انجام استGDBاجازه می دهد تا کنترل کننده سیگنال اجرا شود و سپس پس از بازگشت کنترل کننده سیگنال ، کد اصلی خط را از سر بگیرد. به عبارت دیگر،GDBمراحل بالای کنترل کننده سیگنال. این مانع از سیگنالهایی می شود که شما به عنوان جالب توجه (با Nostop Nostop) از تغییر تمرکز اشکال زدایی به طور غیر منتظره استفاده نمی کنید. توجه داشته باشید که خود کنترل کننده سیگنال هنوز هم ممکن است به یک نقطه شکست ضربه بزند ، برای سیگنال دیگری که توقف در اثر آن را انجام داده است ، یا برای هر رویدادی دیگر که به طور عادی منجر به متوقف کردن فرمان پله می شود ، متوقف کنید. همچنین توجه داشته باشید کهGDBهنوز هم به شما اطلاع می دهد که در صورت تنظیم چاپ ، این برنامه سیگنال دریافت کرده است.
اگر Handle Pass را برای یک سیگنال تنظیم کرده اید ، و برنامه شما یک کنترل کننده را برای آن تنظیم می کند ، پس از متوقف شدن برنامه شما به دلیل سیگنال ، وارد یک دستور پله مانند Step یا Stepi می شود (در صورت هدف سیگنال متوقف می شود (اگر هدف باشد. از آن پشتیبانی می کند).
به همین ترتیب ، اگر از دستور سیگنال صف استفاده می کنید تا سیگنال را در هنگام اجرای رزومه های نخ به موضوع فعلی تحویل دهید (به برنامه خود سیگنال دهید) ، سپس یک دستور پله ای وارد کنترل کننده سیگنال می شود.
در اینجا مثالی وجود دارد ، با استفاده از Stepi برای قدم زدن به اولین دستورالعمل SIGUSR1:
همان ، اما استفاده از سیگنال صف به جای انتظار برای دریافت برنامه ابتدا سیگنال:
در برخی از اهداف ،GDBقبل از اینکه در واقع به برنامه اشکال زدایی شود ، می تواند اطلاعات سیگنال اضافی مرتبط با سیگنال رهگیری شده را بازرسی کند. این اطلاعات توسط متغیر راحتی $ $ _siginfo صادر می شود و از داده هایی تشکیل می شود که توسط هسته در زمان دریافت سیگنال به کنترل کننده سیگنال منتقل می شود. نوع داده اطلاعات به خودی خود وابسته به هدف است. می توانید نوع داده را با استفاده از دستور ptype $ _siginfo مشاهده کنید. در سیستم های UNIX ، به طور معمول مطابق با نوع استاندارد SIGINFO_T ، همانطور که در هدر سیستم سیگنال تعریف شده است.
یک مثال در اینجا ، در یکگون/سیستم لینوکس ، چاپ آدرس ارجاع شده ولگرد که یک گسل تقسیم بندی را مطرح کرده است.
بسته به پشتیبانی هدف ، $ _siginfo نیز ممکن است قابل نوشتن باشد.
در برخی از اهداف ، یک SIGSEGV می تواند در اثر نقض مرزی ایجاد شود ، یعنی دسترسی به آدرس خارج از محدوده مجاز. در این مواردGDBممکن است بسته به نحوه نمایش اطلاعات اضافی را نشان دهدGDBگفته شده است که سیگنال را اداره کنید. با STOP STOP SIGSEGV ،GDBنوع تخلف را نشان می دهد: "فوقانی" یا "پایین" ، آدرس حافظه به دسترسی و مرزها ، در حالی که با دسته Nostop Sigsegv هیچ اطلاعات اضافی نمایش داده نمی شود.
تجارت با گزینههای باینری...
ما را در سایت تجارت با گزینههای باینری دنبال می کنید
برچسب :
نویسنده : نازنین فراهانی
بازدید : 46
تاريخ : سه
شنبه
16 خرداد
1402 ساعت: 11:59