Ó théama an iris go cleachtas tionscadail
Leathanaigh seirbhíse agus teicniúla oiriúnacha don alt
Nuair a éiríonn aip Delphi i mbun oibre ag “méadú” go mall, má bhriseann sí go sporadúil le Access Violations nó má éiríonn sí gan seasmhacht go tobann tar éis laethanta rith, ní bhíonn bug aonair i gcónaí sa bhun: patrún atá i gceist go minic—éilíonn cód stór cuimhne ach ní scaoiltear í go glan, nó scaoiltear roimh am í agus baintear úsáid as níos déanaí. Is ann go díreach a bhíonn FastMM FullDebugMode thar a bheith luachmhar. Ní mar choinne mar a bheadh sé i gcónaí, ach mar uirlis dianghiniúna chun an t‑saincheist “tá rud éigin briste áit éigin sa heap” a chur ar ais i gcúis leantach indéanta.
An fhadhb: tá FullDebugMode an-tiomthaithe i dtéarmaí aschur, laghdaíonn sé feidhmíocht agus is furasta é a léirmhíniú go mícheart. Ní léiríonn tuairisc leak i gcónaí go huathoibríoch an áit ina bhfuil “an earráid”. Agus ní hé an stacktrace ach chomh maith leis an réiteach siombailí (comhad MAP, eolas dífhabhtaithe, inlining). Sa phost seo pléim an chás imeallach tipiciúil, míním an cur chuige ciallmhar agus na buaicphointí a gcaithfidh tú a sheachaint—ionas nach bhfaighidh tú ach leaks, ach go bhfágfaidh tú iad díchoigeartaithe ar bhonn buan.
Cathain a bhíonn FastMM FullDebugMode i ndáiríre úsáideach
Is minic a bhíonn FastMM mar bhainisteoir cuimhne réamhshocraithe i leaganacha nua‑aimseartha de Delphi nó bíonn sé curtha isteach i leor tionscadal cheana féin. Is cumraíocht speisialta é an FullDebugMode: cuireann sé patrúin seiceála breise ar bhlocanna cuimhne, bailíonn sé stacktraces uileochrógachta agus seiceálann sé go foréigneach ar chorruisce an heap (mar shampla sonraí bainistíochta damáiste dá bharr, mar gheall ar buffer‑overruns).
Úsáidim FullDebugMode go spriocdhírithe nuair a bhíonn ceann de na pictiúir seo le feiceáil:
- Leak atá inchúlaithe: méadaíonn tomhaltas cuimhne i rith tástála in aghaidh gach oibríochta (m.sh. in aghaidh request, in aghaidh import, in aghaidh ngníomhaíocht UI).
- AVanna sporadacha: go háirithe iad siúd a tharlaíonn “uair anseo, uair ansin” san áit chéanna (clasaiceach: use‑after‑free).
- Truailliú sa heap: teachtaireachtaí mar “Invalid pointer operation”, “Access violation in ntdll” nó crashes agus an clár ag deireadh/nuascríobh.
- Cuardach ar réaspriont: neamhchosúilacht nua tar éis refactoring, uasdátú leabharlainne nó athrú comhdéantóra.
Ní oiriúnach é FullDebugMode mar “cuirimis air in gach build”. Tá an overhead ard, athraíonn an t‑amchlár agus d’fhéadfadh sé go dtiocfadh le race‑conditions chun cinn nó go n‑aistreoidh siad. Maireannmonatóireacht éadrom (m.sh. Working Set an phróisis, Private Bytes, comhaireamh in aghaidh eachtra) níos fearr don ghnáth‑roghnúntas—is scian é FullDebugMode, ní tomhasán bun‑phiseoga.
Prionsabal bunúsach: Is comhartha é an tuairisc leak, is treoir é an stacktrace
Taispeánann tuairisc leak duit ar dtús: Tá na bloic seo fós allóctha ag deireadh an chlár. Ní hionann sin agus fadhb i gcónaí—níos lú má ba chóir go raibh na bloic sin eisfhearrtha cheana. Tá “leaks” legitimeacha ann: singletons domhanda, caches, OS‑handles le saolré próisis nó leabharlanna tríú páirtí nach ndéanann finalization go fonnmhar. Ba cheart duit na cásanna sin a aithint, ach níor chóir iad a “shocrú” gan smaoineamh.
Taispeánann an stacktrace sa tuairisc an áit ar cuireadh an bloc allóctha. Ní hamháin gurb é sin an áit a dhéanadh tú dearmad Free. I gcásanna idirthréimnithe i gcórais atá fásaithe de ghnáth:
- Allócation sa sraithe UI nó seirbhíse; ba cheart an scaoileadh a dhéanamh i sraithe níos doimhne (ownership neamhchinntithe).
- Allócation i monarcha (factory), nach mbíonn an ownership soiléir nuair a thugtar chuig an caller—smaoiníonn an caller go bhfuil sé “owned”.
- Coinnítear rudaí i líonraí (liostaí, dictionaries), ach níl samhail ownership comhsheasmhach.
- Roinn chosán eisceacht a scipeálann glantachán toisc nach bhfuil try/finally ann nó tosaíonn sé ró‑déanach.
Mar sin, is é an sreabhadh soiléir: athchruthú → leithlisiú → Stacktrace a réiteach → locht úinéireachta a aimsiú → socrú le tástáil athfhillteach. Soláthraíonn FastMM na rianta duit, ach is ortsa atá iad a aistriú isteach i ailtireacht agus i saolréanna.
FastMM FullDebugMode a chumasú go cúramach (gan fo-iarmhairtí a chur amú)
Sa chleachtas, cuirtear FullDebugMode i ngníomh tríd na roghanna FastMM agus trí chumraíocht FastMM chuí. Ní bhíonn an-tábhacht leis an gceist “cén ainm díreach atá ar an gcomhad include”, ach cad atá á dhéanamh ag an gcumraíocht agus faoi cén choinníollacha tógála a úsáideann tú í.
Coinníollacha molta don tógáil dífhabhtaithe
- DCUanna Debug agus faisnéis dhífhabhtaithe: Ní úsáideach ach amháin iad Stacktraces má tá siad inannraithe go dtí aonad/líne/seoladh fíor. Déan cinnte go gcruthaítear faisnéis dhífhabhtaithe agus go bhfuil comhad MAP ar fáil.
- Optamú a roghnú go cúramach: Ar mhaithe le léitheacht Stacktrace, is fearr de ghnáth tógáil nach bhfuil optamaithe. Is féidir inlining agus optamú dian frames an Stack a “bluráil”.
- Coinníollacha rith ama comhionanna: Úsáid sonraí, cumraíocht agus cearta chomhionanna más féidir. Tá go leor sceitheanna cuimhne ag brath ar shonraí (m.sh. formáidí annamh, cosáin eisceachtacha).
- Idirdhealú 64-bit vs. 32-bit: Iompraíocht cuimhne, ailínithe agus leabharlanna tríú páirtí difríonn. Déan dífhabhtú ar an ardán sprioc ina dtarlaíonn an fhadhb.
Pointe amháin a mhaireann riarálaithe agus ceannairí teicniúla go minic: Is féidir le FullDebugMode amanna a athrú. Má tá snáitheanna i gceist, d’fhéadfadh coinníollacha rásaí a bheith difriúil. Dá bhrí sin, tá ciall le rith chomhthreomhar gan FullDebugMode chun an athchruthú a dhearbhú amháin. Is é FullDebugMode ansin an chéim chun diagnóis a dhéanamh.
Rabhadh maidir le „ReportMemoryLeaksOnShutdown“
Delphi can über ReportMemoryLeaksOnShutdown sceitheanna a thuairisciú ag deireadh an chláir. Tá sé seo áisiúil, ach i bhfeidhmchláir chasta (seirbhísí, Plug-in Host, tréimhsí rithfhada) d’fhéadfadh sé mealladh a dhéanamh: Le linn an dhúnadh rithfidh rannóga finalization, stadfaidh snáitheanna, agus glanfar taiscí. D’fhéadfadh sceitheadh a bheadh criticiúil i lár an runtimes dul as feidhm faoi dheireadh — nó ar an taobh eile: d’fhéadfadh sceitheadh atá le feiceáil tarlú ach amháin i ndúnadh, toisc go bhfuil obair chúlra fós ag rith.
Maidir le sealgach sceitheanna atá oiriúnach don chleachtas, tá níos tábhachtaí: sceitheadh in aghaidh gach oibríochta a thomhas (m.sh. tar éis 100 iarratas), ní hamháin ag deireadh. Is féidir le FastMM cabhrú leis sin, ach caithfidh an tógáil tástála é sin a léiriú.
An cás imeallacha tipiciúil: Tuarascáil sceitheadh ag taispeáint „aon réad ar bith“, ach is í an chúis úinéireacht
Clasaic ó fheidhmchláir chorparáideacha: cruthaíonn próiseas iompórtála réad cúnta in aghaidh gach taifead (m.sh. StringLists, JSON-Parser, liostaí sealadacha). Sa Happy Path scaoiltear iad go glan. I gcásanna annamh (skip mar gheall ar fhíorú, Exception, Exit luath) fanann réad. Tar éis 10.000 taifead bíonn sé infheicthe.
FastMM FullDebugMode cabhraíonn anseo toisc go léiríonn sé an áit a ndéantar an allóacú. Ach ní hé an „réiteach“ ná „free sa áit a dhéantar an allóacú“. Is é an réiteach pátrún úinéireachta láidir:
- Ní chiallaíonn an té a chruthaíonn réad go huathoibríoch gur úinéir é.
- Caithfidh úinéireacht a bheith soiléir i gconradh an API (paraiméadair/luach fillte, doiciméadú, gnáthchleachtais ainmniúcháin).
- Caithfidh bailiúcháin a bheith shoiléir: owning vs. non-owning. Íocann foirmeacha measctha as féin.
- I gcás cosáin Exception teastaíonn try/finally go luath.
Má fheiceann tú ó Stacktrace díreach „TStringList.Create“, níl an fhaisnéis gan luach – ach ní deir sí ach: anseo cruthaítear rud éigin. Is é an cheist: cá ba chóir dó a bheith scaoilte? Agus sa chás sin, cabhraíonn smaoineamh ailtireachta níos mó ná acrobataíocht an debugger.
Stacktraces a léamh i gceart: cad is féidir leat a bhaint amach i ndáiríre as
Is liosta sheoltaí fillte ar ais de ghnáth é stacktrace ó FastMM, a mharcáiltear – le siombailí debug – ar Units, nósanna imeachta agus, más féidir, uimhreacha líne. Nuair a léann tú é, tá trí rud ríthábhachtach:
- Ní hé an barr den Stack i gcónaí an locht: is minic a bhíonn na frames uachtaracha ag Memory-Manager/RTL. Bíonn sé suimiúil nuair a thosaíonn do chód.
- Call-Chain seachas líne aonair: níl an líne ach pointe amháin. Léiríonn an slabhra cén cosán a d’iompair chuig an allóacú.
- Ilbhlocanna comhionanna: má thuairisceann FastMM roinnt leaks den méid céanna, is minic gur cosán athfhillteach é sin. Sin maith: tá in-athghiniúint agat.
Nuair nach bhfuil uimhreacha líne ann: MAP-Datei, Packages, Release-DCUs
Bíonn go leor foirne ag titim ar an bpointe seo: tá FullDebugMode gníomhach, tagann an tuairisc leak, ach in áit Unit/Líne níl ann ach seoltaí nó siombailí cryptithe. Cúiseanna tipiciúla:
- Níl comhad MAP ann nó níor ghiniodh faisnéis debug.
- Ritheann tú i gcoinne Release-DCUs nó DLLanna tríú páirtí gan siombailí.
- Úsáideann an feidhmchlár Runtime Packages: ansin tá codanna den chód i BPLanna, agus caithfidh réiteach na siombailí a bheith comhoiriúnach.
- Rinne uasmhéadú/Inlining an stacktrace níos deacra a léamh.
I bpráctis ciallaíonn sé seo: don seilg ar leaks teastaíonn build atá deartha go sonrach don dhiagnóise. Tá sé seo ina chuspóir difriúil ón „is tapúla is féidir“. Ba chóir do cheannairí teicniúla é a láimhseáil mar phróifíl build ar leith ionas nach n-athraíonn gach ball den fhoireann roghanna an tionscadail go ad-hoc.
Frames a mheas: „Suimiúil“ is minic líne amháin thuas
Sampla ón réaltacht (gan cód chustaiméara sonraíoch): Taispeánann an stacktrace duit mar chéad fráma i do chód róitín „LoadConfig“. Feiceann tú ann giniúint réada. Cuirtear Free leis, imíonn an Leak — agus go tobann buaileann sé i bpointe eile le Double Free. Cén fáth? Mar gheall go gcuireann „LoadConfig“ an réad i gcache, agus tá cosán cód eile cheana féin mar Owner agus déanann sé glanadh níos déanaí.
Ba cheart go mbeadh an léamh ceart mar seo: Taispeánann an stacktrace duit, cá bhfuil an bloc á chruthú. Bíonn an réiteach go minic sa sainmhíniú: Cé atá i seilbh an réada tar éis an Return? Má níl tú in ann an cheist seo a fhreagairt go glan, ní dhéanann tú ach an íomhá earráide a athrú (Leak → AV).
Truailliú Heap vs. Leak: Cén fáth go mbíonn FullDebugMode go minic in ann an fíor-urchóideach a aimsiú
Is minic gur fadhbanna ina dhiaidh sin iad go leor „Leaks“: scríobhann Buffer-Overrun thar Heap-Metadaten, ní féidir leis an Memory-Manager iad a scaoileadh go glan níos déanaí, agus ag an deireadh feiceann tú Leaks atá le feiceáil go randamach nó Invalid Pointer Operations. Tá FullDebugMode láidir anseo toisc go n-oibríonn sé le patrúin seicte agus go ndéanann sé fíoruithe breise ag Free/Reuse.
Tábhachtach ná an idirdhealú:
- Leak: Cuireadh bloc allóite agus níor scaoileadh é riamh. Bíonn tionchar ar chobhsaíocht de réir ama; ní gá go dtarlóidh crash láithreach.
- Use-after-free: Scaoiltear bloc ach úsáidtear é níos déanaí fós. Cruthaíonn sé AVanna sporadacha nach mbíonn éasca iad a atáirgeadh.
- Double Free: Scaoiltear an bloc faoi dhó. Is féidir leis pléascadh láithreach a chruthú nó go dtarlóidh sé níos déanaí (má rinneadh an bloc a athúsáid).
- Truailliú Heap: Scríobhann duine éigin thar teorainneacha bloc. Is minic a bhíonn na hairíonna sínte ama.
Tá FullDebugMode an-úsáideach go háirithe nuair a fheiceann tú airíonna atá sínte ama. Déanann na fíoruithe bhreise na botúin le feiceáil níos luaithe — go minic díreach ag an áit a dtarlaíonn an rochtain mhícheart, ní i nduine ar bith Free nó i nóiméad ar bith ina dhiaidh sin.
Cur chuige i dtionscadail: Seilg leak in-athathraithe in ionad „Debugging sa néal“
Má tá tú ag iarraidh leictreachtaí cuimhne a sheilg, beidh próiseas agat a bhfuil sé in-athchleachtach agus inroinnte i bhfoirne. Oibrím go minic le cré rámha diagnóisithe soiléir:
1) Athghiniúint i scénéar ina bhfuil an iompar in-athdhéanta go cruinn
Socraigh seicheamh tástála a thaispeánann an leak go muiníneach: „Tosaigh an tseirbhís, próiseáil 500 teachtaireacht, stad an tseirbhís“ nó „Oscail an fhuinneog X, déan an gníomh Y 200 uair“. Tá sé tábhachtach an seicheamh a dhoiciméadú le paraiméadair (bunachar sonraí, mandant, feature-flags) ionas gur féidir le daoine eile é a athdhéanamh.
2) Laghdú: Déan an Leak le feiceáil in aghaidh gach céime
Má mhaireann an seicheamh 20 nóiméad, roinn é. Is é an sprioc go mbeifeá in ann comparáid a dhéanamh idir „roimhe seo“ agus „i ndiaidh“ chomh tapa agus is féidir. I bhfeidhmchláir mhóra is minic gur sin an spreagadh ama is mó, ní an réiteach.
3) FullDebugMode a chasadh air agus an tuarascáil a léirmhíniú
Tá FastMM FullDebugMode i bhfeidhm anois. Bailigh na tuairiscí, grúpáil de réir mhéide an bhloic / callstack agus féach ar athrá. D’fhéadfadh bloc aonair atá fágtha a bheith ina cache dlisteanach. Bíonn 10.000 bloic chéanna beagnach i gcónaí ina sceitheadh cuimhne fíor.
4) Soilsiú úinéireachta agus socrú sa sraith cheart
Réitigh na sceitheadh san áit a shonraítear úinéireacht: Factory, conradh API, wrappaire bailiúcháin. „Schnell ein Free einbauen“ díreach in aice le Create is minic an áit mícheart má chuirtear an réad ar aghaidh.
5) Regression: gleiche Sequenz, gleicher Build, gleicher Report
Ní bhíonn an réiteach maith go dtí go ritheann an seicheamh arís agus nach dtarlóidh sceitheadh ná earráidí cuimhne nua. Go háirithe i gcás Use-after-free, níl „Leak weg“ ina chruthúnas—ní rud níos mó ná síntióm nua é.
Rioscaí tipiciúla i gcód Delphi a dhéanann FastMM le feiceáil
Bailiúcháin agus úinéireacht (liostaí, foclóirí, comhéadan)
Tagann go leor sceitheadh ní as halgartaim chasta, ach as struchtúir sonraí laethúla. Dhá shampla earráide clasaiceacha:
- Tá liosta ann le réada, ach níl a fhios ag éinne cé a scaoileann iad. Réiteach: bain úsáid as liosta úinéireachta nó iad a ghlanadh go consiasach sa finally.
- Coinníonn foclóir réada mar luachanna; nuair a dhéanann tú Remove ní scaoiltear an luach nó déanann tú dearmad air nuair a dhéanann tú Clear.
Chomh maith leis sin tá comhéadan casta: tá comhaireamh tagartha (ar nós ARC) compordach, ach d’fhéadfadh meascán le úinéireacht réada sceitheadh a chruthú i gcás tagairtí timthriallacha nó imeachtaí. Léiríonn FullDebugMode go minic an cosán allotála duit ansin, ach is minic go mbíonn an chúis ina chiorcal tagartha (A coinníonn B trí chomhéadan, B coinníonn A trí callback).
Eisceachtaí agus imeanna éalaithe luatha
I gcórais bogearraí gnó a bhfuil stair acu, bíonn eisceachtaí mar chuid den smachtú gnáth (m.sh. bailíochtú, cealú, retry). Ní bhíonn an fhadhb de ghnáth san eisceacht féin, ach sa chosán timpeall uirthi: cruthaítear réad roimh an try/finally, tagann eisceacht, agus scipeáiltear an glanadh. Soláthraíonn FullDebugMode an stacktrace den allotáil duit — agus caithfidh tú a sheiceáil an bhfuil cosán scaoilte cinnte ann.
Snáitheanna agus saolré: „Scaoileadh sa snáithe mícheart“
I VCL/FMX agus i seirbhísí le worker-threads tagann cás teorann eile i bhfeidhm: cruthaítear réad i snáithe, ach scaoiltear é sa UI-thread (nó an bealach eile timpeall), mar gheall ar rud a chur “go tapa” trí Queue/Synchronize. Is féidir leis sin oibriú, ach d’fhéadfadh sé freisin Use-after-free a chruthú má leanann an producer ar aghaidh ag obair agus scaoileann an consumer cheana féin.
Is féidir le FastMM FullDebugMode cabhrú anseo mar go ndéantar earráidí a léirítear go han-luath a bhrath. Is é an réiteach iarbhír samhail saolré shoiléir: úinéireachtaí soiléire, tarchur ach tríd sonraí immutable nó pointí aistrithe úinéireachta soiléire.
Conas tuairiscí a dhéanamh inúsáidte: scagadh, comparáid, doiciméadú
I bhfoirne, is fiú tuairiscí sceitheadh a chóireáil ní hamháin mar rud le féachaint air, ach mar chuid de dhoiciméadú oibre. Seo trí mhodh phragmatach a d’éirigh go maith:
- Baseline-Report: Staid aitheanta (m.sh. leagan táirge reatha) a reáchtáil uair amháin le FullDebugMode agus a choinneáil mar thagairt. Ansin aithníonn tú sceitheadh nua láithreach.
- Vergleich nach Use-Case: Do shruthanna oibre criticiúla (Import, Export, API-Request, UI-Massenoperation) socraigh seicheamh ghearr ar leithligh atá inathdhéanamh go rialta.
- Doiciméadaithe „sceitheadh dlisteanach“: Má fhágtar cache ar intinn gan a chríochnú, doiciméadaigh é. Mura ndéanfar, beidh duine ag lorg na n-iontrálacha céanna arís i sé mhí.
Níl sé seo rialaíocht bhurocratach, ach coigilt ama: mura ndéanann tú é, éiríonn seilg sceitheadh go tapa ina lúb shíoraí, toisc go dtagann na patrúin chéanna arís i ngach sprint.
Cathain a bhíonn an iarracht fiúntach — agus cathain ba chóir duit cur chuige difriúil a ghlacadh
Is uirlis dhiagnóiseach í FastMM FullDebugMode a bhfuil costas inti. Bíonn an iarracht níos fiúntaí go háirithe nuair a:
- Tá an fheidhmchlár ag rith ar feadh tréimhse fhada (seirbhís, cliant Terminalserver, córas oibrithe ar shifteanna, próisis 24/7).
- Próiseálann tú sreabháin sonraí custaiméara fíorúla agus nach gclúdaíonn tú gach cosán sa tástáil.
- Tá cobhsaíocht níos tábhachtaí ná luas seachadta gnéithe gearrthéarmacha (gnáth-i réitigh bogearraí atá gar don phróiseas).
Má tá cúnamh beag deisce agat a chríochnaíonn i 30 soicind, bíonn seilg sceitheadh de ghnáth ar an dara tosaíocht. Freisin: má bhíonn spíce cuimhne aonuaire agat (m.sh. onnmhairiú mór), ní bhíonn sé de ghnáth ina sceitheadh—is ceist í den straitéis sruthaithe agus den ualach buaic sa heap.
Conclúid phraiticiúil: Ní lasc é FullDebugMode, ach próiseas
FastMM FullDebugMode cuireann struchtúr ar shainaithint earráidí cuimhne: déanann sé sanntaí cuimhne infheicthe, nochtann sé truailliú an heap níos luaithe agus soláthraíonn sé tracanna stac, trína mbeidh tú in ann an chúis seachas an comhartha a shocrú. Ní hé an uirlis an t-éileamh cinntitheach ach an sreabhadh oibre: cásanna inathraithe aitheanta, builds atá oiriúnach don dhiagnóis, conarthaí úinéireachta soiléire agus athghiniúint in aghaidh bonnlíne.
Má tá tú sáite i seilg sceitheadh dian nó i earráid heap sporadach agus más mian leat an ábhar a chobhsaí go buan i gcóras Delphi, is fiú socrú diagnostach gearr, glan, le seicheamh shoiléir agus tuarascálacha inléite. Má theastaíonn uait tacaíocht le hanailís, próifílí build nó refactorú ailtireachta: Déan teagmháil leis an Net-Base Software GmbH.
Maidir leis an ábhar seo tá sé tábhachtach freisin Delphi Speicherleck Finden agus Fastmm Leak Report Lesen. Cuireann an t-alt na gnéithe seo i gcomhthéacs soiléir agus léiríonn sé cad is tábhachtach sa chleachtas laethúil.
Céim eile
Nuair a éiríonn an téama ina thionscadal iarbhír, ba cheart ailtireacht, maoin reatha agus oibríocht a mheas le chéile go luath.
Ní hamháin go dtacaímid le ceisteanna aonair, ach freisin nuair is gá ó shlisíní cód foinse, ó ábhair legacy nó ó smaointe portail tionscadal corparáideach iontaofa a fhorbairt.
- Measúnítear an staid reatha, an stát sprioc agus na rioscaí teicniúla le chéile.
- REST, rochtain ar shonraí, portaill agus Rollout, ní chuirfear iad siar mar iarmhairtí déanacha.
- Feicfidh sibh go luath cén bealach atá eacnamaíoch agus ó thaobh oibríochta inbhuanaithe.