ေရႊပြဲလာတုိ႕၏ အားေပးမႈ

၂၀၀၉ ခုႏွစ္ ၾသဂုတ္လ ၁ ရက္ေန႕မွစ၍ လက္မွတ္ေစာင္ေရေပါင္း ေစာင္ တိတိ ေရာင္းခ်ခဲ့ရၿပီး ျဖစ္ပါသည္။

Wednesday, July 9, 2008

UMDH ျဖင့္ မွတ္ဥာဏ္ယုိေပါက္မ်ားကုိ ရွာေဖြျခင္း

ေအာက္ပါ post ပါအေၾကာင္းအရာမ်ားကုိ Intel® Core™2 Duo E6550 @2.33 GHz, DDR 2 1GB x 4, Microsoft Windows XP Professional Service Pack 2 တပ္ဆင္ထားေသာ ၃၂ ဘစ္ စက္တြင္သာ စမ္းသပ္ထားၿပီး ျဖစ္ၿပီး ေရးသားခ်ိန္တြင္ တတ္ႏုိင္သေလာက္ တိက် မွန္ကန္ေစရန္ ႀကိဳးစားထားေသာ္လည္း post ပါ အေၾကာင္းအရာမ်ား၏ မွန္ကန္တိက် မွီခုိႏုိင္စြမ္းကုိ ေလာရွည္ - ကတဲ့ပြဲမွ အာမမခံပါ။ သံုးစြဲျခင္းေၾကာင့္ တစံုတရာ နစ္နာဆံုးရႈံးမႈ ျဖစ္ပြားလာပါက သံုးစြဲသူ၏ တာ၀န္သာ ျဖစ္ေၾကာင္း ႀကိဳတင္ အသိေပးအပ္ပါသည္။ 

Pointer Arithmetic အသံုးျပဳေသာ အစီအစဥ္ (Program) မ်ားကုိ ေရးသားရာတြင္ ျဖစ္တတ္ေသာ ျပႆနာတစ္ရပ္မွာ ရယူထားေသာ မွတ္ဥာဏ္ (memory) ေနရာ (space) မ်ားကုိ ျပန္လည္စြန္႕လႊတ္ျခင္း (deallocation) မျပဳမိသည့္အခါ အပံု (heap) ထဲတြင္ မွတ္ဥာဏ္ေနရာလြတ္ ကုန္ခမ္း သြားတတ္ျခင္းပင္ ျဖစ္သည္။ အထူးသျဖင့္ အမႈိက္သိမ္းစနစ္ (Garbage Collection System) မပါရွိသည့္ C/C++ ကဲ့သုိ႕ေသာ ဘာသာစကားမ်ားတြင္ အဆုိပါ ျပႆနာသည္ ေကာက္ရုိးပံု အပ္ေပ်ာက္သလုိ ရွာရခက္ေသာ ျပႆနာ တစ္ရပ္ျဖစ္ပါသည္။ Windows NT Platform (Windows NT, Windows 2000, Windows XP and Windows Vista) တြင္ အဆုိပါ ျပႆနာကုိ အေျဖရွာႏုိင္ရန္အတြက္ UMDH ဟုေခၚေသာ အစီအစဥ္တစ္ခုကို Microsoft မွ အခမဲ့ ျဖန္႕ျဖဴးေပးထားရာ ယခုေဆာင္းပါးငယ္တြင္ အဆုိပါ အစီအစဥ္ကုိ အသံုးျပဳပံု အဆင့္ဆင့္ကုိ ေရးသားရွင္းလင္းမည္ ျဖစ္ပါသည္။ 

UMDH သည္ Debugging Tools for Windows package တြင္ပါ၀င္ေသာ အစီအစဥ္တစ္ခု ျဖစ္သည္။ ၄င္းကုိ အသံုးျပဳရန္အတြက္ အဆုိပါ package ကုိ အရင္ဆံုး download လုပ္ရမည္ျဖစ္သည္။ မိမိ အသံုးျပဳမည့္ စနစ္ႏွင့္ ကိုက္ညီရာကုိ ေရြးခ်ယ္ရန္ သတိျပဳပါ။ ထုိ႕ေနာက္တြင္ Windows Symbol Package ကုိ download လုပ္ရယူရမည္ျဖစ္သည္။ Symbol Package ကုိ ေရြးခ်ယ္ရာတြင္ မိမိ debug လုပ္မည့္ အစီအစဥ္ကုိ အသံုးျပဳမည့္ စက္ေမာင္းႏွင္စနစ္ (Operating Systems) ႏွင့္ကုိက္ညီရာကုိ ေရြးခ်ယ္ရမည္ျဖစ္သည္။ (စက္တလံုးတည္းတြင္ debug လုပ္မည္ဆုိပါက အဆိုပါစက္၏ ေမာင္းႏွင္စနစ္ကုိသာ ေရြးပါ။) 

