Minnesläcka i 1.2.2?
Moderator: Telldus
Minnesläcka i 1.2.2?
Hej,
Jag utvecklar en mjukvara för hemautomation och vill naturligtvis stödja Tellstick. Implementeringen av Tellstick gick smärtfritt, men nu när jag börjat använda grejerna får jag problem med att Windows' växlingsfil (Page File) fylls sakta men säkert. Givetvis trodde jag att jag gjort ett misstag i implementationen men efter mycket letande kan jag bara konstatera att problemet ligger utanför min applikation, eller i varje fall inte i CLR-delen då minnesanvändningen ligger konstant.
Jag håller just nu på att skriva en testapplikation för att säkerställa ovanstående konstaterande, men vill ändå fråga ifall ni känner till några minnesproblem i v1.2.2 av Tellstick-driven, TellUsbD101.dll, samt vad skillnaderna är i version 1.2.3, den saknar versionshistorik.
Jag utvecklar en mjukvara för hemautomation och vill naturligtvis stödja Tellstick. Implementeringen av Tellstick gick smärtfritt, men nu när jag börjat använda grejerna får jag problem med att Windows' växlingsfil (Page File) fylls sakta men säkert. Givetvis trodde jag att jag gjort ett misstag i implementationen men efter mycket letande kan jag bara konstatera att problemet ligger utanför min applikation, eller i varje fall inte i CLR-delen då minnesanvändningen ligger konstant.
Jag håller just nu på att skriva en testapplikation för att säkerställa ovanstående konstaterande, men vill ändå fråga ifall ni känner till några minnesproblem i v1.2.2 av Tellstick-driven, TellUsbD101.dll, samt vad skillnaderna är i version 1.2.3, den saknar versionshistorik.
Beyond Measure - mer än bara mätning: Rita regler grafiskt, styr enheter, skapa grafer, skicka/ta emot SMS, E-mail, 1-Wire, RFXtrx, Tellstick....
-
- Site Admin
- Posts: 2243
- Joined: Fri Mar 17, 2023 9:45 am
- Location: Lund
- Contact:
Hej, testa gärna version 2.0 istället där många åtgärder för minnesläckor är fixade.
Hittar du fler där är du hemskt välkommen men en rapport på vad du hittar.
Utvecklingsinformation till 2.0 hittas här: http://developer.telldus.se/doxygen/telldus_core.html
Hittar du fler där är du hemskt välkommen men en rapport på vad du hittar.
Utvecklingsinformation till 2.0 hittas här: http://developer.telldus.se/doxygen/telldus_core.html
Micke Prag
Software
Telldus Technologies
Software
Telldus Technologies
Ok, så det finns kända minnesläckor i 1.2.3? Kanske vore en idé att skriva något om det så man får veta det
FYI, jag körde en maximalt nedslimmad applikation mot 1.2.3 under natten och den slukade glatt 112MB under 24h.
Jag ska prova 2.0, finns den färdigpaketerad? Om inte, behövs det något speciellt för att den ska fungera mot ftdchip's driver eller räcker det med att Windows har hittat stickan och sedan ladda TellUsbD101.dll?
FYI, jag körde en maximalt nedslimmad applikation mot 1.2.3 under natten och den slukade glatt 112MB under 24h.
Jag ska prova 2.0, finns den färdigpaketerad? Om inte, behövs det något speciellt för att den ska fungera mot ftdchip's driver eller räcker det med att Windows har hittat stickan och sedan ladda TellUsbD101.dll?
Beyond Measure - mer än bara mätning: Rita regler grafiskt, styr enheter, skapa grafer, skicka/ta emot SMS, E-mail, 1-Wire, RFXtrx, Tellstick....
-
- Site Admin
- Posts: 2243
- Joined: Fri Mar 17, 2023 9:45 am
- Location: Lund
- Contact:
Jag kanske är blind, vilken tråd refererar du till?
Edit: Ah - TelldusCenter, trodde först det var en egen applikation.
Edit: Ah - TelldusCenter, trodde först det var en egen applikation.
Beyond Measure - mer än bara mätning: Rita regler grafiskt, styr enheter, skapa grafer, skicka/ta emot SMS, E-mail, 1-Wire, RFXtrx, Tellstick....
Hej igen,
Nu tänker jag sticka ut hakan och framföra lite konstruktiv kritik angående det API som Tellduscore (och nuvarande dll?) exponerar.
Om det absolut är nödvändigt att lämna över minnet så är det mycket säkrare att delkarera metoden så här:
Fördelen med detta är att man för användaren/programmeraren verkligen belyser att ett överlämnande av data sker. Det är dessutom upp till användaren att allokera så mycket minne som han anser nödvändigt. Returvärdet skulle vid lyckad operation vara 0 och vid för liten buffer det antal chars som behövs för att hämta hela namnet, inklusive terminerande NULL-char samt negativa felkoder för intrerna fel. Som användare kan man då enkelt avgöra om operationen lyckades och, om man så önskar, få ut mer information om problemet.
Vidare har jag i och med mina funderingar på ovanstående insett att den exempel implementationen som finns för .Net här, samt min egen implemementation antagligen inte gör rätt när det gäller P/Invoke.
Tydligen förutsätter v2 av CLR P/Invoke att det minne som returneras som en char * ska avallokeras med Marshal.FreeCoTaskMem, vilket förutsätter att det allokerats med CoTaskMemAlloc - gissningsvis använder ni new eller malloc() för det? Tydligen fungerar det utan minnesläckr i .Net v2, men det är ju mot alla principer att inte använda rätt avallokeringsmetod; dvs new/delete, malloc/free och CoTaskMemAlloc/FreeCoTaskMem
Enligt denna tråd kommer dessutom beteendet för P/Invoke att förändras när vad det gäller avallokeringen av minnet. I v4 av .Net kommer den inte längre att anropa FreeCoTaskMem vilket slutar i ytterligare minnesläckor (egentligen är ju detta beteende bättre eftersom inte alla metoder som returnerar en char * faktiskt släpper minnet). Det är alltså bara tur att det fungerar alls.
Med ovanstående föreslagna signatur på tdGetName() blir .Net implementationen så här:
och används så här:
För att kunna vara kompatibla med både nuvarande och framtida .Net versioner men främst för att tydligt visa att ett överlämnande av data sker föreslår jag därför att ni uppdaterar era publika APIer enl. ovanstående.
Ett annat alternativ är att TelldusCore tillhandahåller ett allokerings/avallokerings gränssnitt som användare av biblioteket kan använda. Det förhindrar alla eventuella problem med allokering/avallokering då man gömmer den problematiken för användaren.
Exempel:
Båda de föreslagna lösningarna bör fungera även i ren 64-bitars miljö utan några modifikationer (givetvis måste TelldusCore kompileras som 64bit)
// Per
Nu tänker jag sticka ut hakan och framföra lite konstruktiv kritik angående det API som Tellduscore (och nuvarande dll?) exponerar.
Hur många fler funktioner som lämnar över ägandeskapet av minne finns det? (dokumentationen säger inget om detta) Utan tydlig information om detta är det ju 100% säkert att alla program som använder TelldusCore kommer att lida av minnesläckor!http://developer.telldus.se/doxygen/telldus_core.html wrote:Since telldus-core gives up the ownership of the string we must manualy free up the resource after we are done with it.
Om det absolut är nödvändigt att lämna över minnet så är det mycket säkrare att delkarera metoden så här:
Code: Select all
int tdGetName( int intDeviceId, char *buffer, int bufferSize )
Vidare har jag i och med mina funderingar på ovanstående insett att den exempel implementationen som finns för .Net här, samt min egen implemementation antagligen inte gör rätt när det gäller P/Invoke.
Tydligen förutsätter v2 av CLR P/Invoke att det minne som returneras som en char * ska avallokeras med Marshal.FreeCoTaskMem, vilket förutsätter att det allokerats med CoTaskMemAlloc - gissningsvis använder ni new eller malloc() för det? Tydligen fungerar det utan minnesläckr i .Net v2, men det är ju mot alla principer att inte använda rätt avallokeringsmetod; dvs new/delete, malloc/free och CoTaskMemAlloc/FreeCoTaskMem
Enligt denna tråd kommer dessutom beteendet för P/Invoke att förändras när vad det gäller avallokeringen av minnet. I v4 av .Net kommer den inte längre att anropa FreeCoTaskMem vilket slutar i ytterligare minnesläckor (egentligen är ju detta beteende bättre eftersom inte alla metoder som returnerar en char * faktiskt släpper minnet). Det är alltså bara tur att det fungerar alls.
Med ovanstående föreslagna signatur på tdGetName() blir .Net implementationen så här:
Code: Select all
[DllImport( "TelldusCore.dll" )]
public static extern int tdGetName( int intDeviceId, System.Text.StringBuilder sb, int bufferSize );
Code: Select all
StringBuilder sb = new StringBuilder( 50 );
int result = tdGetName( 1, sb, sb.Capacity );
Ett annat alternativ är att TelldusCore tillhandahåller ett allokerings/avallokerings gränssnitt som användare av biblioteket kan använda. Det förhindrar alla eventuella problem med allokering/avallokering då man gömmer den problematiken för användaren.
Exempel:
Code: Select all
[DllImport( "TelldusCore.dll" )]
public static extern IntPtr tdGetName( int intDeviceId );
[DllImport( "TelldusCore.dll" )]
public static extern void tdDeallocate( IntPtr data );
IntPtr data = tdGetName( 1 );
string s = Marshal.PtrToStringBSTR( data );
deallocate( data );
// Per
Beyond Measure - mer än bara mätning: Rita regler grafiskt, styr enheter, skapa grafer, skicka/ta emot SMS, E-mail, 1-Wire, RFXtrx, Tellstick....
-
- Site Admin
- Posts: 2243
- Joined: Fri Mar 17, 2023 9:45 am
- Location: Lund
- Contact:
Tack för synpunkterna. Du har givetvis rätt i dina påståenden. Vi ska titta på hur vi kan implementera detta utan att bryta API. Troligtvis får det bli dubbla funktioner för de funktioner som returnerar char *:
och även en funktion där man skickar in en buffert:
Då får man själv välja vilket sätt som passar att implementera det på.
Code: Select all
char *tdGetName(int deviceId);
void tdDeallocate(char *p);
Code: Select all
int tdGetNameInBuffert(int deviceId, char *buffert, int len);
Micke Prag
Software
Telldus Technologies
Software
Telldus Technologies
Jätte bra, jag ser fram emot ett uppdaterat API.
Beyond Measure - mer än bara mätning: Rita regler grafiskt, styr enheter, skapa grafer, skicka/ta emot SMS, E-mail, 1-Wire, RFXtrx, Tellstick....
Hej,
Har det skett några framsteg i detta område?
Har det skett några framsteg i detta område?
Beyond Measure - mer än bara mätning: Rita regler grafiskt, styr enheter, skapa grafer, skicka/ta emot SMS, E-mail, 1-Wire, RFXtrx, Tellstick....
-
- Site Admin
- Posts: 2243
- Joined: Fri Mar 17, 2023 9:45 am
- Location: Lund
- Contact:
-
- Site Admin
- Posts: 2243
- Joined: Fri Mar 17, 2023 9:45 am
- Location: Lund
- Contact:
Ok, fair enough. Någon grov tidsplan satt för den?micke.prag wrote:Detta kommer släppas först i version 2.0.1
Beyond Measure - mer än bara mätning: Rita regler grafiskt, styr enheter, skapa grafer, skicka/ta emot SMS, E-mail, 1-Wire, RFXtrx, Tellstick....
-
- Site Admin
- Posts: 2243
- Joined: Fri Mar 17, 2023 9:45 am
- Location: Lund
- Contact:
Då vi precis har släppt 2.0.0 har vi inte hunnit börja planera 2.0.1. Du kan dock följa arbetet på:
http://developer.telldus.se/milestone/2.0.1
Och specifikt för detta:
http://developer.telldus.se/ticket/66
http://developer.telldus.se/milestone/2.0.1
Och specifikt för detta:
http://developer.telldus.se/ticket/66
Micke Prag
Software
Telldus Technologies
Software
Telldus Technologies