Hjälp att tolka valgrind errors

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 6953
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Hjälp att tolka valgrind errors

Inlägg av Marta »

Jag hänger inte riktigt med på vad denna felutskrift från valgrind betyder. Vad är det jag skall leta efter i min källkod?

Kod: Markera allt

[code]
==62693== Memcheck, a memory error detector
==62693== Copyright (C) 2002-2022, and GNU GPL'd, by Julian Seward et al.
==62693== Using Valgrind-3.19.0 and LibVEX; rerun with -h for copyright info
==62693== Command: ./tideq
==62693==
==62693== Invalid read of size 8
==62693== at 0x10FA55: pointer_button_handler (edwlmain.c:522)
==62693== by 0x4B67F79: ??? (in /usr/lib/x86_64-linux-gnu/libffi.so.8.1.2)
==62693== by 0x4B6740D: ??? (in /usr/lib/x86_64-linux-gnu/libffi.so.8.1.2)
==62693== by 0x4B67B0C: ffi_call (in /usr/lib/x86_64-linux-gnu/libffi.so.8.1.2)
==62693== by 0x4865760: ??? (in /usr/lib/x86_64-linux-gnu/libwayland-client.so.0.21.0)
==62693== by 0x4861AA9: ??? (in /usr/lib/x86_64-linux-gnu/libwayland-client.so.0.21.0)
==62693== by 0x486341B: wl_display_dispatch_queue_pending (in /usr/lib/x86_64-linux-gnu/libwayland-client.so.0.21.0)
==62693== by 0x486396E: wl_display_roundtrip_queue (in /usr/lib/x86_64-linux-gnu/libwayland-client.so.0.21.0)
==62693== by 0x10FF1F: main (edwlmain.c:1741)
==62693== Address 0x4dea760 is 64 bytes inside a block of size 96 free'd
==62693== at 0x484317B: free (vg_replace_malloc.c:872)
==62693== by 0x10F38C: deinitWin (edwlmain.c:1180)
==62693== by 0x10FF13: main (edwlmain.c:1740)
==62693== Block was alloc'd at
==62693== at 0x48407B4: malloc (vg_replace_malloc.c:381)
==62693== by 0x10EE15: setupWin (edwlmain.c:1066)
==62693== by 0x10FE25: main (edwlmain.c:1497)
==62693==
==62693==
==62693== HEAP SUMMARY:
==62693== in use at exit: 240 bytes in 3 blocks
==62693== total heap usage: 12,156 allocs, 12,153 frees, 4,201,227 bytes allocated
==62693==
==62693== 80 bytes in 1 blocks are still reachable in loss record 1 of 3
==62693== at 0x48455EF: calloc (vg_replace_malloc.c:1328)
==62693== by 0x48615F3: ??? (in /usr/lib/x86_64-linux-gnu/libwayland-client.so.0.21.0)
==62693== by 0x4861FD0: wl_proxy_marshal_array_flags (in /usr/lib/x86_64-linux-gnu/libwayland-client.so.0.21.0)
==62693== by 0x48622BD: wl_proxy_marshal_flags (in /usr/lib/x86_64-linux-gnu/libwayland-client.so.0.21.0)
==62693== by 0x10DE2E: wl_registry_bind (wayland-client-protocol.h:1177)
==62693== by 0x10E48B: registry_set (edwlmain.c:399)
==62693== by 0x4B67F79: ??? (in /usr/lib/x86_64-linux-gnu/libffi.so.8.1.2)
==62693== by 0x4B6740D: ??? (in /usr/lib/x86_64-linux-gnu/libffi.so.8.1.2)
==62693== by 0x4B67B0C: ffi_call (in /usr/lib/x86_64-linux-gnu/libffi.so.8.1.2)
==62693== by 0x4865760: ??? (in /usr/lib/x86_64-linux-gnu/libwayland-client.so.0.21.0)
==62693== by 0x4861AA9: ??? (in /usr/lib/x86_64-linux-gnu/libwayland-client.so.0.21.0)
==62693== by 0x486341B: wl_display_dispatch_queue_pending (in /usr/lib/x86_64-linux-gnu/libwayland-client.so.0.21.0)
==62693==
==62693== 80 bytes in 1 blocks are still reachable in loss record 2 of 3
==62693== at 0x48455EF: calloc (vg_replace_malloc.c:1328)
==62693== by 0x48615F3: ??? (in /usr/lib/x86_64-linux-gnu/libwayland-client.so.0.21.0)
==62693== by 0x4861FD0: wl_proxy_marshal_array_flags (in /usr/lib/x86_64-linux-gnu/libwayland-client.so.0.21.0)
==62693== by 0x48622BD: wl_proxy_marshal_flags (in /usr/lib/x86_64-linux-gnu/libwayland-client.so.0.21.0)
==62693== by 0x10DC56: wl_shm_pool_create_buffer (wayland-client-protocol.h:1373)
==62693== by 0x10EC27: wlSetup (edwlmain.c:1004)
==62693== by 0x10FD97: main (edwlmain.c:1463)
==62693==
==62693== 80 bytes in 1 blocks are still reachable in loss record 3 of 3
==62693== at 0x48455EF: calloc (vg_replace_malloc.c:1328)
==62693== by 0x4862FC4: wl_display_read_events (in /usr/lib/x86_64-linux-gnu/libwayland-client.so.0.21.0)
==62693== by 0x4863698: wl_display_dispatch_queue (in /usr/lib/x86_64-linux-gnu/libwayland-client.so.0.21.0)
==62693== by 0x12A43A: handle_display_data (edwlkb.c:106)
==62693== by 0x12A654: eventLoop (edwlkb.c:192)
==62693== by 0x10FEF5: main (edwlmain.c:1731)
==62693==
==62693== LEAK SUMMARY:
==62693== definitely lost: 0 bytes in 0 blocks
==62693== indirectly lost: 0 bytes in 0 blocks
==62693== possibly lost: 0 bytes in 0 blocks
==62693== still reachable: 240 bytes in 3 blocks
==62693== suppressed: 0 bytes in 0 blocks
==62693==
==62693== For lists of detected and suppressed errors, rerun with: -s
==62693== ERROR SUMMARY: 3 errors from 3 contexts (suppressed: 0 from 0)
[/code]
Användarvisningsbild
mankan
EF Sponsor
Inlägg: 908
Blev medlem: 18 juli 2015, 11:23:22
Ort: Linköping