အထက္ပါ အေပ်ာ့ထည္မ်ားကုိ ထည့္သြင္းၿပီးပါက သင္၏ စက္ေမာင္းႏွင္စနစ္ကုိ debug mode ျဖင့္ စႏႈိး (boot) ပါ။ Windows XP Professional တြင္ My Computer ကုိ ညာကလစ္ျဖင့္ ႏွိပ္ပါ။ Properties ကုိေရြးပါ။ Advanced tab ကုိ သြားပါ။ Startup and Recovery Setting ကုိ ႏွိပ္ပါ။ Edit ကုိ ႏွိပ္ပါ။ သင္၏ စက္ေမာင္းႏွင္စနစ္ စာေၾကာင္း ေဘးတြင္ "/debug" ဟုျဖည့္သြင္းပါ။ (ဥပမာ …\WINDOWS="Microsoft Windows XP Professional" /fastdetect /debug အခ်ိဳ႕ကမူ ထုိစာေၾကာင္းကို ၂ ေၾကာင္းကူးၿပီး တစ္ခုတြင္ "/debug" ဟု ထည့္သြင္းတတ္သည္။)

ထုိ႕ေနာက္ System Path Variable ကုိ UMDH (ႏွင့္ Debugging Tools for Windows) ထည့္သြင္းထားေသာ လမ္းညႊန္ (Directory) သုိ႕ ေျပာင္းေပးပါ။ My Computer ကုိ ညာကလစ္ႏွိပ္ၿပီး Properties ကုိေရြးပါ။ Advanced tab ကုိသြားပါ (အထက္ပါအတုိင္းတူတူပင္ျဖစ္သည္။) Environment Variables ကုိ ႏွိပ္ပါ။ System variables မွ path ကုိရွာၿပီး UMDH ရွိရာ လမ္းညႊန္ကုိ ဆီမီး ၉ လံုး (semi-colon) ခံၿပီး ေနာက္ဆံုးတြင္ ထည့္သြင္းပါ။ အားလံုးကုိ အုိေကႏွိပ္ပါ။ စက္ကုိ restart လုပ္ပါ။ 

စက္ျပန္တက္လာလွ်င္ _NT_SYMBOL_PATH ဟုေခၚေသာ Environment Variable ကုိ သင္ Symbol ထည့္သြင္းထားခဲ့ေသာ လမ္းညႊန္သုိ႕ ေျပာင္းေပးရမည္ျဖစ္သည္။ set _NT_SYMBOL_PATH=SRV*c:\Windows\Symbols ဟု အမိန္႕ေပးပါ။ (Symbol မ်ားကုိ အျခား လမ္းညႊန္သို႕ ထည့္သြင္းမိလွ်င္ c:\Windows\Symbols အစား အဆုိပါလမ္းညႊန္၏ လမ္းေၾကာင္းကုိ ျဖည့္သြင္းပါ။) သင့္ အစီအစဥ္အတြက္ gflags ကုိ ခ်ိန္ေပးရန္အတြက္ "gflags /i yourprogram.exe +ust" ဟု အမိန္႕ေပးပါ။ UMDH သံုးစြဲရန္ အသင့္ျဖစ္ပါၿပီ။ 

သင္၏ အစီအစဥ္ကုိ မွတ္ဥာဏ္ယိုေပါက္ (memory leakage) မျဖစ္ခင္ အေနအထားတြင္ ရပ္တန္႕ေစ၍ (breakpoint ေပးလုိက္လွ်င္ အလြယ္ဆံုးျဖစ္သည္) umdh –p:<your_program_process_id> -f:<logfile1_path_with_ext> -g ဟု အမိန္႕ေပးပါ။ (Process Id ကုိ သိရန္အတြက္ tlist ဟု အမိန္႕ေပး၍ ၾကည့္ရႈႏုိင္ပါသည္။) ထုိ႕ေနာက္တြင္ မွတ္ဥာဏ္ယုိေပါက္ အၿပီးေလာက္ဟု ထင္ေသာေနရာသုိ႕ ေရာက္သည္အထိ ဆက္လက္လုပ္ေဆာင္ေစပါ။ umdh –p:<your_program_process_id> -f:<logfile2_path_with_ext> -g ဟု ထပ္မံအမိန္႕ေပးပါ။ 

