ورود/ایجاد حساب کاربری
   منوی اصلی
· خانه
· لیست کاربران
· جستجو
· آمار مشاهدات
· آرشیو مقالات


- شرح
· راهنمای نویسندگان
· درباره ما

   همکاری با نشریه
در صورتی که مایل به همکاری با نشریه هستید، می‌توانید در لیست پستی نشریه عضو شده و در جریان امور قرار گیرید. برای اطلاعات بیشتر، اینجا کلیک کنید.

   کاربران
سردبیر
هیچ مدیر کمکی حاضر
همکاران
هیچ مدیر کمکی حاضر
اعضا:
جدیدترین:جدید امروز:0
جدیدترین:جدید دیروز:0
جدیدترین:مجموع:2471
جدیدترین:جدیدترین:
ufumenarayu
اعضا:حاضر
اعضا:اعضا:0
مهمان‌ها:مهمان‌ها:1
مجموع:مجموع:1
کاربران حاضر
هیچ کاربر حاضری وجود ندارد

   ورود کاربران




 


 برای ورود مشکل دارید؟
 ثبت نام کاربران جدید

کار با دیباگرها - قسمت دوم

(1056 مجموع کلمات موجود در متن)
(5204 بار مطالعه شده است)  نسخه چاپی

کار با دیباگرها - قسمت دوم



اگر بخواهیم مراحل کار با GDB را تقسیم بندی کنیم، می‌توانیم ۲ مقطع داشته باشم:

۱.پیدا کردن مشکل برنامه (که در شماره قبل به این موضوع پرداخته شد.)

۲.تلاش برای رفع مشکل برنامه و redistribute آن.

در شماره پیش به صورت نسبی به قسمت اول پرداخته شد. ولی در مورد قسمت دوم باید به جرات گفت که فقط باید حل مسئله کرد و این موضوع به جز چند تا دستور که بتوان در برنامه دست برد به چیز دیگری جز تفکر و Hack کردن نیاز ندارد. بدین منظور مقاله ”How to become a hacker ” از Eric Raymond را توصیه می‌کنم.



کار با source code ها

زمانی که یک GDB را با یک برنامه اجرا می‌کنیم، دو چیزمد نظر است: ۱.خود باینری برنامه ۲. Source Code برنامه.

اگر برنامه‌ای را که به GDB ارجاع شده با دستور edit بر روی source code آن تصرف داشته باشیم. تکه کد زیر را در نظر بگیرید:

#include <stdio.h>

#include <stdlib.h>

void filling_array(int array[]);

int main(void)

int array[200];

filling_array(array);

exit(EXIT_SUCCESS);

void filling_array(int array[])

int j;

for (j=0;j<100000;j++)

array[j]=j;

با اجرا کردن برنامه مذکور error زیر دریافت می‌شود :

Segmentation fault



دلیل این امر ساده است‌، زیرا بیشتر از خانه‌های آرایه به آن مقدار می‌دهیم.

دستور edit به یک ادیتور نیاز دارد تا بتوان source code برنامه در حال اجرا را تغییر داد. بدین منظور باید متغیر محیطی EDITOR را به یکی از ادیتور‌های دلخواهتان ست کنید. اگر از شل bash یا bourne استفاده می‌کنید از دستور زیر استفاده کنید:

export EDITOR=/usr/bin/vim

و اگر از شل C استفاده می‌کنید باید از دستور زیر استفاده کنید :

setenv EDITOR /usr/bin/vim

ادیتور پیش‌فرض ex می‌باشد که امروزه کمتر کسی با آن کار می‌کند.

البته در اینجا شما هر ادیتوری را که دوست دارید می‌توانید معرفی کنید.

نکته: ممکن است در بعضی از پروژه‌ها دایرکتوری source code با باینری همان فایل فرق کند که در اکثر پروژه‌ها همین‌گونه است، باید به GDB دایرکتوری source code را با پارامتر d- معرفی کنید

فایل source را در دایرکتوری x قرار دادم و و در دایرکتوری جاری آن را کامپایل کردم. پس باید در کار با GDB مانند زیر رفتار کنم:

$ gdb -d x/ test

GNU gdb 6.4.90-debian

Copyright (C) 2006 Free Software Foundation, Inc.

GDB is free software, covered by the GNU General Public License, and you are

welcome to change it and/or distribute copies of it under certain conditions.

Type "show copying" to see the conditions.

There is absolutely no warranty for GDB. Type "show warranty" for details.

This GDB was configured as "i486-linux-gnu"...Using host libthread_db library "/lib/tls/i686/cmov/libthread_db.so.1".



(gdb) run

Starting program: /home/mohsen/gdb/gdb/test

Failed to read a valid object file image from memory.