Re: Hjälp att tolka valgrind errors

Inlägg av mankan »

Min tolkning är att du läcker 3 minnesblock och har en "use-after-free" eller möjligen att du läser utanför någon buffer.
Istf valgrind kan jag rekommendera att kompilera koden med -fsanitize-address, det finns flera trevliga sanitizers, t.ex för "undefined behavior" och trådar. Körningarna är mycket snabbare än valgrind. Nackdelen är att koden inte är samma som i release-byggen och vissa flyttalsberäkningar kan inte optimeras lika hårt och därmed kan ge annorlunda resultat.
agehall
Inlägg: 427
Blev medlem: 12 augusti 2020, 19:27:54

Re: Hjälp att tolka valgrind errors

Inlägg av agehall »

Precis - du läcker minne på tre ställen och du har en use-after-free.

Det ser ut som att två av läckorna kommer av att du inte låter din eventloop avslutas ordentligt innan du avslutar programmet och du förstör inte den shm-pool du sätter upp.

I praktiken är det tveksamt om dessa läckorna är något att bry sig om - det kommer städas upp när processen avslutas och det är ju inget som växer över tid. Men det är ju givetvis trevligt att ha en ren output från Valgrind. Use-after-free bör dock fixas. Den skulle kunna orsaka problem.
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 6953
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Re: Hjälp att tolka valgrind errors

Inlägg av Marta »

Tack för svaren, de hjälpte mig att tänka efter. Nu återstår endast en, men den hittar jag inte. Eventloopen är till allt för stor del svart magi för mig, Är med på vad epoll gör och grundstrukturen i det hela, men detaljerna är under det svarta hålets event horizon...

Det krävdes en roundtrip mellan att ta ner toplevel/xdg/wl surface och att free den struct där de fanns. Sedan hade jag missat att ta ner cursorn och shm rootobjekt.

Nu är det hyfsat tvärstopp med den sista. Förslag mottages tacksamt.

Kod: Markera allt

==64810== HEAP SUMMARY:
==64810==     in use at exit: 80 bytes in 1 blocks
==64810==   total heap usage: 12,190 allocs, 12,189 frees, 4,207,811 bytes allocated
==64810== 
==64810== 80 bytes in 1 blocks are still reachable in loss record 1 of 1
==64810==    at 0x48455EF: calloc (vg_replace_malloc.c:1328)
==64810==    by 0x4862FC4: wl_display_read_events (in /usr/lib/x86_64-linux-gnu/libwayland-client.so.0.21.0)
==64810==    by 0x4863698: wl_display_dispatch_queue (in /usr/lib/x86_64-linux-gnu/libwayland-client.so.0.21.0)
==64810==    by 0x12A594: handle_display_data (edwlevent.c:106)
==64810==    by 0x12A7BF: eventLoop (edwlevent.c:194)
==64810==    by 0x11003B: main (edwlmain.c:1760)
==64810== 
==64810== LEAK SUMMARY:
==64810==    definitely lost: 0 bytes in 0 blocks
==64810==    indirectly lost: 0 bytes in 0 blocks
==64810==      possibly lost: 0 bytes in 0 blocks
==64810==    still reachable: 80 bytes in 1 blocks
==64810==         suppressed: 0 bytes in 0 blocks
==64810== 

