انجمن‌های فارسی اوبونتو

لطفاً به انجمن‌ها وارد شده و یا جهت ورود ثبت‌نام نمائید

لطفاً جهت ورود نام کاربری و رمز عبورتان را وارد نمائید


توزیع گنو/لینوکس اوبونتو ۲۰ ساله شد 🎉

نویسنده موضوع: نحوه دیباگ یک برنامه .cpp در لینوکس؟  (دفعات بازدید: 4222 بار)

0 کاربر و 1 مهمان درحال مشاهده موضوع.

آفلاین jeremy28

  • Newbie
  • *
  • ارسال: 18
نحوه دیباگ یک برنامه .cpp در لینوکس؟
« : 29 خرداد 1389، 01:59 ب‌ظ »
سلام

چه طوری میشه یک برنامه رو با GCC دیباگ کرد؟
یعنی مثل محیط ویژوال استودیو، Breakpoint گذاشت و برنامه رو خط به خط دنبال کرد و نتیجه ی هر خط رو دید؟

با تشکر



آفلاین fzerorubigd

  • Hero Member
  • *
  • ارسال: 758
  • جنسیت : پسر
  • گوگل دوست خوبیه، فقط باید ازش بپرسی
    • یادداشتهای بیت نیمسوز
پاسخ به: نحوه دیباگ یک برنامه .cpp در لینوکس؟
« پاسخ #1 : 29 خرداد 1389، 04:37 ب‌ظ »
نه به اون سادگی :)
فایل cpp رو با g++ کامپایل کن و حتما سوئیچ -g رو وقت لینک اضافه کن .یعنی مثل این کامپایلش کن :
g++ -g test.cpp -o test

بعد برنامه رو با gdb اجرا کن ( قبلش مطمئن شو که gdb و هم g++ نصبه هر دو تا رو از توی سیناپتیک نصب کن اگه نصب نیست.)‌
مثلا اینطوری :

gdb ./test
حالا برنامه اجرا نشده!! فقط بارگزاری شده. میخوای Break point بگذاری مثلا خط ۲۰ بنویس : (حالا یه ترمینال داری که توش نوشته (gdb)
b 20
هر چند تا بخوای میتونی ایجاد کنی. بنویس r و برنامه رو اجرا کن. به خط ۲۰ برسه وایمیسه. برای خط به خط اجرا کردن s رو بزن و بعد Enter برای چاپ یه متغیر بزن p بعد اسم متغیر بعد Enter برای اینکه بری خط بعد ولی داخل توابع نشی n و کلی دستور دیگه که توی راهنمای gdb هست که اونم میتونی از سیناپتیک نصب کنی gdb-doc

آفلاین fzerorubigd

  • Hero Member
  • *
  • ارسال: 758
  • جنسیت : پسر
  • گوگل دوست خوبیه، فقط باید ازش بپرسی
    • یادداشتهای بیت نیمسوز
پاسخ به: نحوه دیباگ یک برنامه .cpp در لینوکس؟
« پاسخ #2 : 29 خرداد 1389، 04:41 ب‌ظ »
البته یه سری برنامه ها هستن که اینکار رو انجام میدن مثلا Code::Block ، اونها هم از همین روش استفاده میکنن ولی خیلی راحت تر و دقیقا طبق عادت برنامه نویسهای ویندوز :)

آفلاین jeremy28

  • Newbie
  • *
  • ارسال: 18
پاسخ به: نحوه دیباگ یک برنامه .cpp در لینوکس؟
« پاسخ #3 : 30 خرداد 1389، 04:01 ب‌ظ »
سلام

ببخشید من یه پروژه دارم که برای اجراش یه Makefile نوشته شده به صورت زیر:
OS = LINUX

PROG = rawusb_test

ifeq ($(OS), LINUX)
TARGET = $(PROG)
CC = g++
STRIP = strip
CFLAGS = -Wall -O2 -DOS_$(OS) -DDEBUG
LIBS = -static libusb.a

endif

OBJS = $(PROG).o hid.o PKI_Buf.o

all: $(TARGET)

$(PROG): $(OBJS)
$(CC) -o $(PROG) $(OBJS) $(LIBS)
$(STRIP) $(PROG)

hid.o: hid_$(OS).cpp hid.h
$(CC) $(CFLAGS) -c -o $@ $<

PKI_Buf.o: PKI_Buf.cpp
$(CC) $(CFLAGS) -c -o $@ $<

clean:
rm -f hid.o $(PROG) $(PROG).o $(PROG).exe $(PROG).dmg
rm -rf tmp

اینه که نمی دونم چه جوری اون فلگ -g رو توش ست کنم؟!

یه بار توی خط "$(CC) -o $(PROG) $(OBJS) $(LIBS)" فلگ -g رو اضافه کردم، ولی جواب نداد!

به هر حال با  gdb ./rawusb_test برنامه رو لود کردم و "b 20" رو زدم که این پیغام رو نشون داد:

(gdb) b 20
No symbol table is loaded.  Use the "file" command.

