کار با دیباگرها - قسمت دوم(1056 مجموع کلمات موجود در متن) (5203 بار مطالعه شده است)
کار
با دیباگرها -
قسمت
دوم
اگر
بخواهیم مراحل کار با 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
|