PDA

View Full Version : ExceptLog



SADAF
پنج شنبه 19 اردیبهشت 1387, 11:53 صبح
سلام به همه دوستان
ژپروژه ام شامل يك Application است كه خروجي Exe اصلي برنامه را داراست و چندين پروژه bpl كه حاوي فرمها و Unit هاي برنامه است. براي لاگ گيري از Exception هاي پروژه ام از ExceptLog در Application اصلي استفاده كرده ام. براي نمايش محل و روال ايجاد كننده Exception در پروژه اصلي Include TD32 debug info را ست كرده ام. در پروژه هاي bpl هم چنين كاري را كرده ام . ولي با اينكه Excepyion در يكي از فرمهاي درون bpl ها رخ مي دهد ولي هنگام لاگ گيري مشخصات فرم و روال مربوطه را در بخش Stack نمي آورد !
كجاي كارم اشتباه است ؟ًًًً

SADAF
شنبه 21 اردیبهشت 1387, 07:51 صبح
كسي با ExceptLog كار نكرده يا با Bpl ها ؟؟؟؟!!!!!!!

B-Vedadian
شنبه 21 اردیبهشت 1387, 09:28 صبح
نمونه log تولید شده رو بذارید.

pad_kay
شنبه 21 اردیبهشت 1387, 10:46 صبح
سلام به همه دوستان
ژپروژه ام شامل يك Application است كه خروجي Exe اصلي برنامه را داراست و چندين پروژه bpl كه حاوي فرمها و Unit هاي برنامه است. براي لاگ گيري از Exception هاي پروژه ام از ExceptLog در Application اصلي استفاده كرده ام. براي نمايش محل و روال ايجاد كننده Exception در پروژه اصلي Include TD32 debug info را ست كرده ام. در پروژه هاي bpl هم چنين كاري را كرده ام . ولي با اينكه Excepyion در يكي از فرمهاي درون bpl ها رخ مي دهد ولي هنگام لاگ گيري مشخصات فرم و روال مربوطه را در بخش Stack نمي آورد !
كجاي كارم اشتباه است ؟ًًًً


آيا bpl ها يه صورت rule- time لود مي شوند ؟
در اين صورت آيا بايد در bpl نيز از ExceptLog استفاده كنيد و لازم به ذكر است هيچگونه كنترلي بروي Memory Leak ندارد
و آيا از آخرين ورشن آن استفاده مي كنيد ؟
در صورت پاسخ منفي از آخرين ورشن آن استفاده كن خيلي از بگ ها رو گرفته

SADAF
شنبه 21 اردیبهشت 1387, 14:54 عصر
بله پكيج ها به صورت RunTime لود مي شوند. لذا دقيقاً هم لازم است كه اين Unit در تك تك آنها Use شده باشد. ولي اين مشكل وجود دارد كه :
فرض كنيد Package1 , Package2 را به طور مستقل داريم . حال Package3 را نيز داريم كه در ليست Required هاي خود Package1 , Package2 را دارد (از آنها استفاده كرده است). حال من نمي توانم يك Unit را در هر سه پكيج Use كنم. دلفي در كامپايل خطا مي دهد. !!!!!!!!!
در ضمن در پروژه اصلي فقط Packge3 vh را لود مي كنم و 1و2 را ديگر خير.

نسخه ExceptLog مربوط به سال 2003-2005 استو نسخه MemCheck هم 2.76 است. (نسخه بالاتري را نيافتم!!)

نمونه Log را هم آورده ام :


