خبر و ترفند روز

خبر و ترفند های روز را اینجا بخوانید!

شروع به کار با دیباگر گنو در لینوکس: دوره خرابی

با یادگیری نحوه استفاده از اشکال‌زدای گنو برای آشکار کردن اشکالات ناخواسته در کد، کیفیت کد را بهبود بخشید و از نتایج غیرمنتظره جلوگیری کنید.

اشکال زدایی یک مهارت ضروری برای برنامه نویسان و محققان امنیتی است. داشتن درک قوی از اشکال زدایی به شما این امکان را می دهد که یک فایل اجرایی را در سطح پایین تر درک کنید و هر گونه خطای پنهان را دریافت کنید.

دیباگر گنو یا GDB یک ابزار اشکال زدایی همیشگی است که سال هاست برنامه نویسان به آن اعتماد می کنند. در اینجا نحوه استفاده از GDB در لینوکس آورده شده است.

آماده سازی برنامه های نمونه

برای کشف ویژگی‌های GDB، به یک فایل اجرایی برای آزمایش نیاز دارید. برای نمایش، شما GDB را روی یک برنامه چک کردن کلید یک بار با کد منبع و نمادهای اشکال زدایی در دسترس، یک بار بدون کد منبع، و روی یک برنامه چند رشته ای ساده که پیام ها را روی صفحه چاپ می کند، هر دو به زبان C نوشته شده و با GCC کامپایل شده، اجرا می کنید. کامپایلر گنو سی).

می توانید از هر کامپایلر C دیگری استفاده کنید اما مطمئن شوید که باینری را حذف نکنید.

کامپایل و اجرای نمونه برنامه ها

شما به احتمال زیاد GDB را روی برنامه های خود اجرا خواهید کرد. بنابراین مطمئن شوید که آنها را با پرچم -g با gcc کامپایل کنید تا نمادهای اشکال زدایی را فعال کنید.

بدون وجود نمادهای اشکال زدایی و با یک باینری به شدت حذف شده، باید برنامه را از هم جدا کنید. این امر مستلزم درک قوی زبان اسمبلی و نحوه عملکرد تخصیص حافظه در لینوکس برای درک داده های موجود در پشته و رجیسترها است.

اجرای برنامه در GDB

اجرای برنامه در gdb

شما یک برنامه را در GDB به چند روش اجرا می کنید. هرکدام را در gdb تایپ کنید، و پس از بارگذاری، عبارت run را تایپ کنید. یا gdb را شروع کنید و سپس با استفاده از دستور file ، باینری را در gdb بارگذاری کنید و سپس با دستور run اجرا کنید.

اگر برنامه شما برای عملکرد صحیح به آرگومان های خط فرمان نیاز دارد، مطمئن شوید که آرگومان ها را بعد از نام برنامه اضافه کنید. در اینجا سینتکس برای بارگذاری برنامه در GDB و اجرای آن با آرگومان آمده است:

gdb <program>
run <args>

یا:

gdb
file <program>
run <args>

تنظیم نقاط شکست با GDB

تنظیم و حذف نقاط شکست

نقاط انفصال در اشکال زدایی به صورت دستی توقف های سختی را در کد تنظیم می کنند که وقتی برنامه به نقطه شکست می رسد جریان اجرا را متوقف می کند. تنظیم نقاط شکست به شما این امکان را می دهد که از کد عبور کرده و چگونگی تأثیر هر مرحله از اجرا بر داده ها و متغیرها را بررسی کنید.

مطلب مرتبط:   7 بهترین کلاینت SSH برای لینوکس

در GDB، زمانی که برنامه ای را با نمادهای اشکال زدایی اشکال زدایی می کنید، می توانید یک نقطه شکست را با نام تابع تعیین کنید یا یک نقطه شکست را بر اساس شماره خط تعیین کنید. در اینجا نحو است:

break main
break 47

برای مشاهده تمام نقاط شکست در جلسه اشکال زدایی فعلی، تایپ کنید:

info breakpoints

برای حذف یک نقطه شکست خاص یا چندین نقطه شکست، تایپ کنید:

delete 2
delete 3-5

GDB همچنین به شما امکان می دهد نقاط شکست شرطی را تنظیم کنید، به این معنی که برنامه تنها در صورتی متوقف می شود که یک شرط خاص در طول اجرا برآورده شود. این می تواند تغییر در مقدار یک متغیر یا فراخوانی ناموفق تابع یا هر چیزی که می خواهید باشد. در اینجا نحوی برای تنظیم نقاط شکست شرطی آمده است:

break <location> if n == 2

اگر می خواهید اجرای برنامه را پس از زدن نقطه شکست ادامه دهید، دستور continue را تایپ کنید:

continue

گام برداشتن از طریق کد

گام برداشتن از طریق کد برای درک اینکه برنامه چگونه داده ها را مدیریت می کند بسیار مهم است. با قدم گذاشتن در توابع مختلف در برنامه خود و بررسی وضعیت داده ها، می توانید درک بهتری از نحوه اجرای منطقی که در کد نوشته اید توسط برنامه انجام می دهد.

همچنین به شما کمک می‌کند ریشه خرابی‌ها و رفتار برنامه مطالعه را با دقت جراحی شناسایی کنید، زیرا می‌توانید هر خط کد را به دلخواه خود طی کنید. شما می توانید کد را به سه روش اصلی در GDB گام بردارید:

  1. step: این دستور به GDB می گوید که وارد خط بعدی فایل منبع شود. این به شما امکان می دهد اساساً طول کد منبع را خط به خط طی کنید.
  2. next: این دستور خط بعدی کد منبع را در تابع فعلی اجرا می کند و سپس متوقف می شود. next یک تابع را به عنوان یک خط واحد در نظر می گیرد، بنابراین اگر از next قبل از فراخوانی تابع استفاده کنید، برخلاف دستور step، آن را به عنوان یک خط واحد در نظر می گیرد و از آن عبور می کند.
  3. finish: دستور finish تمام خطوط باقیمانده در تابع فعلی را اجرا می کند و سپس متوقف می شود.
مطلب مرتبط:   چرا باید از رابط های اداری برای مدیریت سرورهای لینوکس استفاده کنید؟

بررسی متغیرها

با استفاده از دستور display

همانطور که از کد عبور می کنید، می خواهید مقدار متغیرها را بررسی کنید تا ببینید منطق برنامه چگونه آنها را تغییر می دهد. در اینجا نحوی برای مشاهده مقدار متغیرها در GDB آمده است:

print <variable>

در صورتی که می خواهید تغییرات مقدار متغیر را هر بار که به روز می شود چاپ کنید، باید از دستور display استفاده کنید. این به ویژه زمانی مفید است که می خواهید مقدار یک متغیر را در یک حلقه ردیابی و چاپ کنید:

display <variable>

تنظیم نقاط مراقبت

نقاط نظارت و نقاط شکست شرطی ارتباط نزدیکی با هم دارند زیرا هر دو به تغییرات یک برنامه پاسخ می دهند. نقطه نظارت برای ردیابی تغییرات داده ها در کد استفاده می شود. برای مثال، ممکن است بخواهید هر زمان که مقدار یک متغیر تغییر کرد، برنامه شکسته شود. در اینجا نحوه انجام این کار با GDB آمده است:

watch <variable_name>

اشکال زدایی موضوعی خاص با GDB

اشکال زدایی خاص رشته در gdb

GDB به شما این امکان را می دهد که هنگام کار با برنامه های چند رشته ای، اشکال زدایی خاص رشته را انجام دهید. برای نمایش، ما با یک برنامه C ساده کار خواهیم کرد که از چهار رشته برای چاپ پیام ها با هر رشته استفاده می کند.

برای مشاهده رشته های ایجاد شده در حال حاضر در برنامه خود، از دستور info استفاده کنید:

info threads

برای کار با یک رشته خاص، می توانید با استفاده از شماره فهرست آن را از لیست انتخاب کنید. مثلا:

thread 2

پس از انتخاب رشته، می توانید با استفاده از دستورات step، next و finish همانطور که در بالا نشان داده شد، از جریان اجرای آن عبور کنید.

اشکال زدایی از راه دور با GDB

اتصال به gdbserver راه دور

همچنین می توانید از راه دور برنامه هایی را که در سیستم دیگری قرار دارند اشکال زدایی کنید. برای انجام این کار، باید gdbserver را روی دستگاه مورد نظر راه اندازی کنید. شما به راحتی می توانید آن را با استفاده از مدیر بسته پیش فرض توزیع خود یا سایر مدیران بسته ای که بر روی سیستم خود نصب کرده اید نصب کنید.

مطلب مرتبط:   5 توزیع اصلی سیستم عامل لینوکس که اکنون می توانید روی Raspberry Pi نصب کنید

به عنوان مثال، برای نصب gdbserver در سیستم‌های مبتنی بر اوبونتو یا دبیان، از APT استفاده کنید:

sudo apt install gdbserver

پس از نصب، به پوشه باینری بروید و این دستور را برای راه اندازی gdbserver اجرا کنید:

gdbserver <ip>:<port> <binary>

gdbserver باید خروجی را که در پورتی که شما تعریف کرده‌اید و در حال گوش دادن است، برگرداند. اکنون در دستگاه مشتری، GDB را راه اندازی کنید و سپس با استفاده از دستور target به سرور راه دور متصل شوید:

target remote <server_ip>:<port>

نوشتن اسکریپت های GDB برای خودکارسازی اشکال زدایی

نمونه برنامه نویسی gdb

GDB به برنامه نویسان اجازه می دهد تا اسکریپت های GDB را بنویسند که دستورات GDB را به طور خودکار اجرا کنند. زمانی که سعی می کنید یک قسمت از یک کد را چندین بار اشکال زدایی کنید، این بسیار کمک می کند. به جای اینکه مجبور باشید هر بار که باینری را بارگیری می کنید، نقطه شکست، کد مرحله به مرحله و چاپ مقادیر متغیر را تنظیم کنید، می توانید از یک اسکریپت GDB برای خودکارسازی کل فرآیند استفاده کنید.

در اینجا یک مثال است:

set logging enabled on
set logging file sample.out
break main
  command 1
  backtrace
  print N
  continue
end
quit

در اسکریپت بالا، به GDB می‌گویید که ورود به سیستم را فعال کند و گزارش را در فایلی به نام sample.out ذخیره کند، سپس یک نقطه شکست را در تابع اصلی تنظیم کنید.

برای نقطه شکست شماره 1، در این مورد، نقطه شکست در تابع main، دستورات زیر را اجرا کنید: backtrace، print، continue. اساساً GDB ابتدا یک Backtrace را اجرا می کند، سپس مقدار متغیر “N” را چاپ می کند، اجرا را ادامه می دهد و در نهایت خارج می شود.

برای اجرای این اسکریپت از:

gdb -x <script> <binary>

اکنون می دانید چگونه برنامه های خود را با GDB اشکال زدایی کنید!

اشکال زدایی یک مهارت ضروری است و اشکال زدایی با GDB یک مهارت عالی است که در کارنامه شما وجود دارد. ویژگی‌های مختلف GDB مانند عبور از کد، تعیین نقاط شکست، اشکال‌زدایی انتخابی رشته و موارد دیگر، آن را به ابزاری قدرتمند در هنگام اشکال‌زدایی باینری‌ها در لینوکس تبدیل می‌کند.

اگر به دنبال اشکال زدایی برنامه های کاربردی در ویندوز هستید، ممکن است در مورد یک دیباگر بومی ویندوز، WinDBG، اطلاعات بیشتری کسب کنید.