ယခု သင္၏ အစီအစဥ္ရွိ မွတ္ဥာဏ္ယုိေပါက္မတုိင္မီႏွင့္ မွတ္ဥာဏ္ယိုေပါက္အၿပီး မွတ္ဥာဏ္အသံုးခ်မႈဆုိင္ရာ အခ်က္အလက္မ်ား logfile1 ႏွင့္ logfile2 တုိ႕တြင္ သိမ္းဆည္းၿပီး တည္ရွိေနပါၿပီ။ အဆုိပါ file မ်ားကုိ ႏႈိင္းယွဥ္ၾကည့္ရႈရန္အတြက္ umdh –d –v –l <logfile1_path> <logfile2_path> ဟု ႏွိပ္ပါက အဆုိပါ အစီအစဥ္ ေနရာ ၂ ခုၾကား ရယူထားၿပီး ျပန္မစြန္႕လႊတ္ရေသးသည့္ မွတ္ဥာဏ္ေနရာမ်ားကုိ ေတြ႕ရွိရပါလိမ့္မည္။ ("> <text_file_path>" ဟု အမိန္႕ေနာက္တြင္ ျဖည့္သြင္းၿပီးမွ အမိန္႕ေပးလွ်င္ ဖန္သားျပင္ေပၚတြင္ ေပၚလာမည့္ အေျဖမ်ားကုိ အဆုိပါ text_file_path တြင္ ေရးသားေပးပါသည္။) 

ဥပမာ

+ 4132 ( 4132 - 0) 1 allocs    BackTraceD3

+ 1 ( 1 - 0)    BackTraceD3    allocations

    (blar blar blar)

    MSVCR80D!fprintf+0000029C (f:\rtm\vctools\crt_bld\self_x86\crt\src\fprintf.c, 70)

    YourProject!leakyFunction+000005EB (d:\leaky.cpp, 325)

    (blar blar blar)

    kernel32!RegisterWaitForInputIdle+00000049

ဟုေတြ႕ရွိရပါက မွတ္ဥာဏ္ မွတ္တမ္း ၂ ခုအၾကားတြင္ leakyFunction (leaky.cpp မွ လိုင္းအမွတ္ ၃၂၅) မွ မွတ္ဥာဏ္ ၄၁၃၂ ဘုိက္ရယူထားၿပီး ျပန္မစြန္႕လႊတ္ရေသးသည္ကုိ ေတြ႕ရွိရပါလိမ့္မည္။ 

စာရႈသူ မိတ္ေဆြမ်ား မွတ္ဥာဏ္ယိုေပါက္မ်ားျဖင့္ ေခါင္းကိုက္ရျခင္း ဒုကၡမွ ကင္းေ၀းပါေစ။ 

3 comments:

ဘလူးဖီးနစ္ - bluephoenix said...

java မွာ အဓိက အဲဒီ ျပႆနာကို ေျဖရွင္းေပးထားတယ္ ဖတ္မိဘူးတယ္ဗ်။ ဟုတ္ပါသလားဗ်ိဳ႕

ဘလူးဖီးနစ္ said...

ဒါဆို C# မွာ ေရာခင္ဗ်။ ကၽြန္ေတာ္က စသံုးမလို႔ စဥ္းစားေနပါတယ္။ C++ ကိုသံုးတုန္းက pointer နဲ႔ array ေတြ dynamic memory handling ေတြမွာ အဆင္သိပ္မေျပတာကို သတိထားမိခဲ႔ပါတယ္။ ဒါေၾကာင္႔ အခု ပေရာဂ်က္ေတြကို မက္လက္ဘ္ ကေန ေျပာင္းေရးရင္ C# နဲ႔ လုပ္မလားစဥ္းစားေနမိတာပါ။ အၾကံေပးေစခ်င္ပါတယ္ဗ်ာ။

Law Shay said...

If you gonna use features that are only available in C/C++, then you shouldn't move to other. However, if you don't, you can use any language. But for performance/power issues (and some embedded systems), C/C++ is still the best. Since you can bear the performance of mathlab, java is still a good choise (that's a wild guess)