یعنی بعد از اجرا (زدن r ) نمی ره خط بیستم تا بتونم برنامه رو خط به خط دنبال کنم!

لطفا راهنمایی کنید

با تشکر

آفلاین fzerorubigd

  • Hero Member
  • *
  • ارسال: 758
  • جنسیت : پسر
  • گوگل دوست خوبیه، فقط باید ازش بپرسی
    • یادداشتهای بیت نیمسوز
پاسخ به: نحوه دیباگ یک برنامه .cpp در لینوکس؟
« پاسخ #4 : 30 خرداد 1389، 05:04 ب‌ظ »
شما کلا فایل رو بارگذاری نکردی .
وقت اجرای gdb اینطوری بنویس
gdb /path/to/your/file
یا اینکه وقتی gdb رو باز کردی دستوری مثل این بده :
file /path/to/your/file

فقط به جای /path/to/your/file واقعا آدرس فایل خودت رو بنویسس (فایل اجرایی که بعد از کامپایل و لینک کردن به وجود اومده، تو مثال نوشته قبلی من ./test اسم فایلم بود.

آفلاین r_m1232002

  • Full Member
  • *
  • ارسال: 143
پاسخ به: نحوه دیباگ یک برنامه .cpp در لینوکس؟
« پاسخ #5 : 30 خرداد 1389، 09:21 ب‌ظ »
فکر می کنم شما در خط CFLAGS = -Wall -O2 -DOS_$(OS) -DDEBUG سوئیچ g- را می بایست اضافه کنید. یعنی آن را تبدیل کنید به:
CFLAGS = -Wall -O2 -DOS_$(OS) -DDEBUG -g
این را امتحان کنید و نتیجه را گزارش کنید.
موفق باشید

آفلاین fzerorubigd

  • Hero Member
  • *
  • ارسال: 758
  • جنسیت : پسر
  • گوگل دوست خوبیه، فقط باید ازش بپرسی
    • یادداشتهای بیت نیمسوز
پاسخ به: نحوه دیباگ یک برنامه .cpp در لینوکس؟
« پاسخ #6 : 31 خرداد 1389، 01:36 ق‌ظ »
فکر می کنم شما در خط CFLAGS = -Wall -O2 -DOS_$(OS) -DDEBUG سوئیچ g- را می بایست اضافه کنید. یعنی آن را تبدیل کنید به:
CFLAGS = -Wall -O2 -DOS_$(OS) -DDEBUG -g
این را امتحان کنید و نتیجه را گزارش کنید.
موفق باشید

این مشکل با سوئیچ نیست، اصلا توی دیباگر فایلی باز نشده. به جای آدرس نسبی، آدرس کامل رو بده. علاوه بر اون -g پارامتریه برای Linker نه کامپایلر و اینجا اضافه میشه :
$(CC) -o $(PROG) $(OBJS) $(LIBS) -g

البته میتونی توی CFLAGS هم اضافش کنی. 

آفلاین jeremy28

  • Newbie
  • *
  • ارسال: 18
پاسخ به: نحوه دیباگ یک برنامه .cpp در لینوکس؟
« پاسخ #7 : 31 خرداد 1389، 09:33 ق‌ظ »
سلام

ببخشید من قبل از اینکه دستور gdb ./rawusb_test رو اجرا کنم، cd می کنم به دایرکتوری حاوی این فایل و بعد اون رو اجرا می کنم!
ولی یک بار هم با دادن مسیر  به صورت "gdb /home/rawusb/rawusb_test"امتحان کردم و این بار هم پیغام:
/home/rawusb/rawusb_test: No such file or directory.رو داد!

از طرفی من قبلا سوئیچ -g رو یک بار در خط OBJS = $(PROG).o hid.o PKI_Buf.o اضافه کردم و به مشکل برخوردم.


به نظرتون چه کار باید بکنم؟

با تشکر
 


آفلاین fzerorubigd

  • Hero Member
  • *
  • ارسال: 758
  • جنسیت : پسر
  • گوگل دوست خوبیه، فقط باید ازش بپرسی
    • یادداشتهای بیت نیمسوز
پاسخ به: نحوه دیباگ یک برنامه .cpp در لینوکس؟
« پاسخ #8 : 31 خرداد 1389، 10:31 ق‌ظ »
وقتی که gdb رو اجرا میکنی خط آخری که نمایش میده، قبل از اینکه برسه به جایی که میشه دستور رو وارد کرد باید این باشه :
Reading symbols from /src/mine/mysql_test/getopt...done.
فقط اسم فایل شما باید به جاش باشه . اگه محتوای ترمینال رو از زمان اجرای کد تا زمانی که میرسه به (gdb) کپی کنی اینجا شاید بشه فهمید.
نذاشتن سوئیچ -g باعث نمیشه که gdb نتونه اون برنامه رو دیباگ کنه،‌فقط باعث میشه که وقت دیباگ سورس رو نبینی.

این رو هم پیدا کردم، تست کن ببین اصولا بدون مشکل اجرا میشه : http://cs.baylor.edu/~donahoo/tools/gdb/tutorial.html