New exception:
Delphi exception, type EOleException, message: Cannot drop the table '##A78263C07', because it does not exist in the system catalog
Exception code: 250477278
Exception flags: 3
Number of parameters: 7
(no debug info) Find error: 7C81EB33
call stack - 0 : (no debug info) Find error: 407DC43A
call stack - 1 : (no debug info) Find error: 4000909F
call stack - 2 : (no debug info) Find error: 407DC399
call stack - 3 : (no debug info) Find error: 05664A3F
call stack - 4 : (no debug info) Find error: 006ED87B
call stack - 5 : (no debug info) Find error: 006D133F
call stack - 6 : (no debug info) Find error: 006D452C
call stack - 7 : (no debug info) Find error: 6772A99E
call stack - 8 : (no debug info) Find error: 006D110F
call stack - 9 : (no debug info) Find error: 006D4080
call stack - 10 : (no debug info) Find error: 006D40EB
call stack - 11 : (no debug info) Find error: 006D452C
call stack - 12 : (no debug info) Find error: 6772AF8C
call stack - 13 : (no debug info) Find error: 006D110F
call stack - 14 : (no debug info) Find error: 006CFCDC
call stack - 15 : (no debug info) Find error: 04E490CF
call stack - 16 : Module Unt003000MainForm.pas Routine @Unt003000mainform@TFrm003000MainForm@LSub1Click Line 982 Find error: 00410A08
call stack - 17 : (no debug info) Find error: 006D14DA
call stack - 18 : (no debug info) Find error: 006D110F
call stack - 19 : (no debug info) Find error: 006D43C3
call stack - 20 : (no debug info) Find error: 4003D0BA
call stack - 21 : (no debug info) Find error: 77D48705
call stack - 22 : (no debug info) Find error: 77D487E7
call stack - 23 : (no debug info) Find error: 77D489A1
call stack - 24 : (no debug info) Find error: 77D4BCC8
call stack - 25 : (no debug info) Find error: 006F4DAC
call stack - 26 : Module Unt003000EnterSys.pas Routine @Unt003000entersys@TFrm003000EnterSys@YesButtonCli ck Line 267 Find error: 00412A91

لازم به ذكر است كه MainForm , EnterSys جزء پروژه اصلي هستند ولي خطا در واقع در فرمي كه درون يكي از پكيجها (در مثال آورده شده : در Packge1 ) رخ داده است كه مشخصات آن را نمي آورد.

B-Vedadian
شنبه 21 اردیبهشت 1387, 15:48 عصر
برای اینکه بتونید پکیج مربوطه رو دیباگ کنید، پروژه مربوط به اون را باز کنید و میزبانش رو برنامه اصلی تون قرار بدید. حالا وقتی Exception رخ داد میتونید ببینید کجای کار وایستاده. حتی میتونید رو دستوری که میدونید باعث ایجاد Exception شده Break Point بگذارید.

استفاده از ExceptLog اولین قدم مناسب نیست، اول با روش بالا ببینید مشکلتون حل نمیشه. اگه نشد، وقتی به همون روش بالا و با استفاده از ExceptLog در محل Exception برنامه متوقف شد، تو منوی Search گزینه Find Address رو استفاده کنید تا محل تابعی در برنامه شما که باعث ایجاد Exception شده رو پیدا کنید(در مثال مورد شما 407DC43A). مهمترین خاصیت این ExceptLog نگه داشتن Stack فراخوانیهاست! (به نظر من!). جایی که به علت ایجاد Exception در توابع بیرون برنامه بصورت عادی نمیشه منشا خطا رو پیدا کرد، به کمک میآد.

SADAF
شنبه 21 اردیبهشت 1387, 16:23 عصر
مسئله اينجاست كه پروژه من بسيار بزرگ است (شامل چندين زير سيستم است)
هدف من در واقع استخراج Exception هاي كل پروژه توسط تيم تست بود تا اين ليست را در اختيار برنامه نويسانم قرار بدهم. بدون اينكه نيازي به Trace خط به خط برنامه باشد.

B-Vedadian
شنبه 21 اردیبهشت 1387, 17:36 عصر
در مورد استخراج Exceptionها روش معمول همون تست بتا و ... است. خروجی این تست ها Exceptionهای برنامه به همراه Crash Dump مربوط به اوناست.

وقتی این اطلاعات بدست اومد اون رو میدند به برنامه نویسا که ببینند کجای کارشون غلطه. موقعی که دارید Exceptionها رو بررسی می کنید، اصلا انتظار نداشته باشید که یک ابزار بتونه بجای برنامه نویس شما خطا رو ریشه یابی کنه.

اگه فقط رسیدن به محل خطا مد نظر هست، کافیه که همون Exception Log رو بدید به برنامه نویسا، اونا همون کاری که گفتم (یعنی باز کردن پروژه ایجاد کننده Exception و بعد تعیین میزبان) میکنند و میتونند براحتی در ابتدای برنامه با استفاده از Pause و بعدش Find Address محلی از پروژه که بعد اون ایجاد Exception شده رو پیدا کنند.

بالاخره یکی باید خطاها رو Trace کنه. یا شما یا برنامه نویساتون.