ç§ã®èšäºã®ã»ãšãã©ã¯ããœãããŠã§ã¢ã§ã»ãã¥ãªãã£ã䜿çšããããšã«é¢å¿ã®ãã人ã察象ãšããŠãããããã»ãã¥ãªãã£ã³ãŒãã®ç¹å®ã®éšåïŒä»¥åã«å ¬éããããã®ãªã©ïŒãå«ãè³æãéä¿¡ããã ãã§èªè ãæ··ä¹±ãããããšã«ããŸããã åºæ¬ããå§ããŠããã§ã«å®æããããŒã¹ã§ãã£ãããšæ°ããçŽ æãæäŸããæ¹ãã¯ããã«ç°¡åã§ãã
ãããã£ãŠããã®èšäºã§ã¯ãããã°ã©ããŒã®åºæ¬ããŒã«ã®1ã€ã§ãããããã¬ãŒã«ã€ããŠèª¬æããŸãã
èšäºã®ç®çïŒãããã¬ãŒã®åºæ¬çãªæäœæ¹æ³ãæ€èšãããã®é«åºŠã§ããŸã䜿çšãããªãæ©èœã瀺ããäŸã䜿çšããŠãããã¬ãŒã¡ã«ããºã ã®åäœãç解ããç¹å®ã®å¯Ÿææ段ãæ€èšããŸãã
èšäºã®ããªã¥ãŒã ã¯äºæ³å€ã«å€§ããã£ãããã3ã€ã®éšåã«åããŸããã
- æåã®éšåã§ã¯ãIDE Delphiã«çµ±åããããããã¬ãŒã®æ©èœãæ€èšããæé©ãªäœ¿çšã®ããã®æšå¥šäºé ãšç°å¢ãæ§æããããã®äžè¬çãªãã³ãã瀺ããŸãã ãã®ã»ã¯ã·ã§ã³ã®è³æã¯ãåå¿è ã®éçºè ãšèšç·Žãåããå°é家ã®äž¡æ¹ã察象ãšããŠããŸãã
- èšäºã®ç¬¬2éšã§ã¯ããœãŒã¹ã³ãŒãã®äŸã䜿çšããŠãããã¬ãŒã®åäœã®è£åŽã調ã¹ãã¢ããªã±ãŒã·ã§ã³ã®ãããã°æã«ããã䜿çšããã¡ã«ããºã ã詳现ã«èª¿ã¹ãæäœäžã«ãããã¬ãŒã«ãã£ãŠè¡ãããã¢ããªã±ãŒã·ã§ã³ã¡ã¢ãªå€æŽã®ãªãã·ã§ã³ã瀺ããŸãã
- èšäºã®ç¬¬3éšã§ã¯ããããã¬ãŒã®å®çšçãªäœ¿çšã«ã€ããŠãç¹å®ã®ã¢ã³ããããã°ããªãã¯ã®ã»ããã䜿çšããã¢ããªã±ãŒã·ã§ã³ã®ä¿è·ããã€ãã¹ããäŸãšããŠèª¬æããŸãã
å®éã«å§ããŸãããã
1.1ã ãã¬ãŒã¯ãã€ã³ãã®äœ¿çšãšããŒã«ã«å€æ°ã®å€æŽ
çµã¿èŸŒã¿ãããã¬ã®æãäžè¬çã«äœ¿çšãããããŒã«ã®1ã€ã¯ãã¬ãŒã¯ãã€ã³ãïŒBreakPoint-以éBPïŒã§ãã BPã®ã€ã³ã¹ããŒã«åŸãããã°ã©ã ã¯ãã¬ãŒã¯ãã€ã³ãã«å°éãããŸã§æ©èœãããã®åŸãäœæ¥ãäžæãããå¶åŸ¡ããããã¬ãŒã«è»¢éãããŸãã
BPãã€ã³ã¹ããŒã«ããã³åé€ããæãç°¡åãªæ¹æ³ã¯ããããããŒãF5ãïŒãŸãã¯ã¡ãã¥ãŒã®ããããã°ã->ããã¬ãŒã¯ãã€ã³ãã®åãæ¿ããïŒã§ãã ä»ã®æ¹æ³ããããŸããããããã«ã€ããŠã¯åŸã§è©³ãã説æããŸãã
ããã°ã©ã ãåæ¢ããåŸãã¢ããªã±ãŒã·ã§ã³ãåæ¢ãããããã·ãŒãžã£ã®ããŒã«ã«å€æ°ã®å€ã調ã¹ããã®ããã·ãŒãžã£ã®åŒã³åºãã«å è¡ããåŒã³åºãã¹ã¿ãã¯ãåæã§ããŸãã ããã§ããããã®å€æ°ã®å€ãå€æŽã§ããŸãã
BPã眮ãå Žæ-ãã¡ããäžè¬çãªçãã¯ãããŸããã æ¬è³ªçã«ãBPã¯ãã³ãŒãã®åäœããã®æ£ç¢ºæ§ãããããªãããŸãã¯å³åº§ã«æ€åºã§ããªããšã©ãŒãæ瀺çã«å«ãã³ãŒãã®æäœã®åŠç¿ãä¿é²ããããã«èšèšãããŠããŸãã
ãã¬ãŒã¯ãã€ã³ããèšå®ããã³ãŒãã®åè¡ãé çªã«å®è¡ããæ¹ããåãã³ãŒããäœæéããããŠãæå³ãããã®ãšã¯ç°ãªãåäœãéå§ããå ŽæãèŠã€ããããšãããããã¯ããã«ç°¡åã§ãã
次ã®äŸãèŠãŠã¿ãŸãããã
ã¿ã¹ã¯ããããŸããæåã«ç¡å¹ã«ãããå€æ°ã®å€ã5åã«123ãã€å¢ããã³ãŒããèšè¿°ãããã®åŸãçµæã10é²æ°ãš16é²æ°ã®åœ¢åŒã§è¡šç€ºããŸãã äºæ³ãããå€ã¯ã128ããã³00000080ã§ãã
ã³ãŒãããšã©ãŒã§æžãããŠãããšããŸãããïŒ
var B: Integer = 123; procedure TForm1.FormCreate(Sender: TObject); var A: Integer; begin Inc(A); Inc(A); Inc(A, B); Inc(A); Inc(A); Inc(A); ShowMessage(IntToStr(A)); ShowMessage(IntToHex(A, 8)); end;
ãã®ã³ãŒãã¯ä»»æã®å€ãåºåããŸãããå€æ°ãAãããŒãã§åæåããŠããªããããå¿ èŠãªå€ã¯åºåããŸããã ãŸããå€æ°ãAãã¯ããŒã«ã«ã§ãããããã¹ã¿ãã¯ã«é 眮ãããŠããããšãæå³ãããã®æé ã®éå§æã«ã©ã®å€ãåãããäºæž¬ããããšã¯ã§ããŸããã ãããããã§ã«å¶æ¥æ¥ã®çµããã§ãããæ¬åœã«ç²ããŠïŒç®ããŒãããŠããïŒãå€æ°ã®åæåãå«ãè¡ãæžãã®ãå¿ããŠãããšä»®å®ããŸãã
ãã®çµæãäžæ£ãªå€ã衚瀺ããã³ãŒããããããã®åäœã®çç±ããã°ããææ¡ããããšèããŠããŸãã BPãããã·ãŒãžã£ã®æ¬äœã«å ¥ããããã°ã©ã ãå®è¡ããŠå®è¡ããŸãã
ããã¯åçã®ãããªãã®ã§ãªããã°ãªããŸããã BPã¯ã©ã€ã³IncïŒAïŒã«ã€ã³ã¹ããŒã«ãããŸãã å·Šäžã§ã¯ãFormCreateããã·ãŒãžã£ã®ãã¹ãŠã®ããŒã«ã«å€æ°ïŒãŠã£ã³ããŠã¯ãããŒã«ã«å€æ°ããšåŒã°ããŸãïŒã®å€ãã€ãŸãSelfå€æ°ïŒæé»çã«æž¡ãããã¯ã©ã¹ã¡ãœããã«åžžã«ååšããŸãïŒãSenderãã©ã¡ãŒã¿ãŒãããã³ããŒã«ã«å€æ°ãAãèªäœã確èªã§ããŸãã ãã®å€ã¯19079581ã§ãããWatchListãã®äžå€®ã®å·ŠåŽã¯ãå€æ°ãBãã®å€ã§ãã
äž¡æ¹ã®å€æ°ã®å€ãšå®äºãã3è¡ã®ã³ãŒããäžç®èŠãã ãã§ããå€æ° "A"ã®å€ãäºæ³ãšäžèŽããªãããšãããããŸãã ãŠãããããšã«2ã€ã®å¢åãš123ãã€ã®å¢åãå®è¡ããããããå€æ°ãAãã®å€125ã衚瀺ãããã¯ãã§ããç°ãªãå€ããããããããã¯1ã€ã®ããšããæå³ããŸãããå€æ°ãAãã®åæå€ã¯æ¬åœã
ä»®å®ã®æ£ããã確èªããããã«ãå€æ°ãAãã®çŸåšã®å€ãæ£ããå€ã«å€æŽããããã·ãŒãžã£ãè¿ãçµæãäºæããããã®ã§ãããã©ããã確èªããããã«ããã°ã©ã ãç¶ããŸãããã
ãããã¬ãŒã«ã¯ãå€æ°ã®å€ãå€æŽããããã®2ã€ã®ããŒã«ãçšæãããŠããŸãã
æåã®ãè©äŸ¡/å€æŽãã¯ãã¡ãã¥ãŒãŸãã¯ãããããŒãCtrl + F7ããä»ããŠåŒã³åºãããŸãã ããã¯æå°éã®æ©èœãåããéåžžã«ã·ã³ãã«ãªããŒã«ã§ãããæããã䜿çšãããŸãã
次ã®ããã«ãªããŸãã
å€æ°ã®å€ãå€æŽããã«ã¯ããæ°ããå€ããã£ãŒã«ãã«æ°ããå€ãæå®ããŠããEnterãããŒãŸãã¯ãå€æŽããã¿ã³ãæŒããŸãã
2çªç®ã®ããŒã«ã§ãããæ€æ»ãã¯ããå®è¡ãã¡ãã¥ãŒããããŸãã¯ãè©äŸ¡/å€æŽããã€ã¢ãã°ããçŽæ¥äœ¿çšããããšãã§ããŸãã ããã¯ãããé«åºŠãªãã©ã¡ãŒã¿ãŒãšãã£ã¿ãŒã§ãã
å€æ°ãAãã®å€ãå€æŽããåŸãããŒã«ã«å€æ°ã®å€ã®ãªã¹ãã®å€æŽã«æ³šæããŠãã ããã
å€æ°ãAãã¯æ£ããå€ãåãããF9ããæŒããã¡ãã¥ãŒãããå®è¡ããéžæããããšã§ãã¢ããªã±ãŒã·ã§ã³ã®å®è¡ãç¶ç¶ã§ããŸãã ãããã¬ã®å©ããåãããã®ãããªä»å ¥ã®çµæãããã·ãŒãžã£ã¯äºæ³ãããæ°å€128ãš00000080ãæäŸããŸãããšã©ãŒã®åå ãèŠã€ããå€æ°ãAãã®æ£ããèšå®ãããå€ã§å®è¡ã確èªãããããããã·ãŒãžã£ã³ãŒããå®å šã«ä¿®æ£ã§ããŸã
æ€æ»ã«æ»ããŸãããã 瀺ããã2ã€ã®åŒã³åºãæ¹æ³ã«å ããŠãå³ã¯ãªãã¯æã«ã³ã³ããã¹ãã¡ãã¥ãŒã䜿çšãããããããããŒãAlt + F5ãã䜿çšããŠããããŒã«ã«å€æ°ããŠã£ã³ããŠã§å€æ°ãããã«ã¯ãªãã¯ããããšã§ãåŒã³åºãããŸãã
ããã¯ããããé«åºŠãªãå€æ°ããããã£ãšãã£ã¿ãŒã§ããããªããžã§ã¯ãã®ããããã£ãå€æŽãããšãã«äœ¿çšããã®ã劥åœã§ãã éåžžã®å€æ°ãå€æŽããã®ã¯å€å°äžäŸ¿ã§ããããã®çç±ã¯æ¬¡ã®ãšããã§ãã
åŒã³åºããšãæåã«æ¬¡ã®ãã€ã¢ãã°ã衚瀺ãããŸãã
å€æ°ã®èª¬æãã¡ã¢ãªå ã®äœçœ®ãããã³çŸåšã®å€ã瀺ããŸããå€æŽããã«ã¯ãå床çç¥ãã¿ã³ãæŒãå¿ èŠããããŸãããã®åŸãè¿œå ã®ãŠã£ã³ããŠã衚瀺ãããŸãã
éåžžã®å€æ°ã®å€ãå€æŽãããããªåçŽãªæäœã®ããã®é床ã®äœã®åãã¯æããã«åé·ã§ãã ãã ããããã䜿çšããŠãªããžã§ã¯ãã®ããããã£ãå€æŽãããšãç»åãå°ãå€ãããŸãã
ãªããžã§ã¯ãã®ããããã£ãžã®ãè©äŸ¡/å€æŽãã¢ã¯ã»ã¹ã¯ã調æ»äžã®ãªããžã§ã¯ãã«é¢ããæ å ±ãçŽæ¥æäŸããªããšããç¹ã§å€å°è€éã§ãã ããšãã°ããã£ã³ãã¹ãã©ãŒã ã®ãã³ãã«ãååŸããã«ã¯ã次ã®ããã¹ããå ¥åããå¿ èŠããããŸãããïŒSForm as TForm1ïŒ.Canvas.Handleã-å°å°ããããšãã§ãããã®ããããã£ãŸãã¯ãã®ããããã£ã®ååãå¿ããŠããŸããããå€å°äžäŸ¿ã§ãã
Inspectã®å Žåããã®ãããªåé¡ã¯çºçããŸããã
ããšãã°ãå€æ°ãAãã§ã¯ãªããå€æ°Selfã«ã€ããŠãInspectããã€ã¢ãã°ãéããŸãããïŒåè¿°ã®ããã«ãããã¯ãªããžã§ã¯ãã®ãã¹ãŠã®ã¡ãœããã«å¯ŸããŠåžžã«æé»çã«ååšããŸãïŒã
ã芧ã®ãšããããã®å Žåããªããžã§ã¯ãã®ã»ãšãã©ãã¹ãŠã®ãã£ãŒã«ãã«ã¢ã¯ã»ã¹ã§ããŸãããå¿ èŠã«å¿ããŠå€æŽã§ããŸããããããã£ã®ååãæ··ä¹±ããããšã¯ãããŸããã
1.2ã ãã¬ãŒã¹ïŒæ®µéçãªãããã°ïŒ
ãã¬ãŒã¹ã®æ¬è³ªã¯ãã³ãŒãã®åè¡ãã¹ãããããšã«å®è¡ããããšã§ãã
以åã«ã€ã³ã¹ããŒã«ããBPã§åæ¢ããã³ãŒããåæãã次ã®è¡ã«ç§»åããããšããŸãã ååãšããŠãBPãé 眮ããŠããã°ã©ã ãå®è¡ããããšãã§ããŸãã ãããŠæ¬¡ã®ããããŠãã以éã®äººã ã®ããã«ã
å®éã«ã¯ãããã·ãŒãžã£ã³ãŒãã®åè¡ã«BPãèšå®ããŠããããã¬èªäœãå®è¡ã§ããããšãæåã§ã·ãã¥ã¬ãŒãããŸãïŒ2çªç®ã®ã»ã¯ã·ã§ã³ã§è©³ãã説æããŸãïŒã
ãããŠåœŒã¯æ¬¡ã®ããšãç¥ã£ãŠããŸãã
- ã³ãã³ããTrace IntoãïŒãF7ãïŒ-ãããã¬ãŒã¯çŸåšã®ã³ãŒãè¡ã®ã³ãŒããå®è¡ãã次ã®ã³ãŒãã§åæ¢ããŸãã çŸåšã®ã³ãŒãè¡ãããã·ãŒãžã£ãåŒã³åºãå Žåã次ã®è¡ã¯åŒã³åºãããããã·ãŒãžã£ã®æåã®è¡ã«ãªããŸãã
- ãStep Overãã³ãã³ãïŒãF8ãïŒã¯æåã®ã³ãã³ãã«äŒŒãŠããŸãããåŒã³åºãããããã·ãŒãžã£ã®æ¬äœãžã®ãšã³ããªã¯çºçããŸããã
- ã次ã®ãœãŒã¹è¡ãžã®ãã¬ãŒã¹ãã³ãã³ãïŒãShift + F7ãïŒãæåã®ã³ãã³ãã®ã»ãŒå®å šãªé¡äŒŒç©ã§ããããCPUãã¥ãŒããŠã£ã³ããŠã§äœ¿çšãããŸãïŒãã®ãããã°ã¢ãŒãã¯ãã®èšäºã§ã¯èæ ®ãããŠããŸããïŒã
- ãRun to CursorãïŒãF4ãïŒã³ãã³ã-ãããã¬ãŒã¯ãã«ãŒãœã«ãçŸåšäœçœ®ããŠããè¡ãŸã§ããã°ã©ã ã³ãŒããå®è¡ããŸãïŒå®è¡äžã«ä»ã®BPãçºçããªãã£ããšããæ¡ä»¶ã§ïŒã
- ããªã¿ãŒã³ãŸã§å®è¡ãã³ãã³ãïŒãShift + F8ãïŒ-ãããã¬ãŒã¯ãçŸåšã®ããã·ãŒãžã£ã®ã³ãŒããçµäºãããŸã§å®è¡ããŸãã ïŒå€ãã®å Žåã誀ã£ãŠæŒããããF7ãã®ã«ãŠã³ã¿ãŒãšããŠããŸãå®è¡äžã«ä»ã®BPãæ€åºãããªããšããæ¡ä»¶äžã§äœ¿çšãããŸããïŒã
- Delphiã®å€ãããŒãžã§ã³ã§ã¯ãã次ã®ã¹ããŒãã¡ã³ããèšå®ãã³ãã³ãã䜿çšã§ããŸãããã®ã³ãã³ãã䜿çšããŠãã³ãŒãã®ä»»æã®è¡ãçŸåšã®è¡ãšããŠèšå®ããããšã«ãããããã°ã©ã ã®é²è¡ç¶æ³ãå€æŽã§ããŸãã ãã®æ©èœã¯ãçŸåšã¢ã¯ãã£ããªè¡ãæãç¢å°ãæ°ããäœçœ®ã«ãã©ãã°ã§ããã³ãŒããšãã£ã¿ãŒã§ã䜿çšã§ããŸãã
ãããã®ããŒã ã¯è©³çŽ°ãªæ€èšãå¿ èŠãšããŸããã ãTrace IntoãïŒãF7ãïŒããŒã ã®ã¿ã«æ³šç®ããŸãããã
ããšãã°ã次ã®ã³ãŒãã䜿çšããŸãã
procedure TForm1.FormCreate(Sender: TObject); var S: TStringList; begin S := TStringList.Create; try S.Add('My value'); finally S.Free; end; end;
ãã¬ãŒã¹ãå®è¡ãããšããS.AddïŒïŒã®è¡ã«ãããšãããããã¬ãŒã®åå¿ã«ã¯2ã€ã®ãªãã·ã§ã³ããããŸãã
- TStringList.Addã¡ãœããå ã«ç§»åãã
- ããã«ã¯å ¥ããŸããã
ãã®åäœã¯ãã³ã³ãã€ã©ã®èšå®ãåå ã§ãã äºå®ãDelphiã«ã¯ã·ã¹ãã ã¢ãžã¥ãŒã«çšã«2ã»ããã®DCUãä»å±ããŠããŸãã 1ã€ã¯ãããã°æ å ±ããã2ã€ç®ã¯ãããã°æ å ±ãªãã 2çªç®ã®ã¢ãžã¥ãŒã«ãæ¥ç¶ãããŠããå Žåããã®å Žåã®ãTrace IntoãïŒãF7ãïŒã³ãã³ãã¯ãStep OverãïŒãF8ãïŒãšããŠæ©èœããŸãã ã³ã³ãã€ã©ãŒèšå®ã®ã¢ãžã¥ãŒã«éã®åãæ¿ããæ§æãããŸãã
ãŸããããããã°DCUã䜿çšããã©ã¡ãŒã¿ãŒããã®æ©èœãæ åœããŸãã
1.3ã ã³ã³ãã€ã©ãŒèšå®ã®è©³çŽ°
ã³ã³ãã€ã©èšå®ã®ã¿ãã®ãªãã·ã§ã³ã¯ããããžã§ã¯ãããã«ããããšãã«çæãããã³ãŒãã«çŽæ¥åœ±é¿ããŸãã ãã®ã¿ãã®ããããã®é ç®ãå€æŽããå Žåãå€æŽãæå¹ã«ããã«ã¯ãããžã§ã¯ãã®å®å šãªåã¢ã»ã³ããªïŒããããžã§ã¯ã>ãã«ããïŒãå¿ èŠã§ããããšãå¿ããªãã§ãã ããã ãããã®èšå®ã¯ãããŸããŸãªç¶æ³ã§ã®ã³ãŒãã®åäœãããã³ãããžã§ã¯ãã®ãããã°æã«å©çšå¯èœãªæ å ±ã®æ§æã«çŽæ¥åœ±é¿ããŸãã
ãããããã詳现ã«æ€èšããŸãããã
ã³ãŒãçæã°ã«ãŒã
æé©åãã©ã¡ãŒã¿ãŒ
ãã®ãã©ã¡ãŒã¿ãŒã¯ãã³ãŒãã®æé©åã«çŽæ¥åœ±é¿ããŸãããã©ã¡ãŒã¿ãŒããªã³ã®å Žåãã³ãŒãã¯ãµã€ãºãšå®è¡é床ã®äž¡æ¹ãèæ ®ããŠãæé©ãªæ¹æ³ã§çæãããŸãã ã³ãŒãã®æé©åã«ãããBPã§äžæããæç¹ã§æ¢ã«ã¡ã¢ãªããåé€ãããŠããå¯èœæ§ããããããããã«ãããäžéšã®ããŒã«ã«å€æ°ãžã®ã¢ã¯ã»ã¹ãïŒèªã¿åãã§ãïŒã¢ã¯ã»ã¹ã§ããªããªãå¯èœæ§ããããŸãã
äŸãšããŠãæåã®ç« ã®ã³ãŒããåãäžããåãBPã«ã€ããŠèª¬æããŸãããæé©åã¯ãªã³ã«ãªã£ãŠããŸãã
ã芧ã®ãšããã以åã«äœ¿çšå¯èœãªSelfããã³Senderå€æ°ã®å€ã¯äœ¿çšã§ããªããªããŸããã ãŸããããããã°DCUã䜿çšããã©ã¡ãŒã¿ãŒãç¡å¹ã«ãªã£ãŠããããããã³ãŒã«ã¹ã¿ãã¯ããŠã£ã³ããŠã§åçãªå€æŽãçºçãã以åã¯ã³ãŒã«ãªã¹ãã«é¢ãã詳现æ å ±ã衚瀺ãããŠããŸããã
ããã«ãInspectããŒã«ã¯Selfãªããžã§ã¯ãã®æäœãæåŠãã次ã®ãšã©ãŒãçºçãããŸãã
ã¹ã¿ãã¯ãã¬ãŒã ãšPentiom-safe FDIVãªãã·ã§ã³
ãããã®ãã©ã¡ãŒã¿ãŒã®èª¬æã¯ã¹ãããããŸã-ãããã°æ®µéã§ã¯ããããã®ãã©ã¡ãŒã¿ãŒã¯ããããããããŸããã èŠããã«ã1ã€ç®ã¯ã¹ã¿ãã¯ã®èªå·±åæã«åœ¹ç«ã¡ã2ã€ç®ã¯æ°åŠçã³ããã»ããµãŒã§äœæ¥ããéã®ãã¥ã¢ã³ã¹ã®åå ãšãªããŸãã 誰ãããã¥ã¢ã³ã¹ã«èå³ãããå Žåã¯ããããã¡ã€ã«ã§ã®ã³ãã¥ãã±ãŒã·ã§ã³ã®ç§ã®åº§æšã
ã¬ã³ãŒããã£ãŒã«ãã®äœçœ®åãããã©ã¡ãŒã¿ãŒ
ããã¯ãããŠããªãã¬ã³ãŒãã®ã°ããŒãã«ã¢ã©ã€ã³ã¡ã³ãããã£ã¬ã¯ãã£ãã{$ Align x}ããŸãã¯ã{$ A x}ãã䜿çšããŠã¢ãžã¥ãŒã«å ã§ããŒã«ã«ã«å€æŽã§ããŸãã
ããšãã°ã次ã®ã³ãŒããæ€èšããŠãã ããã
type T = record a: Int64; b: Byte; c: Integer; d: Byte; end;
SizeOfïŒTïŒãä»ããŠååŸã§ãããã®ã¬ã³ãŒãã®ãµã€ãºã¯ãã¢ã©ã€ã¡ã³ãèšå®ããšã«ç°ãªããŸãã
{$ Align 1} = 14
{$ Align 2} = 16
{$ Align 4} = 20
{$ Align 8} = 24
æ§æãªãã·ã§ã³ã°ã«ãŒã
äœã觊ããªãæ¹ãããã§ã è©ŠããŠã¿ããšãæšæºVCLã§ã®ã¢ã»ã³ãã«ãæåŠããããšãã§ããŸãã
ç§ã¯ãComplete boolen evalããã©ã¡ãŒã¿ã«ã€ããŠã®ã¿èª¬æããŸãããããã®ããã€ãã¯æã ããããªã³ã«ããããã§ãã 次ã®ã³ãŒããå®è¡ãããšãšã©ãŒãçºçããŸãã
function IsListDataPresent(Value: TList): Boolean; begin Result := (Value <> nil) and (Value.Count > 0); end; procedure TForm1.FormCreate(Sender: TObject); begin if IsListDataPresent(nil) then ShowMessage('boo...'); end;
ãã®èšå®ããªã³ã«ãããšãããŒã«åŒå šäœããã§ãã¯ããããããæåã®ãã§ãã¯ã§Valueãã©ã¡ãŒã¿ãŒãç¡å¹åãããŠãããšå€æãããã«ãããããããValue.Countã«ã¢ã¯ã»ã¹ãããšãšã©ãŒãçºçããŸãã ãŸããïŒããšãã°ïŒãæ¡åŒµæ§æããã©ã¡ãŒã¿ãŒãæå¹ã«ãããšããã®ã³ãŒãã¯ã宣èšãããŠããªãResultå€æ°ã«ã€ããŠäžå¹³ãèšã£ãŠãåéãããŸããã
ã©ã³ã¿ã€ã ãšã©ãŒã°ã«ãŒã
ç¯å²ç¢ºèªãã©ã¡ãŒã¿ãŒ
ããã¯ãã¢ããªã±ãŒã·ã§ã³ã®ãããã°æã«æãèŠæ±ããããã©ã¡ãŒã¿ãŒã®1ã€ã§ãã 圌ã¯ãããŒã¿é åã«ã¢ã¯ã»ã¹ãããšãã«å¢çããã§ãã¯ãã責任ããããŸãã
æãåçŽãªå Žåããã®ã³ãŒããå®è¡ãããšäŸå€ãã¹ããŒãããŸãã
const A: array [0..1] of Char = ('A', 'B'); procedure TForm1.FormCreate(Sender: TObject); var I: Integer; begin for I := 0 to 100 do Caption := Caption + A[I]; end;
ããã§ã¯ãåã«é åã®èŠçŽ ã«ã¢ã¯ã»ã¹ããããšããŠããŸãããååãšããŠããç¯å²ãã§ãã¯ããªãã·ã§ã³ãç¡å¹ã«ããŠãå²ãåœãŠãããã¡ã¢ãªãè¶ ããªãå Žåããã®ã³ãŒãã¯ãã©ãŒã ããããŒã«å¥åŠãªè¡ããããšè ããŸãã
ããã¯äžå¿«ã§ãããããã°ã©ã ã®å®è¡ã«ã¯éèŠã§ã¯ãããŸããã ãããã¯ã«æžã蟌ãããšãããšãã«ãããã¯ã®å¢çãééããå Žåãããã«æªãããšã«ãªããŸãããã®å Žåãã¢ããªã±ãŒã·ã§ã³ã®ã¡ã¢ãªãç Žå£ãããå¯èœæ§ããããŸãã
ãã®äŸãæ€èšããæé©åãç¡å¹ã«ããŸãã
type TMyEnum1 = (en1, en2, en3, en4, en5); TMyEnum2 = en1..en3; procedure TForm1.FormCreate(Sender: TObject); var I: TMyEnum1; HazardVariable: Integer; Buff: array [TMyEnum2] of Integer; begin HazardVariable := 100; for I := Low(I) to High(I) do Buff[I] := Integer(I); ShowMessage(IntToStr(HazardVariable)); end;
ãã®ã³ãŒãã®å®è¡åŸãHazardVariableã®æ°å€ã¯ã©ããªããšæããŸããïŒ å埩åã®ã¿ã€ããéžæãããšãã«ãã¹ãããŠãTMyEnum2ã§ã¯ãªãTMyEnum1ãèšè¿°ãããããé åã®å¢çã®ç¯å²ãè¶ ããã¹ã¿ãã¯äžã®ããŒã¿ã倱ãããããã«æ ŒçŽãããŠããããŒã«ã«å€æ°ã®å€ãå€æŽãããŸããã
æé©åãæå¹ã«ãããšãç¶æ³ã¯ããã«æªåããŸãã 次ã®ãšã©ãŒã衚瀺ãããŸãã
ãã®èª¬æã«ããã°ããšã©ãŒããã¹ãã«èšèŒãããŠããã¢ãã¬ã¹ã¯ã¢ããªã±ãŒã·ã§ã³ã®ã¡ã¢ãªã«å±ããŠããªããããäŸå€ãã©ãã§çºçããã®ãããªãçºçããã®ãæšæž¬ããããšãã§ããŸããã説æã§ããŸããã
ãããã£ãŠãååãšããŠãããåãå ¥ããŸã-ã¢ããªã±ãŒã·ã§ã³ã®ãããã°ã¯ãåžžã«ãç¯å²ãã§ãã¯ãèšå®ããªã³ã«ããŠè¡ãå¿ èŠããããŸãïŒ
ãŸãããã®ãã©ã¡ãŒã¿ãŒã¯ãå€æ°ã®å€ãå€æŽããéã®èš±å®¹å€ã®è¶ éãå¶åŸ¡ããŸãã ããšãã°ãè² ã®å€ãCardinal / DWORDãªã©ã®ç¬Šå·ãªãã®åã«å²ãåœãŠãããšããå ŽåããŸãã¯ãã®åã®å€æ°ãå«ãããšãã§ããå€ããã倧ããå€ãå²ãåœãŠãããšããå Žåãããšãã°Byteåã®å€æ°ã«500ãå²ãåœãŠãå Žåãªã©ã«ãäŸå€ãçºçããŸã
ãã©ã¡ãŒã¿ãI / O chekingã
Pascalã¹ã¿ã€ã«ã®ãã¡ã€ã«ãæäœããå ŽåãI / Oã®çµæã確èªããå¿ èŠããããŸãã
ãã®ã¢ãããŒãã䜿çšãããœãããŠã§ã¢ããŸã ãããã©ããã¯ããããŸããããAppend / Assign / Rewriteãªã©ãçªç¶äœ¿çšããå Žåã¯ãã¢ããªã±ãŒã·ã§ã³ã®ãããã°æã«ãã®ãªãã·ã§ã³ãæå¹ã«ããŠãã ããã
ãªãŒããŒãããŒãã§ãã¯ãªãã·ã§ã³
ç®è¡æŒç®ã®çµæãå¶åŸ¡ããçµæãå€æ°ã®ç¯å²å€ã«ããå Žåã«äŸå€ãçºçãããŸãã
ãã®ãã©ã¡ãŒã¿ãŒãšãç¯å²ãã§ãã¯ãã®éããç解ããããããããã«ã次ã®ã³ãŒããæ€èšããŠãã ããã
procedure TForm1.FormCreate(Sender: TObject); var C: Cardinal; B: Byte; I: Integer; begin I := -1; B := I; C := I; ShowMessage(IntToStr(C - B)); end;
ããªãŒããŒãããŒãã§ãã¯ããªãã·ã§ã³ãæå¹ã«ãªã£ãŠããå Žåããã®ã³ãŒãã¯äŸå€ãçºçãããŸããã ããã§ã¯åãå ¥ããããªãå€ãå€æ°ã«å²ãåœãŠãããŠããŸããããããã«å¯ŸããŠæ°åŠçæŒç®ã¯å®è¡ãããŸããã ãã ãããç¯å²ãã§ãã¯ããªãã·ã§ã³ãæå¹ã«ãªã£ãŠããå ŽåãäŸå€ãçºçããŸãã
次ã«ãã³ãŒãã®2çªç®ã®ããŒãžã§ã³ãæ€èšããŸãã
procedure TForm1.FormCreate(Sender: TObject); var C: Cardinal; B: Byte; begin B := 255; Inc(B); C := 0; C := C - 1; ShowMessage(IntToStr(C - B)); end;
ãç¯å²ãã§ãã¯ããã©ã¡ãŒã¿ãŒããã®åå¿ã¯ãªããªããŸãããç®è¡æŒç®ã®çµæãã§ããªããããIncïŒBïŒããã³CïŒ= C-1ã®è¡ã§ãOverflow chekingããåå ã®EIntegerOverflowäŸå€ãçºçããŸãã察å¿ããå€æ°ã«ä¿åãããŸãã
ãããã£ãŠãå€æ°ã䜿çšããå Žåãäž¡æ¹ã®ãã©ã¡ãŒã¿ãŒã¯äºãã«è£å®ããŸãã
ãªãŒããŒãããŒãã§ãã¯ã¯ãç¯å²ãã§ãã¯ã»ã©éèŠã§ã¯ãããŸããããã¢ããªã±ãŒã·ã§ã³ããããã°ãããšãã¯ããªã³ã®ãŸãŸã«ããŠããããšããå§ãããŸãã
å°ããªãã¥ã¢ã³ã¹ïŒæå·ã¢ã«ãŽãªãºã ãçªç¶å®è£ ããå ŽåãååãšããŠããªãŒããŒãããŒæäœã¯æšæºã§ãã ãã®ãããªç¶æ³ã§ã¯ãã³ãŒããå¥ã®ã¢ãžã¥ãŒã«ã«è»¢éããã¢ãžã¥ãŒã«ã®å é ã«ã{$ OVERFLOWCHECKS OFF}ããã£ã¬ã¯ãã£ããèšè¿°ããŠãçŸåšã®ã¢ãžã¥ãŒã«ã®ãªãŒããŒãããŒãã§ãã¯ãç¡å¹ã«ããŸãã
ãããã°ã°ã«ãŒã
ãã®ã¿ãã§ã¯ããã¹ãŠãéåžžã«ç°¡åã§ãã ãã¢ãµãŒã·ã§ã³ããã©ã¡ãŒã¿ãŒãé€ããã¹ãŠã®ãã©ã¡ãŒã¿ãŒã¯ãã¢ããªã±ãŒã·ã§ã³ã®æçµã³ãŒãã«åœ±é¿ãäžããŸããã ç¹å®ã®ãã©ã¡ãŒã¿ã®ã¢ã¯ãã£ããã£ã«å¿ããŠãåã¢ãžã¥ãŒã«ã®DCUãã¡ã€ã«å ã®ãããã°æ å ±ã®å®å šæ§ãå€ãããŸãã ãã®æ å ±ã«åºã¥ããŠããããã¬ãŒã¯ãããã°ã©ã ã®ã¢ã»ã³ãã©ãŒãªã¹ããããã°ã©ããŒã«ãã£ãŠå®è£ ãããå®éã®ã³ãŒããšåæããããŒã«ã«å€æ°ãªã©ãèªèããŸããã¢ããªã±ãŒã·ã§ã³ãã³ã³ãã€ã«ãããšãããã®ãããã°æ å ±ã¯ã¢ããªã±ãŒã·ã§ã³ã®æ¬äœã«åãŸããŸããã
å¯äžã®äŸå€ã¯ãAssertionsããã©ã¡ãŒã¿ãŒã§ã-AssertïŒïŒããã·ãŒãžã£ã®æäœãæ åœããŸãã ãã®ãã©ã¡ãŒã¿ãŒãç¡å¹ã«ãªã£ãŠããå ŽåãAssertã¯å®è¡ãããŸãã;ãã以å€ã®å Žåãå®è¡ããããã®ã³ãŒããã³ã³ãã€ã«æ®µéã§ã¢ããªã±ãŒã·ã§ã³æ¬äœã«é 眮ãããŸãã
ãŸãšããŸãã
ã¢ããªã±ãŒã·ã§ã³ã®ãããã°ã®æ®µéã§ã¯ããã©ã³ã¿ã€ã ãšã©ãŒãã°ã«ãŒããšããããã°ãã°ã«ãŒãã®ãã¹ãŠã®ãã©ã¡ãŒã¿ãŒãæå¹ã«ãããªãªãŒã¹ã¢ããªã±ãŒã·ã§ã³ã®æçµã³ã³ãã€ã«äžã¯ç¡å¹ã«ããããšããå§ãããŸãã Delphi 7以åã§ã¯ãããã¯æåã§è¡ãå¿ èŠããããŸãããDelphi 2005以éã§ã¯ããããžã§ã¯ããã«ãã®éåžžã®ãµããŒããç»å ŽããŸããããã®ãã«ãã§ã¯ããããã®ãã©ã°ã®çµã¿åãããã¢ã»ã³ããªã®çš®é¡ããšã«åå¥ã«æå®ã§ããŸãã
1.4ã åŒã³åºãã¹ã¿ãã¯ãŠã£ã³ããŠ
ã¢ããªã±ãŒã·ã§ã³ã®ãããã°æã«BPãã¡ã€ã³ããŒã«ã§ããå ŽåãCall Stackã2çªç®ã«éèŠã§ãã
ãã®ãŠã£ã³ããŠã¯æ¬¡ã®ããã«ãªããŸãã
ãããã¬ãŒãã€ã³ã¹ããŒã«ãããBPã§ããã°ã©ã ã®å®è¡ãäžæããïŒãŸãã¯ãšã©ãŒã®ããã«åæ¢ããïŒåã«è¡ãããåŒã³åºãã®å®å šãªèª¬æãå«ãŸããŠããŸãã ããšãã°ãã¹ã¯ãªãŒã³ã·ã§ããã¯ããã©ãŒã äžã®ãã¿ã³ãã¯ãªãã¯ãããšãã«çºçããåŒã³åºãã®ã¹ã¿ãã¯ã瀺ããŠããŸãã TWinControl.DefaultHandlerããã·ãŒãžã£ã«WM_COMMANDïŒ273ïŒã¡ãã»ãŒãžãå°çããããšããå§ãŸããŸããã
ãã®ãªã¹ããæå ã«çœ®ããŠãããã«ã¯ãªãã¯ããŠïŒãŸãã¯ããœãŒã¹ã衚瀺ãã¡ãã¥ãŒã䜿çšããŠïŒã³ãŒã«ããã°ããåãæ¿ããåã³ãŒã«ã®ããŒã«ã«å€æ°ã®ãªã¹ãã衚瀺ïŒãããŒã«ã«ã衚瀺ãïŒããã³ãŒã«ã§BPãèšå®ããŸãã
ãã¡ãããå€ãã®å¯èœæ§ã¯ãããŸããããã»ãšãã©ã®å Žåããšã©ãŒãçºçããå Žæããã°ããããŒã«ã©ã€ãºã§ããããããããã°äžã®äœæ¥ãå€§å¹ ã«å®¹æã«ãªããŸãã
ããšãã°ãEAbstractErrorãšã©ãŒãçºçãããšãåŒã³åºãã¹ã¿ãã¯ã¯æ¬¡ã®ããã«ãªããŸãã
ãã®å Žåããšã©ãŒããã®äžã«ããå¯èœæ§ãé«ããšèšãããã«ã¯ãDelphiã·ã¹ãã ã¢ãžã¥ãŒã«ã«ã³ãŒããé 眮ãããŠããªãæåã®åŒã³åºããèŠã€ããã ãã§ååã§ãã ãã®ãããªåŒã³åºãã¯Unit1.TForm1.Button1ClickïŒïŒã§ããããã¯ã次ã®ã³ãŒããå®è¡ãããButton1ãã¿ã³ãã³ãã©ãŒã§ãã
procedure TForm1.Button1Click(Sender: TObject); begin TStrings.Create.Add('qwe'); end;
å¥ã®äœ¿çšäŸã¯ãç¹å®ã®é¢æ°ã®åŒã³åºãããã¬ãŒã¹ããããšã§ãã ããšãã°ãéåžžã«å€§ããªã¢ããªã±ãŒã·ã§ã³ã³ãŒããããããã®å éšã®ã©ããã«MessageBoxãåŒã³åºãããŠããŸããããã®MessageBoxã®åŒã³åºãã®å ŽæãããŒã«ã©ã€ãºããããã®ãããã®ãããã®å ŽæãèŠã€ããããšã¯ã§ããŸããã ãããè¡ãã«ã¯ã次ã®æ¹æ³ã䜿çšã§ããŸãã
- 察象ã®é¢æ°ã®åŒã³åºãã宣èšãããŠããã¢ãžã¥ãŒã«ïŒãã®å Žåã¯windows.pasïŒã«ç§»åããŸãã
- ãã®å®£èšïŒéããããé¢æ°MessageBoxãæã€è¡;å€éšuser32 ...ïŒã
- ãã®è¡ã«BPãã€ã³ã¹ããŒã«ããããã°ã©ã ãå®è¡ããŸãã
ããã°ã©ã å ã®ä»»æã®å ŽæããMessageBoxåŒã³åºããè¡ããããšããã«ãBPãæ©èœããåŒã³åºãã¹ã¿ãã¯ããŒã¿ã«åºã¥ããŠåŒã³åºãã®æ£ç¢ºãªå ŽæãèŠã€ããããšãã§ããŸãã
1.5ã é«åºŠãªãã¬ãŒã¯ãã€ã³ãããããã£ã®æäœ
, , , , , , , .
. BP .
«Breakpoint list» BP.
:
«Condition» .
ããã¹ã«ãŠã³ãããã©ã¡ãŒã¿ãŒã¯ãBPãã¢ã¯ãã£ãã«ãªãåã«ãã®ãããªæ¡ä»¶ãããã€ã¹ãããããå¿ èŠããããã瀺ãããæ¡ä»¶ããã©ã¡ãŒã¿ãŒã®å€ãèæ ®ããŠãæäœã®æ°ãæåããã«ãŠã³ããããŸãã
æœè±¡çãªäŸãèããŠã¿ãŸãããïŒ
procedure TForm1.FormCreate(Sender: TObject); var I, RandomValue: Integer; begin RandomValue := Random(100); for I := 1 to 100 do RandomValue := RandomValue + I; ShowMessage(IntToStr(RandomValue)); end;
, (RandomValue := ...). , 100 . «Pass count» 10. , «I» .
, 75 , «Condition»: I > 75. : , «I» 85, , 95.
:
, , , . . «Pass count», , , «Pass count». ( ).
«Condition», . ., «I» 75, , . , , «Pass count» , «I» 85.
, , «I» 75, «Pass count» .
.
.
, , . ã€ãŸã ( ), , , 100 , , .
: (, ), .
:
procedure TForm1.FormCreate(Sender: TObject); var I, RandomValue: Integer; begin RandomValue := Random(100); for I := 1 to 10000 do RandomValue := RandomValue + I; ShowMessage(IntToStr(RandomValue)); end;
åã7è¡ç®ã«BPãèšå®ãããã©ã¡ãŒã¿ãŒãConditionãã«å€I = 9999ãæå®ããŸãããã®ãããªå°ããªãµã€ã¯ã«ã§ãã£ãŠãã3ã5ç§ã®ç¯å²ã§ç¶æ ãæ©èœããã®ãåŸ ã€å¿ èŠããããŸãããã¡ãããããã¯äŸ¿å©ã§ã¯ãããŸããããã®ãããªå Žåã次ã®ããã«ã³ãŒããå€æŽããæ¹ãç°¡åã§ãã
procedure TForm1.FormCreate(Sender: TObject); var I, RandomValue: Integer; begin RandomValue := Random(100); for I := 1 to 10000 do begin RandomValue := RandomValue + I; {$IFDEF DEBUG} if I = 9999 then Beep; {$ENDIF} end; ShowMessage(IntToStr(RandomValue)); end;
⊠Beep, . .
( DEBUG , , , Beep-. )
«» , (SEH), Delphi try..finally..except. SEH «» . , :
function Test1(var Value: Integer): Cardinal; var I: Integer; begin Result := GetTickCount; for I := 1 to 100000000 do Inc(Value); Result := GetTickCount - Result; end; function Test2(var Value: Integer): Cardinal; var I: Integer; begin Result := GetTickCount; for I := 1 to 100000000 do try Inc(Value); finally end; Result := GetTickCount - Result; end; procedure TForm1.FormCreate(Sender: TObject); var A: Integer; begin A := 0; ShowMessage(IntToStr(Test1(A))); A := 0; ShowMessage(IntToStr(Test2(A))); end;
Test1 Test2 100 .
210 , â , â try..finally.
, «» â , âŠ
«Group», BP . â , , , , BP, .
:
: «Enable group» â , «Disable group» â .
«Break», . , .
â .
â , .
, .
äŸãã³ã³ãã€ã«ããåã«ãã³ã³ãã€ã©ãŒèšå®ã§ããªãŒããŒãããŒãã§ãã¯ããªãã·ã§ã³ãæå¹ã«ããæé©åãç¡å¹ã«ããŠãã ããã
function Level3(Value: Integer): Integer; var I: Integer; begin Result := Value; for I := 0 to 9 do Inc(Result); end; function Level2(Value: Integer): Integer; var I: Integer; begin Result := Value; for I := 0 to 9 do Inc(Result, Level3(Result) shr 1); end; function Level1(Value: Integer): Integer; var I: Integer; begin Result := Value; for I := 0 to 9 do Inc(Result, Level2(Result) shr 3); end; procedure TForm1.FormCreate(Sender: TObject); begin ShowMessage(IntToStr(Level1(0))); end;
ãã®ã³ãŒããå®è¡ãããšã16è¡ç®ã«äŸå€ãçºçããŸã
Inc(Result, Level3(Result) shr 1);.
, , , , . : , , , «F9» , .
, , , , .
:
- «level2BP».
- , . FormCreate ShowMessage «Disable group» «level2BP». , «Break».
- Level1 â25. , .
- , 9 ( I ). , 8 , , «level2BP». «Condition» I=8, «Break» «Enable group» «level2BP».
- , Level2, â . F9, , , , I 5. «Condition» I=5, .
- , .
â , :
rouse.drkb.ru/blog/bp3.mp4 (17 ).
( , , , , )
, , .
«Pass Count», «Condition»? , «Pass Count» . (. . «Condition») , .
.
«Ignore subsequent exceptions» , .
«Handle subsequent exceptions» , .
, :
procedure TForm1.Button1Click(Sender: TObject); begin ShowMessage('All exceptions ignored'); end; procedure TForm1.Button2Click(Sender: TObject); begin PInteger(0)^ := 123; end; procedure TForm1.Button3Click(Sender: TObject); var S: TStrings; begin S := TStrings.Create; try S.Add('abstract') finally S.Free; end; end; procedure TForm1.Button4Click(Sender: TObject); begin ShowMessage('All exceptions handled'); end;
ShowMessage , , «Break», «Ignore subsequent exceptions».
ShowMessage , «Handle subsequent exceptions».
:
- Button1
- Button2
- Button3
- Button4
- Button2
- Button3
, Button2 Button3 , 2 3 , 5 6 , Button4.
2 :
«Log message» â , .
«Eval expression» â , ( «Log result») . , «123 * 2».
1.6ã «Data breakpoint», «Watch List» «Call Stack»
, , «Source Breakpoint». . . , .
, , (, , ) BP , , «Data breakpoint».
«Watch List» ( Delphi) «Breakpoint List» «Add Breakpoint->Data Breakpoint», , , , . , ( ) .
åé¡ã¯ãã¢ããªã±ãŒã·ã§ã³ãèµ·åãããã³ã«å€æ°ãé 眮ãããã¢ãã¬ã¹ãæ¯åç°ãªãããããã®å€ã®ååŸãéåžžã«é£ããããšã§ãã
â . , , , «Data breakpoint» . , , , . . â , , , , , , . «Data breakpoint» , .
, , «Data breakpoint» â «Memory Breakpoint».
, Delphi , «Memory Breakpoint» , .
, .
:
type TTest = class Data: array [0..10] of Char; Caption: string; Description: string; procedure ShowCaption; procedure ShowDescription; procedure ShowData; end; TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private FT: TTest; procedure InitData(Value: PChar); end; var Form1: TForm1; implementation {$R *.DFM} { TTest } procedure TTest.ShowCaption; begin ShowMessage(Caption); end; procedure TTest.ShowData; begin ShowMessage(PChar(@Data[0])); end; procedure TTest.ShowDescription; begin ShowMessage(Description); end; { TForm1 } procedure TForm1.FormCreate(Sender: TObject); begin FT := TTest.Create; try FT.Caption := 'Test caption'; FT.Description := 'Test Description'; InitData(@FT.Data[0]); FT.ShowCaption; FT.ShowDescription; FT.ShowData; finally FT.Free; end; end; procedure TForm1.InitData(Value: PChar); const ValueData = 'Test data value'; var I: Integer; begin for I := 1 to Length(ValueData) do begin Value^ := ValueData[I]; Inc(Value); end; end;
, :
«Break», - «system»:
, , , «Call Stack», , ShowCaption .
BP , , , Caption, :
, - Caption. «Data breakpoint».
- Caption, FT.Description := 'Test Description';.
- , FP.Caption «Watch List» «Break When Changed». (, Delphi 2010 ), «Data breakpoint» . «Breakpoint List» «Add->Data Breakpoint», FP.Caption .
- .
, â68 â Inc(Value). «Data breakpoint» , , , , FP.Caption, â Value^ := ValueData[I].
, , . , ValueData, Data, , - , Caption Description.
1.7. çµè«ãšããŠ
. , : , .., .
«CPU-View» Address Breakpoint. , .. , CPU-View :)
, . , BreakPoint, Data Breakpoint, Delphi, ( , TF GUARD ), Hardware Breakpoint, Delphi.
« » , aka Inovet, aka Palladin aka .
(Rouse_)
, 2012