Kod: Markera allt

static void handle_display_data(uint events){
  struct epoll_event ep;
  int ret;

  //puts("event");

  if (events & EPOLLERR || events & EPOLLHUP){
    puts("EVENT HANDLER TILTED");
    return;
  };

  if (events & EPOLLIN){
    ret = wl_display_dispatch(display); //line 106
    if (ret == -1){
      puts("EVENT HANDLER TILTED");
      return;
    };
  };

  if (events & EPOLLOUT){
    ret = wl_display_flush(display);
    if (ret == 0){
      ep.events = EPOLLIN | EPOLLERR | EPOLLHUP;
      ep.data.ptr = &handle_display_data;;
      epoll_ctl(epollFd, EPOLL_CTL_MOD,
      displayFd, &ep);
    }else if (ret == -1 && errno != EAGAIN){
      puts("EVENT HANDLER TILTED");
      return;
    };
  };
};


void eventLoop(){

  struct epoll_event ep1;
  struct epoll_event ep2;
  struct epoll_event ep[16];
  int i, count, ret;

  epollFd = epoll_create(1);
  displayFd = wl_display_get_fd(display);
  timerFd = timerfd_create(CLOCK_MONOTONIC, TFD_CLOEXEC | TFD_NONBLOCK);
  if (timerFd<0) puts("timer fd tilted");


  ep1.events = EPOLLIN | EPOLLERR | EPOLLHUP;
  ep1.data.ptr = &handle_display_data;
  epoll_ctl(epollFd, EPOLL_CTL_ADD, displayFd, &ep1);

  ep2.events = EPOLLIN;
  ep2.data.ptr = &onKeyTimer;
  epoll_ctl(epollFd, EPOLL_CTL_ADD, timerFd, &ep2);


  while (1){

    wl_display_dispatch_pending(display);

    if (AppDown)
      break;

    ret = wl_display_flush(display);
    if (ret < 0 && errno == EAGAIN){
      ep[0].events =
              EPOLLIN | EPOLLOUT | EPOLLERR | EPOLLHUP;
      ep[0].data.ptr = &handle_display_data;

      epoll_ctl(epollFd, EPOLL_CTL_MOD,
                displayFd, &ep[0]);
    }else if (ret < 0){
      puts("EVENT HANDLER TILTED");
      break;
    };

    count = epoll_wait(epollFd, ep, 16, -1);
    for (i = 0; i < count; i++){
      ((rtnT*)ep[i].data.ptr)(ep[i].events); //line 194
    };
  };

  epoll_ctl(epollFd, EPOLL_CTL_DEL, timerFd, NULL);
  epoll_ctl(epollFd, EPOLL_CTL_DEL, displayFd, NULL);
  close(epollFd);
  close(timerFd);
};


agehall
Inlägg: 427
Blev medlem: 12 augusti 2020, 19:27:54

Re: Hjälp att tolka valgrind errors

Inlägg av agehall »

Kontrollfråga: Hur avslutar du programmet? Har du något sätt att avsluta allt? Jag tänker att ev är det så att du råkar avsluta när en buffer just allokerats och det är därför du ser den i Valgrind.

Oavsett, om det bara är en enda buffer oavsett hur länge du kör din kod så är det inte värt att jaga det - det är om du läcker mer minne över tid som du har ett riktigt problem.
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 6953
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Re: Hjälp att tolka valgrind errors

Inlägg av Marta »

Någon funktion som bara klipper av utan att ta ner allting finns inte. Det är bara vissa fel som kan ge tvärstopp, t.ex. när en allokering misslyckas.

Av någon anledning crashar Weston med segfault just när mitt program stängs. Nu blir det blank Valgrind, men ändå detta problem. Står lite på nätet om detta, så är osäker på om det är min bug eller något i Weston. Är den min vill jag givetvis ta bort den.

Kod: Markera allt

==66800== Memcheck, a memory error detector
==66800== Copyright (C) 2002-2022, and GNU GPL'd, by Julian Seward et al.
==66800== Using Valgrind-3.19.0 and LibVEX; rerun with -h for copyright info
==66800== Command: ./tideq
==66800== 
==66800==
==66800== HEAP SUMMARY:
==66800==     in use at exit: 0 bytes in 0 blocks
==66800==   total heap usage: 12,215 allocs, 12,215 frees, 4,215,003 bytes allocated
==66800== 
==66800== All heap blocks were freed -- no leaks are possible
==66800== 
==66800== For lists of detected and suppressed errors, rerun with: -s
==66800== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
Skriv svar