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

کمک و پشتیبانی => برنامه‌سازی => نویسنده: jeremy28 در 29 خرداد 1389، 01:59 ب‌ظ

عنوان: نحوه دیباگ یک برنامه .cpp در لینوکس؟
ارسال شده توسط: jeremy28 در 29 خرداد 1389، 01:59 ب‌ظ
سلام

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

با تشکر


عنوان: پاسخ به: نحوه دیباگ یک برنامه .cpp در لینوکس؟
ارسال شده توسط: fzerorubigd در 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
عنوان: پاسخ به: نحوه دیباگ یک برنامه .cpp در لینوکس؟
ارسال شده توسط: fzerorubigd در 29 خرداد 1389، 04:41 ب‌ظ
البته یه سری برنامه ها هستن که اینکار رو انجام میدن مثلا Code::Block ، اونها هم از همین روش استفاده میکنن ولی خیلی راحت تر و دقیقا طبق عادت برنامه نویسهای ویندوز :)
عنوان: پاسخ به: نحوه دیباگ یک برنامه .cpp در لینوکس؟
ارسال شده توسط: jeremy28 در 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 ) نمی ره خط بیستم تا بتونم برنامه رو خط به خط دنبال کنم!

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

با تشکر
عنوان: پاسخ به: نحوه دیباگ یک برنامه .cpp در لینوکس؟
ارسال شده توسط: fzerorubigd در 30 خرداد 1389، 05:04 ب‌ظ
شما کلا فایل رو بارگذاری نکردی .
وقت اجرای gdb اینطوری بنویس
gdb /path/to/your/file
یا اینکه وقتی gdb رو باز کردی دستوری مثل این بده :
file /path/to/your/file

فقط به جای /path/to/your/file واقعا آدرس فایل خودت رو بنویسس (فایل اجرایی که بعد از کامپایل و لینک کردن به وجود اومده، تو مثال نوشته قبلی من ./test اسم فایلم بود.
عنوان: پاسخ به: نحوه دیباگ یک برنامه .cpp در لینوکس؟
ارسال شده توسط: r_m1232002 در 30 خرداد 1389، 09:21 ب‌ظ
فکر می کنم شما در خط CFLAGS = -Wall -O2 -DOS_$(OS) -DDEBUG سوئیچ g- را می بایست اضافه کنید. یعنی آن را تبدیل کنید به:
CFLAGS = -Wall -O2 -DOS_$(OS) -DDEBUG -g
این را امتحان کنید و نتیجه را گزارش کنید.
موفق باشید
عنوان: پاسخ به: نحوه دیباگ یک برنامه .cpp در لینوکس؟
ارسال شده توسط: fzerorubigd در 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 هم اضافش کنی. 
عنوان: پاسخ به: نحوه دیباگ یک برنامه .cpp در لینوکس؟
ارسال شده توسط: jeremy28 در 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 اضافه کردم و به مشکل برخوردم.


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

با تشکر
 

عنوان: پاسخ به: نحوه دیباگ یک برنامه .cpp در لینوکس؟
ارسال شده توسط: fzerorubigd در 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