Vra

Dit is'n bietjie hipotetiese en erg vereenvoudigde maar...

Aanvaar'n program wat sal wees roeping funksies geskryf deur derde partye.Hierdie partye kan wees veronderstel om te wees nie-vyandige maar kan nie aanvaar word om te wees "bevoeg".Elke funksie sal neem sommige argumente, het newe-effekte en terugkeer'n waarde.Hulle het geen staat, terwyl hulle loop nie.

Die doel is om te verseker dat hulle nie kan veroorsaak dat die geheue lekkasies deur te meld alle mallocs (en dies meer) en dan bevry alles na die funksie uitgange.

Is dit moontlik?Is dit prakties?

p.s.Die belangrike deel vir my is om te verseker dat geen toekennings voortduur so maniere om te verwyder die geheue lekkasies sonder om te doen wat nie nuttig vir my.

Was dit nuttig?

Oplossing

Jy hoef nie die bedryfstelsel of omgewing spesifiseer, hierdie antwoord veronderstel Linux, glibc, en C.

Jy kan __malloc_hook, __free_hook, en __realloc_hook onderskeidelik gratis () stel om te verwys na funksies wat sal genoem word uit malloc (), realloc (), en. Daar is 'n __malloc_hook manpage wat die prototipes. Jy kan track toekennings voeg in hierdie hakies, dan terug te laat glibc hanteer die geheue toekenning / deallocation.

Dit klink asof jy wil enige lewende toekennings bevry wanneer die derde party funksie gee terug. Daar is maniere om gcc het voeg outomaties oproepe by elke funksie ingang en uitgang met behulp van -finstrument-funksies, maar ek dink dat onelegant vir wat jy probeer om te doen sou wees. Kan jy jou eie kode te bel 'n funksie in jou geheue dop biblioteek na 'n beroep een van hierdie derde party funksies? Jy kan dan kyk of daar enige toekennings wat die derde party funksie het nie reeds gratis.

Ander wenke

In die eerste plek moet jy die Entry Points vir malloc() en free() en vriende bied. Omdat hierdie kode is reeds opgestel (regs?) Jy kan nie afhanklik van #define te lei.

Dan kan jy hierdie implementeer in die hand liggende manier en teken dat hulle uit 'n sekere module het deur diegene roetines 'n skakel na daardie modules.

Die vinnigste manier behels geen meld glad nie. As die hoeveelheid geheue wat hulle gebruik is begrens, waarom nie vooraf te ken al die "hoop" hulle ooit sal nodig hê en skryf 'n allocator uit daardie? Dan wanneer dit gedoen is, vry om die hele "hoop" en jy is klaar! Jy kan hierdie idee uit te brei na verskeie hope as dit meer kompleks dat dit.

As jy regtig nodig het om te "teken" en nie jou eie allocator, hier is 'n paar idees. Een, gebruik 'n hash tafel met wysers en interne skakeling. Nog 'sou wees om ekstra ruimte toe te ken in die voorkant van elke blok en sit jou eie struktuur daar met, sê, 'n indeks in jou "log tafel," dan hou 'n gratis-lys van log tafel inskrywings (as 'n stapel so kry 'n gratis een of om 'n gratis een terug is O (1)). Dit neem meer geheue, maar vinnig moet wees.

Is dit prakties? Ek dink dit is, so lank as wat die spoed-treffer is aanvaarbaar.

Jy kan die derde funksies partytjie hardloop in 'n afsonderlike proses en sluit die proses wanneer jy klaar is met behulp van die biblioteek.

'n beter oplossing as 'n poging om aan te meld mallocs kan wees om die funksies sandbox wanneer jy noem dit-gee hulle toegang tot 'n vaste segment van geheue en dan bevry wat segment wanneer die funksie is gedoen hardloop.

Onbegrensde, onbevoeg geheue gebruik kan net so skadelik as kwaadwillige kode wees.

Kan jy nie net dwing hulle om al hulle geheue op die stapel te ken? Op hierdie manier sou word gewaarborg word bevry nadat die funksie uitgange.

In die verlede het ek 'n sagteware biblioteek in C wat 'n substelsel geheuebestuur dat die vermoë om toekennings en bevry te meld, en aan elke toekenning en gratis met die hand te pas vervat het. Dit was van 'n paar gebruik tydens 'n poging om die geheue lekkasies te vind, maar dit was moeilik en tydrowend om te gebruik. Die aantal stompe was oorweldigend, en dit het 'n uitgebreide hoeveelheid tyd om die logs verstaan.