Program received signal SIGSEGV, Segmentation fault.

0x0804839f in filling_array (array=0xbfa77f94) at x/test.c:14

14 array[j]=j;

همانگونه که ملاحظه کردید یک دایرکتوری برای جستجوی source code به آن معرفی کردیم و سپس با دستور run برنامه را اجرا کردیم.

حال اگر دستور edit را وارد کنیم source code آن را ویرایش می‌کند. بدین صورت که source code مربوط به برنامه اجرا شده توسط دستور run در دایرکتوری‌های مربوط به آن جستجو می‌گردد و سپس در هر جا که هست ویرایش می‌شود.

مقدار عدد حلقه for در تابع اگر زیر ۲۰۰ شود دیگر مشکلی پیش نمی‌آید و برنامه اجرا می‌شود.

نکته: حتما برای کامپایل از make یا یک اسکریپتی که خود نوشته‌اید استفاده کنید که ترجیحا اگر از make استفاده شود بهتر است. برای اینکه از GDB خارج نشوید،‌ دستوری به نام shell در GDB وجود دارد که آرگومانی دریافت می‌کند و آن را به صورت یک فرمان در محیط شل اجرا می‌کند.

نکته: حتما source code را با برنامه در حال اجرا هماهنگ نگه دارید. برای دیدن source code برنامه در حال اجرا از دستور list باید استفاده کنید که در شماره قبلی توضیح داده شده است

به دستور edit چندین پارمتر می‌توان داد :

  • edit

  • edit <number>

  • edit <Function>

  • edit <filename:number>

  • edit <filename:Function>

  • edit <*address>

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

در گزینه دوم فایل را ویرایش می‌کند با این تفاوت که مکان‌نما را به سر شماره خطی که شما داده‌اید می‌برد.

در گزینه سوم فایل را ویرایش می‌کند با این تفاوت که مکان نما را به سر تابعی که نام‌ برده شده می‌برد.

همانند گزینه‌های قبلی برای ویرایش است با این تفاوت که فایل و شماره خط برای آن مشخص شده‌اند. ممکن است این سوال پیش آید که چگونه یک فایل دیگر در حال اجراست و ما source code ی دیگر را برای ویرایش مشخص کرده‌ایم.حق با شماست. اما ما source code ی دیگر را مشخص نکرده‌ایم، زیرا برنامه در حال اجرا چندین source code را کامپایل کرده و در نهایت به هم لینک کرده است.(Object فایل آنها) و ما یکی از آن source code ها را مشخص کرده‌ایم.

گزینه آخر گزینه جالبیست. شما را به سر آدرسی می‌برد که مشخص کرده‌اید.

نکته: این آدرس می‌تواند هر گونه آدرسی باشد

جستجو در source code :

برای جستجو در source code دو دستور وجود دارد که هر دو یک پارامتر که یک regular expression است می‌گیرند تا به دنبال آن بگردند:

forward-search regexp

reverse-search regexp

دستور اول از اول source code جستجو کرده و به جلو می‌رود و دستور دوم بالعکس، از آخر source code جستجو را شروع کرده و به عقب می‌آید.



مشخص کردن دایرکتوری‌های شامل source code

همیشه دایرکتوری‌های source code و باینری آنها با یکدیگر فرق می‌کند. GDB یک لیست از دایرکتوری‌ها را شامل می‌شود که زمانی که کاربر به آن اسم یک تابع یا فایل را می‌دهد،‌ برای جستجوی source code آن، GDB در دایرکتوری‌های مذکور به دنبال اسم فایل source code مذکور می‌گردد.

نکته: subdirectory های دایرکتوری‌های معرفی شده جستجو نمی‌شوند،‌ خود کاربر باید آنها را دستی وارد لیست کند

همانگونه که گفته شد در ابتدای اجرای GDB می‌توان با d- یک دایرکتوری به لیست دایرکتوری‌های source code اضافه کرد. برای اضافه کردن یک دایرکتوری به لیست بدون خارج شدن از GDB می‌توان از دستور زیر استفاده کرد:

dir directory

با دستور زیر لیست دایرکتوری‌ها نشان داده می‌شود:

show directories

دستور زیر لیست را یکبار reset می‌کند، البته به یک تاییدیه نیاز دارد:

directory

در آخر نیز متذکر می‌شوم که برای Debug کردن ۳ چیز لازم است:

۱.Hack

۲.Hack

۳.Hack


نویسنده: محسن پهلوان‌زاده

PDF Version


تمامی مطالب و مقالات این سایت تحت مجوز GNU FDL قرار دارند. بنابراین کپی و ایجاد تغییر در آنها مطابق شرایط این مجوز آزاد می‌باشد.