Look for the signal in your life, not the noise.
Canon R6 | RF 24-70 f/2.8 L | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8
Je kunt wel dit proberen:
1
| free(random()); |
maar ik betwijfel of je daar ver mee komt
Nu met Land Rover Series 3 en Defender 90
Ik had overlaatst het volgende geval in C#:
Een ActiveX component (niet door mij geschreven) opent een bestand.
1
| myActiveX.Fetch(file); |
Ik zet enkele properties op het document en geef de opdracht het ding op te slaan. De component heeft geen Close() oproep dus denk je dat die dingen impliciet gebeuren.
Vervolgens Dispose ik de ActiveX component (zie het als een oproep naar free() ).
Er blijft echter 2MB niet vrijgegeven geheugen staan.
Ik dacht: laten we dan mar iets stom proberen, het zal wel crashen maar je weet nooit.
1
| myActiveX.Fetch(null); |
Werkt het toch wel zeker...
Je moet dus om een bestand te sluiten, opgeven dat ie niets moet openen
als je pointers terugkrijgt van het programma kun je die zelf mooi vrijgeven als je ze niet meer odig hebt. Als het interne datastructuren zijn (waar jij niet aan kan) die lekken, dan heb je een klein probleem denk'k.
ASSUME makes an ASS out of U and ME
Ik heb inderdaad een functie die een pointer geeft, maar die geef ik weer vrij en dat zorgt ook niet voor problemen.HIGHGuY schreef op vrijdag 10 maart 2006 @ 10:25:
je zal moeten zoeken naar een manier om die DLL de opdracht te geven zijn geheugen te verwijderen.
Ik had overlaatst het volgende geval in C#:
Een ActiveX component (niet door mij geschreven) opent een bestand.
C#:
1 myActiveX.Fetch(file);
Ik zet enkele properties op het document en geef de opdracht het ding op te slaan. De component heeft geen Close() oproep dus denk je dat die dingen impliciet gebeuren.
Vervolgens Dispose ik de ActiveX component (zie het als een oproep naar free() ).
Er blijft echter 2MB niet vrijgegeven geheugen staan.
Ik dacht: laten we dan mar iets stom proberen, het zal wel crashen maar je weet nooit.
C#:
1 myActiveX.Fetch(null);
Werkt het toch wel zeker...
Je moet dus om een bestand te sluiten, opgeven dat ie niets moet openen
als je pointers terugkrijgt van het programma kun je die zelf mooi vrijgeven als je ze niet meer odig hebt. Als het interne datastructuren zijn (waar jij niet aan kan) die lekken, dan heb je een klein probleem denk'k.
Het is inderdaad een void functie die lekt, dus daarom kon ik ook geen oplossing vinden
Look for the signal in your life, not the noise.
Canon R6 | RF 24-70 f/2.8 L | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Is er echt geen uitweg?
Bijvoorbeeld een thread starten met JNI en hem daarin aanroepen?
Of staat het geheugen dat hij lekt daar compleet los van?
Look for the signal in your life, not the noise.
Canon R6 | RF 24-70 f/2.8 L | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8
Of misschien nog een optie is alle allocaties te enumereren voordat je zo'n functie in de DLL aanroept dmv HeapWalk(), en als de functie klaar is dat nog een keer te doen. Het verschil tussen die twee enumeraties bestaat uiteraard uit de allocaties die de functie zelf heeft gedaan en die zou je dan kunnen vrijgeven. Maar nogmaals, je weet niet wat er voor die DLL nodig is om te blijven werken en wellicht verneuk je z'n state door geheugen weg te gooien.
[ Voor 37% gewijzigd door .oisyn op 10-03-2006 12:41 ]
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Dan ben ik bang dat ik iets moet proberen als er een executable van maken en die weer aanroepen met een ander programma.
Nogal smerig, maar ik zie geen andere optie
Edit:
ik neem aan dat als je het geheugen van de dll sloopt dat hij ook niet meer geladen is?
[ Voor 23% gewijzigd door Gonadan op 10-03-2006 12:43 ]
Look for the signal in your life, not the noise.
Canon R6 | RF 24-70 f/2.8 L | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8
[ Voor 56% gewijzigd door .oisyn op 10-03-2006 12:51 ]
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
My opinions may have changed, but not the fact that I am right. -- Ashleigh Brilliant
1
2
3
4
5
6
7
8
9
| ... _declspec(dllexport) BOOL WINAPI _Init(LPSTR); ... _Init("file"); ... |
Zo dus
Maar als ik in plaats van dit bij elke aanroep LoadLibrary en FreeLibrary gebruik dan is het nog steeds geen sandboxje wat weer vrijgegeven wordt?
Look for the signal in your life, not the noise.
Canon R6 | RF 24-70 f/2.8 L | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Ja, een functie de alles afsluit. En dat is nou net degene die lektThe End schreef op vrijdag 10 maart 2006 @ 14:21:
Is er toevallig niet een andere functie in die dll om het geheugen weer vrij te geven?
Look for the signal in your life, not the noise.
Canon R6 | RF 24-70 f/2.8 L | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8
Maar hoe weet je zo zeker dat de library lekt en dat jij 'm niet verkeerd gebruikt? Als dit dezelfde library is als waar je in een paar eerdere topics ook mee bezig was, zie ik nog wel aanleiding om te geloven dat je 'm verkeerd aanroept .
Begrijpelijk.Soultaker schreef op vrijdag 10 maart 2006 @ 15:11:
Als de situatie is zoals je schetst is er inderdaad geen mooie oplossing.
Maar hoe weet je zo zeker dat de library lekt en dat jij 'm niet verkeerd gebruikt? Als dit dezelfde library is als waar je in een paar eerdere topics ook mee bezig was, zie ik nog wel aanleiding om te geloven dat je 'm verkeerd aanroept .
Maar je hebt een init, een close en een dataoproep functie.
Kan je weinig aan fout doen, en ik volg ook nog eens precies de handleiding in het gebruik van de functies.
Hij werkt in principe perfect. Totdat ik hem met JNI (of met een for-loopje) heeeeel vaak aanroep.
Ik heb nu een executable gemaakt wat in principe hetzelfde doet als die functie, maar dan is het een laagje er omheen. met Runtime.exec() roep ik die nu heeel vaak aan.
Dit lijkt foutloos te werken, het is alleen boktraag.
Look for the signal in your life, not the noise.
Canon R6 | RF 24-70 f/2.8 L | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8
1
2
3
4
5
6
7
8
| int main() { while(1) { init(); close(); } return 0; } |
Eventueel met de data-aanroep erbij. Zo ja, kun je die eens posten, samen met de relevante informatie uit de header file die je erbij hebt? (Declaraties van init/close dus, en het commentaar erbij, voor zover dat beschikbaar is.)
Wat doet de library precies en hoe werd 'ie eerder gebruikt? Het lijkt mij dat als het normaal is om enkele honderdduizenden calls te doen, jij niet de eerste bent die het opvalt als de library lekt.
[ Voor 16% gewijzigd door Soultaker op 10-03-2006 15:52 ]
ja:Soultaker schreef op vrijdag 10 maart 2006 @ 15:51:
Heb je al een test-case gebouwt die het lek demonstreert? Ik denk dan aan zoiets:
C:
1 2 3 4 5 6 7 8 int main() { while(1) { init(); close(); } return 0; }
Eventueel met de data-aanroep erbij. Zo ja, kun je die eens posten, samen met de relevante informatie uit de header file die je erbij hebt? (Declaraties van init/close dus, en het commentaar erbij, voor zover dat beschikbaar is.)
Wat doet de library precies en hoe werd 'ie eerder gebruikt? Het lijkt mij dat als het normaal is om enkele honderdduizenden calls te doen, jij niet de eerste bent die het opvalt als de library lekt.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| ... _declspec(dllexport) BOOL WINAPI _Init(LPSTR); _declspec(dllexport) void WINAPI _Close(); ... main() { int i; for (i=0; i < 100000; i++) { _Init("file"); _Close(); } return 0; } |
Dit is m'n testcase
Die executable steeds aanroepen duurt uiteindelijk bijna een half uur
Look for the signal in your life, not the noise.
Canon R6 | RF 24-70 f/2.8 L | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8
[img=http://www.web2messenger.com/smallstatus/w2m/theblasp.png]
Yup, als ik deze testcase gewoon run, dan knalt hij naar zo'n 850MB ramgebruik.TheBlasphemer schreef op vrijdag 10 maart 2006 @ 16:04:
En je weet zeker dat ook als je dus alleen die testcase doet die je net gepast hebt (dus niets anders!) dat ie ook lekt?
En dat lijkt me niet de bedoeling
Ik heb zelfs ontdekt dat als ik die _Close() weglaat dat het geheugen wel binnen de perken blijft.
[ Voor 14% gewijzigd door Gonadan op 10-03-2006 16:06 ]
Look for the signal in your life, not the noise.
Canon R6 | RF 24-70 f/2.8 L | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8
Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein
Maar ik zal het weer eens proberen met GetProcaddress
Look for the signal in your life, not the noise.
Canon R6 | RF 24-70 f/2.8 L | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8
* RobIII roept ook eens wat
There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.
Je eigen tweaker.me redirect
Over mij
Verwijderd
[ Voor 14% gewijzigd door Verwijderd op 10-03-2006 21:12 ]
Laat maar, de essentie van GetProcAddress was nou juist dat je illegale namen kon vermijden.Gonadan schreef op vrijdag 10 maart 2006 @ 20:48:
Het zijn ook niet de letterlijke namen.
Maar ik zal het weer eens proberen met GetProcaddress
Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein