• 2
  • 3
2014-03-30, 12:07
  #25
Medlem
Citat:
Ursprungligen postat av kinesarsle
Men nu är du ju i en situation där du ska hitta minnesbuggar. Då måste du ju ändra i koden lik förbannat. Skriv lite tester för koden så att du kan försäkra dig om att du inte förändrar det yttre beteendet. Jag antar att du har ett hum om var problemet uppstår, så testa att göra om koden till mer säker kod. Här har du en win-win-win. Lyckas du har du löst problemet. Lyckas du inte har du i alla fall konverterat koden till något bättre, och oavsett vilket har du tester som du kan använda vid framtida modifikationer.
Hej, använt spårutskrifter hela processen. Hittat några ställen, ett aber är att det nyttjas ett libb som jag inte kan kika in i.
Gjorde dessutom så att jag införde villkorad kompilering eftersom två hårdvaruplattformar var inblandade. Det löste en del av bekymren.
Urspungliga formuleringen i trådinledningen härstamnar ifrån ett uppgivet rop på hjälp, efter tre timmars googlande, flera dygns minnesluckeletande.
Valgrind ha varit guld men av olika skäl är det inte ettalternativ. Programmet anropas inte via script utan en process hanterar det under täcket. Det är en add-on kan man säga till ett befintligt system.
Citera
2014-03-30, 12:08
  #26
Medlem
Citat:
Ursprungligen postat av Morgonribba
Ett sätt du kan hitta läckorna på är om du vet hur en dator fungerar och kan tala maskinkod. Då kan du vid programmets uppstart låsa upp och patcha maskinkoden för malloc() och free() så att alla anrop dit - oavsett vem som gör dem - går till dina två rutiner istället. Du fångar alla anrop. Du behöver fånga även realloc(). Googla på intercept code för mer info.

I din malloc anropar du först vidare till originalmalloc och sedan registerar du adressen oxh längden i en hashtabell tillsammams med återhoppsadressen som finns på stacken, innan du returnerar till anroparen. För anroparen ser allt ut som vanligt - skillnaden är att din kod har gått in emellan och registrerat vilket minne som används och var/vem som allokerat varje block.

I din free gör du det omvända, anropa först free och ta sedan bort blocket ur din hashtabell.

Detta är några timmars arbete, och vitsen är att du får i din hashtabell en levande "karta" över vilka minnesblock som allokerats, och vem som allokerat dem. Då borde du kunna hitta vilka läckor som helst. Använd map-filer för att översätta en återhoppsadress till ett visst radnummer i en viss c/cpp-fil.

Ett alternativ om det är Windows (det är det ju i 93% av fallen) - är att använda HeapAlloc() som basblock, och sedan låta malloc/free jobba mot detta basblock. När jobbet är klart friställer du allt minne med HeapFree(), då försvinner alla läckor.

P.S: new/delete är bara wrappers kring malloc/free, med extra anrop av konstruktor/destruktor.
Som sagt, det finns malloc och calloc jag inte "ser". De försiggår i libbet.
Citera
2014-03-30, 12:11
  #27
Medlem
Citat:
Ursprungligen postat av kinesarsle
Men nu är du ju i en situation där du ska hitta minnesbuggar. Då måste du ju ändra i koden lik förbannat. Skriv lite tester för koden så att du kan försäkra dig om att du inte förändrar det yttre beteendet. Jag antar att du har ett hum om var problemet uppstår, så testa att göra om koden till mer säker kod. Här har du en win-win-win. Lyckas du har du löst problemet. Lyckas du inte har du i alla fall konverterat koden till något bättre, och oavsett vilket har du tester som du kan använda vid framtida modifikationer.
Nu ska jag inte förlänga tråden i onödan men problemet flyttar sig mellan olika koddelar. Vilket gör det extremt lurigt att hitta, misstänker att något kan vara snett i, ursäkta upprepningen, libbet som anropas. Eller så har en högre känslighet uppstått på grund av ny hårdvara.
Citera
2014-03-30, 15:50
  #28
Medlem
Morgonribbas avatar
Citat:
Ursprungligen postat av SvenTuba
Som sagt, det finns malloc och calloc jag inte "ser". De försiggår i libbet.

Du förstod nog inte riktigt vad jag sa: jag skrev om självmodifierande programkod som ändrar sig själv i minnet. Det spelar ingen roll vad som står i källkoderna, man ändrar programmet så att det gör vad man vill utan att ha källkoderna till malloc/free.
Citera
2014-04-01, 01:26
  #29
Medlem
Citat:
Ursprungligen postat av Morgonribba
Du förstod nog inte riktigt vad jag sa: jag skrev om självmodifierande programkod som ändrar sig själv i minnet. Det spelar ingen roll vad som står i källkoderna, man ändrar programmet så att det gör vad man vill utan att ha källkoderna till malloc/free.
Jo. Jag förstod.
Jag har inte källkod till det externa libb jag nyttjar. Som hör till en extern leverantörs programvara. Jag ropar bara på rutinen, eller rutinerna som sedan returnerar lite data.
Citera
2014-04-01, 01:29
  #30
Medlem
Citat:
Ursprungligen postat av Morgonribba
Du förstod nog inte riktigt vad jag sa: jag skrev om självmodifierande programkod som ändrar sig själv i minnet. Det spelar ingen roll vad som står i källkoderna, man ändrar programmet så att det gör vad man vill utan att ha källkoderna till malloc/free.
Förstod men läste igen. Ah. Lagra adressen, ja. Smart. Det kanske jag skulle testa. Får klura på det lite. Just ja. Det är ju ärdet på pekaren. Hm... Kunde man skriva utbara kanske... Eller hålla koll på ja. Trasslet återign är att jag troligen inte "ser" minnet i externlibbet. Men kanske kanske tillräckligt.
Citera
  • 2
  • 3

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in