Valgind: ненулевой код выхода, только если память определенно потеряна - PullRequest
1 голос
/ 12 марта 2019

Мы используем valgrind как часть нашего процесса CI. Если возникают проблемы с памятью, valgrind должен вернуть ненулевой код, и об этом сообщается. Вот как мы это запустили:

valgrind --error-exitcode=1 --tool=memcheck --leak-check=full \
    --errors-for-leak-kinds=definite --show-leak-kinds=definite \
    --track-origins=yes ./some_cgo_application

(...)

==25182== HEAP SUMMARY:
==25182==     in use at exit: 2,416,970 bytes in 34,296 blocks
==25182==   total heap usage: 83,979 allocs, 49,684 frees, 5,168,335 bytes allocated
==25182== 
==25182== LEAK SUMMARY:
==25182==    definitely lost: 0 bytes in 0 blocks
==25182==    indirectly lost: 0 bytes in 0 blocks
==25182==      possibly lost: 3,024 bytes in 7 blocks
==25182==    still reachable: 2,413,946 bytes in 34,289 blocks
==25182==                       of which reachable via heuristic:
==25182==                         newarray           : 520 bytes in 1 blocks
==25182==         suppressed: 0 bytes in 0 blocks
==25182== Reachable blocks (those to which a pointer was found) are not shown.
==25182== To see them, rerun with: --leak-check=full --show-leak-kinds=all
==25182== 
==25182== For counts of detected and suppressed errors, rerun with: -v
==25182== ERROR SUMMARY: 20 errors from 5 contexts (suppressed: 0 from 0)

В настоящее время нас интересует только память, definitly lost. Если никакие блоки не будут потеряны, код выхода valgrind ожидается равным нулю. Однако он возвращает 1 несмотря на опции --errors-for-leak-kinds=definite --show-leak-kinds=definite.

echo $?
1

Есть ли у вас другие варианты, которые помогут достичь желаемого результата?

1 Ответ

1 голос
/ 12 марта 2019

Я подозреваю, что состояние выхода 1 исходит от самой программы.Я могу воспроизвести это с помощью:

$ valgrind --error-exitcode=1 --tool=memcheck --leak-check=full \
  --errors-for-leak-kinds=definite --show-leak-kinds=definite \
  --track-origins=yes /bin/false

Это не похоже на то, что можно изменить в текущих источниках:

   case VgSrc_ExitProcess: /* the normal way out (Darwin) */
      /* Change the application return code to user's return code,
         if an error was found */
      if (VG_(clo_error_exitcode) > 0 
          && VG_(get_n_errs_found)() > 0) {
         VG_(client_exit)( VG_(clo_error_exitcode) );
      } else {
         /* otherwise, return the client's exit code, in the normal
            way. */
         VG_(client_exit)( VG_(threads)[tid].os_state.exitcode );
      }

И этот элемент exitcode устанавливается из *Оболочка 1008 * в coregrind/m_syswrap/syswrap-linux.c, без какой-либо настройки.

Учитывая это, я думаю, что вам лучше всего (без исправления valgrind) выбрать статус выхода, отличный от любого статуса выхода, который может использовать ваша программа,и используйте это как индикатор ошибки valgrind.

...