Dit gesê, as jou derdeparty biblioteek het 'n uitgebreide toekennings, sy meer as waarskynlik onprakties om hierdie spoor via meld. As jy hardloop is in 'n Windows omgewing, sou ek raai die gebruik van 'n instrument soos suiwer [1] of BoundsChecker [2] wat moet in staat wees om lekkasies op te spoor in jou derde biblioteke party. Die belegging in die instrument moet betyds gered betaal vir homself.

[1]: http://www-01.ibm.com/ sagteware / awdtools / suiwer / reinig

[2]: http://www.compuware.com/products/devpartner /visualc.htm BoundsChecker

Aangesien jy bekommerd oor die geheue lekkasies en praat oor malloc / gratis is, ek neem aan jy is in C. Ek is ook die veronderstelling gebaseer is op jou vraag wat jy nie toegang tot die bronkode van die derde party biblioteek .

Die enigste ding wat ek kan dink is om die geheue verbruik van jou jeug voor te ondersoek en na die oproep, teken foutboodskappe as hulle verskillende en oortuig die verkoper 'n derde party aan enige lekkasies jy vind los.

As jy geld te spaar het, dan oorweeg om te suiwer om kwessies op te spoor. Dit werk wonders, en is dit nie nodig bronkode of hersamestelling. Daar is ook ander debugging malloc biblioteke beskikbaar wat goedkoper is. Elektriese heining is een naam Ek onthou. Dit gesê, die deur Denton Gentry genoem debugging hakies lyk te interessant.

As jy te arm is vir suiwer, probeer Valgrind. Dit is dit 'n baie beter as wat dit was 6 jaar gelede en 'n baie makliker om te duik in as suiwer.

Microsoft Windows bied (gebruik SUA as jy nodig het om'n POSIX), heel moontlik, die mees gevorderde hoop+(ander api bekend te gebruik die hoop) infrastruktuur van enige gestuur OS vandag.

die __malloc() debug hake en die gepaardgaande CRT debug interfaces is lekker vir gevalle waar het jy die bron-kode van die toetse, maar hulle kan dikwels mis toekennings deur die standaard biblioteke of ander kode wat gekoppel is.Dit word verwag as hulle die Visual Studio hoop ontfouting infrastruktuur.

gflags is'n baie omvattende en gedetailleerde stel van debuging vermoëns wat is ingesluit met Windows vir baie jare.Met gevorderde funksies vir die bron en binêre slegs gebruik gevalle (as dit is die OS hoop ontfouting infrastruktuur).

Dit kan teken volle stapel spore (repaginating simboliese inligting in'n post-proses operasie), van alle hoop gebruikers, vir alle hoop die wysiging van entrypoint is, in volgorde as wat nodig is.Ook, kan dit verander die hoop met pathalogical gevalle wat kan sluit die toekenning van data so dat die bladsy beskerming wat deur die VM stelsel optimaal opgedra (d. w. sken jou versoek hoop blok aan die einde van'n bladsy, sodat selfs'n singele byte oorloop is opgespoor by die tyd van die oorloop.

umdh is'n instrument wat kan help om te bepaal die status by verskeie kontrolepunte, maar die data is voortdurend opgehoopte tydens die uitvoering van die teiken o dit is nie'n eenvoudige checkpointing debug stop in die tradisionele konteks.Ook, WAARSKUWING, Laaste wat ek nagegaan word ten minste, die totale grootte van die omsendbrief buffer wat die winkel se die stapel inligting, vir elke versoek is ietwat klein (64k inskrywings (inskrywings+stapel)), so jy mag nodig wees om te stort vinnig vir swaar hoop gebruikers.Daar is ander maniere om toegang tot hierdie data, maar umdh is redelik eenvoudig.

NOTA daar is 2 modes;

  1. MODUS 1, umdh {-p:Process-id/-pn:ProcessName} [-f:Lêernaam] [-g]
  2. MODUS 2, umdh [-d] {File1} [File2] [-f:Lêernaam]

    Ek weet nie wat die waansin in die greep van die ontwikkelaar wat gekies het om te wissel tussen -p:foo argument specific en naak bestel van die argument is nie, maar dit kan'n bietjie verwarrend.

Die ontfouting sdk werk met'n aantal van die ander gereedskap, memsnap is'n instrument wat blykbaar fokus op die geheue leask en so, maar ek het nie gebruik word om dit, jou milage kan wissel.

Voer gflags met geen argumente vir die UI af, +arg en /argumente is verskillende "modes" van gebruik ook.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top