ورود

View Full Version : سوال: چطور میشه فهمید کدوم خط برنامه دچار کرش شده؟



root88
شنبه 18 دی 1389, 10:24 صبح
با سلام ،آیا به جز break point راه دیگه ای هست که بشه فهمید برنامه تو کدوم خط دچار کرش شد؟ برنامه من تکرارش بالاست برای همین نمی تونم از break point استفاده کنم.

mehdi.mousavi
شنبه 18 دی 1389, 11:50 صبح
با سلام ،آیا به جز break point راه دیگه ای هست که بشه فهمید برنامه تو کدوم خط دچار کرش شد؟ برنامه من تکرارش بالاست برای همین نمی تونم از break point استفاده کنم.

سلام.
شما نمی تونید (بخصوص در برنامه های C/C++) لزوما بگید که چون فلان خط از برنامه باعث متوقف شدن اجرای برنامه شده، پس ایراد از همون خط از برنامه هستش. ممکنه در طول مسیر اجرای کد، نقاط مختلفی از برنامه حافظه رو بهم بریزن و تشدید این فرایند باعث بشه تا برنامه در یک Assignment ساده نیز Crash کنه و اجراش متوقف بشه. یکی از روشهایی که این مساله رو به حداقل خودش میرسونه، انتخاب یک روش صحیح برای نوشتن کدها و پایبند بودن به اون روش در طول (حداقل) یک پروژه هستش. وقتی برنامه Modular نوشته بشه، براحتی میشه یک Module رو با یک Module بمنظور ردیابی ایرادهای برنامه عوض کرد. برای شروع، شما می تونید Task Manager رو باز کنید، کلیه ستونهای مخفی اونو به حالت Visible در بیارید و با دقت Process در حال اجرای خودتون رو مد نظر قرار بدید. اینطوری، بطور نمونه، وقتی GDI Handle های برنامه شما تعدادش فزونی پیدا میکنه، مشخص میشه که اشکال در عدم آزادسازی حافظه مربوط به GDI Object هاست. به همین ترتیب، هر کدوم از اون ستونها اطلاعاتی بهتون میدن که کار ردیابی خطا رو براتون آسونتر میکنن. استفاده از Debugger هایی مثل Softice نیز کمک شایانی به این کار میکنن، اما خوب، برای خوب کارکردن با چنین ابزارهایی باید زمان زیادی صرف کنید...

موفق باشید.

Mehdi Asgari
شنبه 18 دی 1389, 13:27 عصر
استفاده از Debugger هایی مثل Softice نیز کمک شایانی به این کار میکنن، اما خوب، برای خوب کارکردن با چنین ابزارهایی باید زمان زیادی صرف کنید...
معمولا دیباگ کردن بهترین روش حل چنین مشکلاتی هست. اگر بعد از واقعه رسیدید، آنالیز فایل کرش دامپ می تونه موثر باشه (البته جناب موسوی به دلیل این که تجربۀ بیشتری نسبت به ما ها دارن، دیباگر SoftIce رو اسم بردن؛ این دیباگر چند سالی هست که دیگه تولید نمیشه؛ به جاش از WinDbg مایکروسافت می تونی استفاده کنی. کتاب Advanced Windows Debugging بهترین مرجع در این زمینه است)
در ضمن، لزوما که نباید از bp استفاده کنی، همین که برنامه رو تحت دیباگر اجرا کنی، به محض کرش، توقف کرده و از روی Stack Trace می تونی محل تقریبی خطا و علتش رو متوجه بشی

root88
شنبه 18 دی 1389, 19:09 عصر
ممنون از دوستان، ببخشید نمی دونم چرا دکمه تشکر نداشتم!

فهمیدم که مشکل از یه تابع است که عناصر یه لیست رو به به تعداد مقدار مقایسه می کنه، اما با اینکه لیست عنصر داره و تکرارگر به ابتدای اون اشاره میکنه اما نمی دونم چرا نمیتونه تکرارگر رو مقدار بده؟

root88
شنبه 18 دی 1389, 19:43 عصر
call stack اینو نشون داد به نظر شما یعنی چی؟؟

> T.exe!std::_Iterator_base::_Orphan_me() Line 191 + 0xd bytes C++

Hadirj
یک شنبه 19 دی 1389, 18:46 عصر
امکانش هست که کد function ی که نوشتید رو بعلاوه include ها بزارید؟

root88
دوشنبه 20 دی 1389, 15:41 عصر
واقعا نمیدونم چرا اینجوری شده. من یه حلقه for نوشتم بودم در حالی که برای قسمت های قبل کار میکرد اما در قسمت انتهای برنامه از خوندن لیست عاجز بود، با یه حلقه while عوضش کردم برنامه درست شد!!!