اگر با مجموعه فرمان GDB آشنا هستید ، در اینجا دقیق نحوه اجرای LLDB آورده شده است. ما با برخی از جزئیات در مورد ساختار فرمان LLDB و نحو شروع خواهیم کرد تا به شما کمک کند.
ساختار فرمان ¶
بر خلاف مجموعه فرمان GDB ، که کاملاً آزاد است ، ما سعی کردیم نحو فرمان LLDB را نسبتاً ساختار یافته کنیم. دستورات همه فرم هستند:
تجزیه خط فرمان قبل از اجرای فرمان انجام می شود ، بنابراین در تمام دستورات یکنواخت است. نحو فرمان برای دستورات اساسی بسیار ساده است ، آرگومان ها ، گزینه ها و مقادیر گزینه همه از فضای سفید جدا شده و از حروف دوتایی برای محافظت از فضاهای سفید در یک آرگومان استفاده می شود. اگر شما نیاز به قرار دادن یک شخصیت پشتی یا شخصیت دوتایی در یک استدلال دارید ، آن را در این استدلال به عقب برگردانید. این باعث می شود که نحو فرمان منظم تر شود ، اما این بدان معنی است که شما ممکن است مجبور شوید برخی از استدلال ها را در LLDB نقل کنید که در GDB نمی خواهید.
گزینه ها را می توان در هر نقطه از خط فرمان قرار داد ، اما اگر آرگومان ها با "-" شروع می شوند ، باید به LLDB بگویید که با اضافه کردن یک خاتمه گزینه ، گزینه های دستور فعلی را انجام داده اید: "-". به عنوان مثال ، اگر می خواهید یک فرآیند را راه اندازی کنید و به دستور "راه اندازی فرآیند" گزینه "-stop-at-entry" را ارائه دهید ، اما می خواهید فرآیندی را که می خواهید راه اندازی کنید با آرگومان های "-PROGROM_ARG ارزش راه اندازی شود."، شما تایپ می کنید:
ما همچنین سعی کردیم تعداد پارسرهای استدلال هدف خاص را کاهش دهیم ، که گاهی کاربر را مجبور می کند تا در مورد بیان اهداف خود کمی صریح تر باشد. اولین موردی که به این نکته توجه خواهید کرد ، دستور Breakpoint است. در GDB ، برای تنظیم یک نقطه شکست ، ممکن است وارد شوید
برای شکستن در خط 12 foo. c ، و:
برای شکستن در عملکرد foo. با گذشت زمان ، تجزیه کننده ای که به foo. c می گوید: 12 از foo از foo. c :: foo (که به معنای عملکرد foo در پرونده foo. c است) پیچیده تر و عجیب تر و به خصوص در C ++ وجود داردمواقعی که واقعاً هیچ راهی برای مشخص کردن عملکردی که می خواهید در آن شکسته شوید وجود ندارد. دستورات LLDB به صورت لفظی تر اما دقیق تر هستند و امکان اتمام خودکار هوشمند را فراهم می کنند.
برای تنظیم همان پرونده و خط خط خط در LLDB می توانید هر یک از:
برای تنظیم یک نقطه شکست بر روی تابعی به نام FOO در LLDB می توانید هر یک از:
شما می توانید چندین بار از گزینه Name استفاده کنید تا در مجموعه ای از توابع نیز نقطه شکست را ایجاد کنید. این راحت است زیرا به شما امکان می دهد شرایط یا دستورات مشترکی را تنظیم کنید بدون اینکه چندین بار آنها را مشخص کنید:
تنظیم نقاط بر اساس نام حتی در LLDB تخصصی تر است زیرا می توانید مشخص کنید که می خواهید نقطه شکست را در یک تابع با نام متد تنظیم کنید. برای تنظیم نقطه شکست در تمام روشهای C ++ به نام FOO می توانید هر یک از:
برای تنظیم یک انتخاب کننده Objective-C به نام AlignLeftedges: می توانید هر یک از:
شما می توانید با استفاده از " shlib" ("-s" به طور خلاصه ، هر نقطه شکست را به یک تصویر خاص اجرایی محدود کنید:
گزینه shlib همچنین می تواند برای مشخص کردن چندین کتابخانه مشترک تکرار شود.
پیشنهادات اولیه جالب تر از این نوع نیز بسیار استقبال می شود.
دقیقاً مانند GDB ، مترجم فرمان LLDB کوتاهترین مسابقه منحصر به فرد را بر روی نام دستورات انجام می دهد ، بنابراین دو دستور زیر هر دو همان دستور را اجرا می کنند:
LLDB همچنین از تکمیل فرمان برای نام پرونده های منبع ، نام نماد ، نام پرونده ها و غیره پشتیبانی می کند. تکمیل با ضربه زدن به یک برگه آغاز می شود. گزینه های فردی در یک دستور می تواند تکمیل کننده های مختلفی داشته باشد ، بنابراین به عنوان مثال ، گزینه "-file" در "نقطه شکست" به پرونده های منبع ، گزینه " Shlib" در کتابخانه های مشترک بارگیری شده و غیره تکمیل می شود. شما "-shlib" را مشخص می کنید ، و در حال تکمیل "-File" هستید ، ما فقط پرونده های منبع را در کتابخانه مشترک مشخص شده توسط " Shlib" لیست خواهیم کرد.
دستورات جداگانه کاملاً مستند هستند. می توانید از دستور راهنما استفاده کنید تا یک مرور کلی در مورد دستورات موجود یا به دست آوردن جزئیات در مورد دستورات خاص دریافت کنید. همچنین یک دستور apropos وجود دارد که متن راهنما را برای همه دستورات برای یک کلمه خاص جستجو می کند و یک رشته راهنمای خلاصه را برای هر دستور تطبیق می اندازد.
سرانجام ، مکانیسمی برای ساخت نام مستعار برای دستورات متداول وجود دارد. به عنوان مثال ، اگر تایپ کردن اذیت می شوید:
ما برای دستورات متداول چند نام مستعار اضافه کرده ایم (به عنوان مثال "مرحله" ، "بعدی" و "ادامه") اما ما سعی نکرده ایم که جامع باشیم زیرا در تجربه ما راحت تر است که دستورات اساسی را منحصر به فرد در یکنامه یا دو ، و سپس این سکانس ها را یاد بگیرید تا اینکه فضای نام را با تعداد زیادی نام مستعار پر کنید ، و سپس مجبور شوید همه آنها را تایپ کنید.
با این حال ، کاربران رایگان می توانند مجموعه فرمان LLDB را با این حال دوست داشته باشند ، و از آنجا که LLDB پرونده را می خواند~/. lldbinit در هنگام راه اندازی ، می توانید تمام نام های خود را در آنجا ذخیره کنید و آنها به طور کلی در دسترس شما خواهند بود. نام مستعار شما نیز در دستور راهنما ثبت شده است تا بتوانید آنچه را که تنظیم کرده اید به خود یادآوری کنید.
نکته قابل توجه که ما با تقاضای مردمی شامل می شویم ، یک شبیه ساز ضعیف دستور "شکست" GDB است. این سعی نمی کند هر کاری را که دستور GDB Break انجام می دهد انجام دهد (به عنوان مثال ، این کار Foo. c :: نوار را انجام نمی دهد. اما بیشتر کار می کند ، و انتقال را آسان تر می کند. ب. اگر واقعاً می خواهید دستور LLDB را به صورت بومی یاد بگیرید ، این بدان معنی است که در راه بقیه دستورات نقطه شکست قرار می گیرد. خوشبختانه ، اگر یکی از نام های ما را دوست ندارید ، می توانید به راحتی از شر آن خلاص شویدبا دویدن (به عنوان مثال):
من در واقع نیز انجام می دهم:
بنابراین من می توانم دستور breakpoint بومی LLDB را فقط با b اجرا کنم
Parser فرمان LLDB همچنین از دستورات "خام" پشتیبانی می کند ، جایی که پس از خاموش شدن گزینه های فرمان ، بقیه رشته فرمان بدون تفسیر به دستور منتقل می شوند. این برای دستوراتی مناسب است که استدلال آنها ممکن است بیان پیچیده ای باشد که برای محافظت از Backslash دردناک است. به عنوان مثال ، دستور "بیان" به دلایل واضح یک دستور "خام" است. خروجی "راهنما" برای یک دستور به شما می گوید اگر "خام" باشد یا نه ، بنابراین می دانید چه انتظاری دارید. تنها چیزی که باید مراقب آن باشید این است که از آنجا که دستورات RAW هنوز هم می توانند گزینه هایی داشته باشند ، اگر رشته فرمان شما دارای خطوطی در آن باشد ، باید با قرار دادن " -" پس از نام فرمان ، این نشانگرهای گزینه ای را نشان دهید ، اماقبل از رشته فرمان شما.
LLDB همچنین دارای یک مترجم داخلی پایتون است که توسط دستور "اسکریپت" قابل دسترسی است. تمام عملکردهای اشکال زدایی به عنوان کلاس در مترجم پایتون در دسترس است ، بنابراین دستورات پیچیده تری که در GDB با دستور "تعریف" معرفی می کنید با نوشتن توابع پایتون با استفاده از کتابخانه LLDB-Python ، سپس بارگیری اسکریپت ها می تواند انجام شود. در جلسه در حال اجرا و دسترسی به آنها با دستور "اسکریپت".
با ارائه مروری بر نحو فرمان LLDB ، ما مراحل یک جلسه اشکال زدایی استاندارد را ارائه می دهیم.
بارگیری یک برنامه در LLDB¶
ابتدا باید برنامه را برای اشکال زدایی تنظیم کنیم. مانند GDB ، می توانید LLDB را شروع کرده و پرونده مورد نظر برای اشکال زدایی در خط فرمان را مشخص کنید:
یا می توانید آن را پس از واقعیت با دستور "پرونده" مشخص کنید:
تنظیم نقاط شکست
ما در مورد نحوه تنظیم نقاط شکست در بالا بحث کرده ایم. برای دیدن همه گزینه های تنظیم نقطه شکست می توانید از مجموعه راهنما استفاده کنید. به عنوان مثال ، ما ممکن است انجام دهیم:
می توانید در مورد نقاط شکست که با آنها تنظیم کرده اید اطلاعات کسب کنید:
توجه داشته باشید که تنظیم یک نقطه شکست ، یک نقطه شکست منطقی ایجاد می کند ، که می تواند برای یک یا چند مکان حل شود. به عنوان مثال ، Break by Selector یک نقطه شکست را در تمام روش هایی که آن انتخاب کننده را در کلاس های برنامه شما اجرا می کنند ، تعیین می کند. به طور مشابه ، اگر این پرونده و خط در مکان های مختلف کد شما وارد شوند ، یک نقطه شکست پرونده و خط ممکن است منجر به چندین مکان شود.
نقطه شکست منطقی دارای یک شناسه عدد صحیح است و مکان های آن دارای شناسه در نقطه شکست والدین خود است (این دو به عنوان "." ، به عنوان مثال در مثال بالا به آن پیوستند).
همچنین ، نقاط ضعف منطقی به صورت زنده باقی می مانند به گونه ای که اگر کتابخانه مشترک دیگری بارگیری شود که اجرای دیگری از "AlignLeftedges:" انتخاب کننده باشد ، مکان جدید به نقطه شکست 1 اضافه می شود (به عنوان مثال یک نقطه شکست "1. 2" تنظیم می شودانتخاب کننده تازه بارگذاری شده).
بخش دیگر از اطلاعات موجود در لیست Breakpoint این است که آیا مکان نقطه شکست برطرف شده است یا خیر. هنگامی که آدرس پرونده ای که مربوط به آن است با برنامه ای که در حال اشکال زدایی هستید ، یک مکان حل می شود. به عنوان مثال اگر یک نقطه شکست را در یک کتابخانه مشترک تنظیم کنید که در آن زمان تخلیه شود ، آن مکان شکست باقی خواهد ماند ، اما دیگر برطرف نمی شود.
نکته دیگری که باید برای کاربران GDB توجه داشته باشید این است که LLDB مانند GDB با:
یعنی ، LLDB همیشه از مشخصات شما فاصله می گیرد ، حتی اگر نتواند مکان هایی را پیدا کند که مطابق با مشخصات باشد. شما می توانید بگویید که آیا این عبارت با بررسی قسمت مکان ها در "لیست Breakpoint" حل شده است یا خیر ، و ما نقطه شکست را به عنوان "در انتظار" هنگام تنظیم آن گزارش می دهیم تا بتوانید بگویید که یک تایپ را راحت تر کرده اید ، اگر چنین بود. در واقع دلیل یافتن هیچ مکان:
شما می توانید حذف ، غیرفعال کردن ، تنظیم شرایط و نادیده گرفتن شمارش یا در تمام مکان های ایجاد شده توسط نقطه شکست منطقی خود ، یا در هر یک از مکان های خاص که مشخصات شما حل شده است. به عنوان مثال ، اگر می خواستیم دستور چاپ یک پشتی را اضافه کنیم وقتی به این نقطه شکست ضربه می زدیم می توانستیم انجام دهیم:
به طور پیش فرض ، دستور add دستور BreakPoint دستورات خط فرمان LLDB را می گیرد. همچنین می توانید با تصویب گزینه " Command" این موضوع را صریحاً مشخص کنید. اگر می خواهید دستور Breakpoint خود را با استفاده از اسکریپت پایتون پیاده سازی کنید ، از " - اسکریپت" استفاده کنید.
این یک نکته مناسب برای ارائه یکی دیگر از ویژگی های راهنمای فرمان LLDB است. انجام دادن:
هنگامی که آرگومان هایی را به دستورات مشخص شده در نحو در براکت های زاویه ای مانند می بینید ، این نشان می دهد که این نوع آرگومان متداول است که می توانید از سیستم فرمان کمک بیشتری کنید. بنابراین در این حالت می توانید انجام دهید:
نام های نقطه شکست
نقاط شکست دارای دو مجموعه اطلاعات متعامد است: یکی مشخص می کند که در کجا می توان نقطه شکست را تعیین کرد ، و دیگری نحوه واکنش در هنگام ضربه زدن به نقطه شکست. مجموعه اطلاعات دوم (به عنوان مثال دستورات ، شرایط ، تعداد ضربه ، کنترل خودکار ...) ما گزینه های نقطه شکست را می نامیم.
کاملاً معمول است که بخواهیم یک مجموعه از گزینه ها را در تعدادی از نقاط شکست اعمال کنیم. به عنوان مثال ، شما ممکن است بخواهید آن خود را = nil و در صورت وجود ، بررسی کنید و در تعدادی از روش ها ، یک فضای پشتیبان چاپ کنید و ادامه دهید. یک روش مناسب برای انجام این کار ، ایجاد تمام نقاط شکست ، سپس پیکربندی گزینه ها با:
این خیلی بد نیست ، اما شما باید این کار را برای هر نقطه شکست جدیدی که ایجاد می کنید تکرار کنید ، و اگر می خواهید گزینه ها را تغییر دهید ، باید همه مواردی را که از این روش استفاده می کنید به خاطر بسپارید.
نام های Breakpoint یک راه حل مناسب برای این مشکل ارائه می دهد. راه حل ساده استفاده از نام برای جمع آوری نقاط شکست که می خواهید از این طریق در یک گروه تأثیر بگذارد ، استفاده می شود. بنابراین وقتی نقطه شکست را انجام می دهید ، انجام می دهید:
سپس هنگامی که تمام نقاط شکست خود را ایجاد کرده اید ، می توانید گزینه ها را با استفاده از نام برای جمع آوری تمام نقاط شکست مربوطه تنظیم یا اصلاح کنید.
این بهتر است ، اما از این مشکل رنج می برد که وقتی نقاط شکست جدید اضافه می شوند ، آنها این اصلاحات را انتخاب نمی کنند و گزینه ها فقط در زمینه نقاط شکست واقعی وجود دارند ، بنابراین ذخیره و استفاده مجدد آنها سخت است.
یک راه حل حتی بهتر این است که یک نام نقطه شکست کاملاً پیکربندی شده ایجاد کنید:
سپس می توانید نام را در نقاط شکست خود اعمال کنید و همه آنها این گزینه ها را انتخاب می کنند. اتصال از نام به نقاط شکست به صورت زنده باقی می ماند ، بنابراین وقتی گزینه های پیکربندی شده روی نام را تغییر می دهید ، تمام نقاط شکست آن تغییرات را انتخاب می کنند. این امر باعث می شود استفاده از نامهای پیکربندی شده برای آزمایش با گزینه های شما آسان شود.
شما می توانید در پرونده . lldbinit خود اسامی Breakpoint ایجاد کنید ، بنابراین می توانید از آنها استفاده کنید تا رفتارهایی را که مفید پیدا کرده اید و در جلسات آینده آنها را دوباره استفاده کنید.
همچنین می توانید از گزینه های تنظیم شده در نقطه شکست ، یک نام نقطه شکست ایجاد کنید:
که باعث می شود کپی کردن رفتار از یک نقطه شکست به مجموعه ای از دیگران آسان شود.
تنظیم نقاط دیدنی
علاوه بر نقاط شکست ، می توانید از Help Point برای دیدن تمام دستورات دستکاری های نقطه ساعت استفاده کنید. به عنوان مثال ، ما ممکن است موارد زیر را برای تماشای متغیری به نام "جهانی" برای عملکرد نوشتن انجام دهیم ، اما فقط در صورتی که شرط (جهانی == 5) "متوقف شود: درست است:
شروع یا پیوستن به برنامه خود
برای راه اندازی یک برنامه در LLDB ما از دستور "راه اندازی فرآیند" یا یکی از ساخته های آن در نام مستعار استفاده می کنیم:
همچنین می توانید با شناسه فرآیند یا نام فرآیند به یک فرآیند وصل شوید. LLDB هنگام اتصال به یک فرآیند با نام ، از گزینه " -Waitfor" پشتیبانی می کند که منتظر روند بعدی است که این نام را برای نمایش نشان می دهد و به آن پیوست می شود
پس از راه اندازی یا اتصال به یک فرآیند ، روند شما ممکن است در جایی متوقف شود:
توجه داشته باشید خطی که می گوید "1 از 3 موضوع با دلایل متوقف شده است:" و خطوطی که از آن پیروی می کنند. در یک محیط چند رشته ای ، بیش از یک موضوع بسیار رایج است که قبل از اینکه هسته در واقع کنترل را به اشکال زدایی برگرداند ، به نقطه شکست (های) شما ضربه بزنید. در این حالت ، تمام موضوعاتی را که به دلایل جالب ذکر شده در پیام توقف متوقف شده است ، مشاهده خواهید کرد.
کنترل برنامه خود را ¶
بعد از راه اندازی ، می توانیم ادامه دهیم تا به نقطه شکست خود ضربه بزنیم. دستورات ابتدایی برای کنترل فرآیند همه تحت دستور "موضوع" وجود دارند:
در حال حاضر شما فقط می توانید به طور همزمان بر روی یک موضوع کار کنید ، اما این طرح در نهایت از گفتن "قدم بر عملکرد در موضوع 1 قدم بردارید ، و به سمت عملکرد در موضوع 2 بروید و به موضوع 3 ادامه دهید."برخی از موضوعات در حال اجرا در حالی که برخی دیگر متوقف شده اند ، این امر از اهمیت ویژه ای برخوردار خواهد بود. با این حال ، برای راحتی ، تمام دستورات پله ای نام مستعار آسان دارند. بنابراین "موضوع ادامه دهید" فقط "C" و غیره است.
سایر دستورات پله برنامه تقریباً مشابه با GDB هستند. شما دارید:
به طور پیش فرض ، LLDB نام مستعار را به کلیه دستورات کنترل فرآیند GDB مشترک ("S" ، "مرحله" ، "N" ، "Next" ، "Finish" تعریف می کند. اگر ما از دست داده ایم ، لطفاً آنها را به خود اضافه کنید~پرونده /. lldbinit با استفاده از دستور "دستور alias".
LLDB همچنین از مرحله با نسخه های دستورالعمل پشتیبانی کرد:
سرانجام ، LLDB تا زمانی که خط یا فریم خروج از خط یا فریم را اجرا کند ، اجرا می شود:
این دستور نخ را در قاب فعلی اجرا می کند تا در این قاب به خط 100 برسد یا در صورت ترک قاب فعلی متوقف شود. این یک معادل نزدیک با دستور "تا" GDB است.
یک فرآیند ، به طور پیش فرض ، ترمینال LLDB را با فرآیند فرومایه به اشتراک می گذارد. وقتی در این حالت هستید ، دقیقاً مانند هنگام اشکال زدایی با GDB ، وقتی این روند در حال اجرا است ، هر کاری را که تایپ می کنید به مرحله stdin از روند فرومایه می رود. برای قطع برنامه تحتانی خود ، Ctrl+c را تایپ کنید.
اگر به یک فرآیند وصل شوید ، یا یک فرآیند را با گزینه "-no-stdin" راه اندازی کنید ، مترجم فرمان همیشه برای وارد کردن دستورات در دسترس است. این ممکن است کمی ناامید کننده برای کاربران GDB باشد که همیشه یک سریع (LLDB) داشته باشند. این به شما امکان می دهد بدون نیاز به قطع صریح برنامه ای که در حال اشکال زدایی هستید ، یک نقطه شکست و غیره را تنظیم کنید:
دستورات زیادی وجود دارد که هنگام دویدن کار نمی کنند ، و مترجم فرماندهی باید کار خوبی انجام دهد تا به شما اطلاع دهد که این مورد چیست. اگر مواردی را پیدا کردید که مترجم فرمان کار خود را انجام ندهد ، لطفاً اشکال دهید. این روش کار ما را برای حالت اشکال زدایی آینده به نام Thread Centric Debugging تنظیم می کند. این حالت به ما امکان می دهد همه موضوعات را اجرا کنیم و فقط موضوعاتی را که در نقاط شکست قرار دارند متوقف کنیم یا استثنا یا سیگنال داشته باشند.
دستوراتی که در حال حاضر در حال اجرا کار می کنند شامل قطع روند متوقف کردن اجرای ("وقفه فرآیند") ، دریافت وضعیت فرآیند ("وضعیت فرآیند") ، تنظیم نقطه شکست و پاکسازی ("نقطه شکست [SET | CLEAR | فعال کردن | غیرفعال کردن | لیست] است.… ") ، و خواندن حافظه و نوشتن (" حافظه [بخوانید | بنویسید] ... ").
مسئله غیرفعال کردن STDIO هنگام اجرای ، فرصتی مناسب برای نشان دادن نحوه تنظیم خصوصیات اشکال زدایی به طور کلی ایجاد می کند. اگر همیشه می خواهید در حالت no-stdin اجرا کنید ، می توانید این کار را به عنوان یک ویژگی فرآیند عمومی با استفاده از دستور "تنظیمات" LLDB ، که معادل دستور "تنظیم" GDB است ، تنظیم کنید. به عنوان مثال ، در این مورد شما می گویید:
با گذشت زمان ، "فرماندهی" GDB به بیابان گزینه های بی نظمی تبدیل شد ، به طوری که گزینه های مفیدی وجود داشت که حتی کاربران با تجربه GDB از آنها آگاهی نداشتند زیرا پیدا کردن آنها بسیار سخت بود. ما سعی کردیم تنظیمات را به صورت سلسله مراتبی با استفاده از ساختار موجودات اساسی در اشکال زدایی سازماندهی کنیم. در بیشتر قسمت ها در هر مکانی می توانید تنظیماتی را در یک موجود عمومی مشخص کنید (به عنوان مثال موضوعات) همچنین می توانید گزینه را در یک نمونه خاص اعمال کنید ، که در بعضی مواقع نیز می تواند مناسب باشد. شما می توانید تنظیمات موجود را با "لیست تنظیمات" مشاهده کنید و در دستور تنظیمات که توضیح می دهد که چگونه به طور کلی کار می کند ، کمک می شود.
بررسی حالت موضوع
برای مثال:
برای مثال:
The “frame variable” command is not a full expression parser but it does support a few simple operations like & , * ,>
فارکس کاران ایران...
ما را در سایت فارکس کاران ایران دنبال می کنید
برچسب :
نویسنده : ديناروند فهيمه
بازدید : <-PostHit->
تاريخ : جمعه
19 خرداد
1402 ساعت: 12:41