Почему valgrind говорит, что основная программа SDL пропускает память?

Это просто означает, что он наследует непосредственно из класса Object. Здесь больше о наследовании в Java.

21
задан Christian 4 January 2010 в 02:22
поделиться

3 ответа

Даже для базовой программы OpenGL "hello world" без полной SDL, Valgrind выдает подобные предупреждения глубоко внутри библиотек OpenGL. Это странно, но я предположил

  • Реализующие библиотеки знают, что они делают (вероятно, предварительно разместив несколько небольших статических буферов, которые они никогда не беспокоятся освободить),
  • Даже если они этого не делают, это одноразовая утечка, которая будет восстановлена операционной системой, когда программа завершится,

и не потеряла много сна из-за этого.

23
ответ дан 29 November 2019 в 05:43
поделиться

Это нормально для графической библиотеки API (OpenGL, Вулкан, и т.д.) и API работы с окнами (X11, SDL, и т.д.). Этот наилучший вариант состоит в том, чтобы использовать valgrind файлы подавления для игнорирования этих ошибок.

Вот то, как сделать это с Linux, SDL & OpenGL:

Скажем, программу, которую Вы отлаживаете, называют, 'prog.out' (не забудьте заменять prog.out подлинным именем Вашей программы),

можно экспортировать информацию о подавлении как это:

valgrind --leak-check=full --show-reachable=yes --show-leak-kinds=all --error-limit=no --gen-suppressions=all --log-file=supdata.log ./prog.out

можно теперь извлечь информацию о подавлении из 'supdata.log' с помощью сценария или вручную. Можно использовать подстановочные знаки ('* ', '... ') для создания подавлений более универсальными (таким образом, не имеющий необходимость обновить файл подавления каждый раз, когда Вы обновляете свой код).

После этого, каждый раз, когда Вы отлаживаете свою программу, Вы включали бы файл подавления с этого времени. Например, я сделал файл подавления ниже 'linux_sdl_gl.sup'. Это работает хорошо на меня при разработке использующий SDL и OpenGL на Linux. Это игнорирует весь OpenGL, SDL и X11, созданный по ошибкам так, чтобы я мог легко найти ошибки, которые я создаю. Не стесняйтесь использовать его в своей разработке.

, Когда я отлаживаю свой код, я использую следующий вызов для valgrind. Это позволяет мне находить любые новые системные ошибки, которые, возможно, пропустил мой файл подавления.

valgrind --gen-suppressions=all --suppressions=./linux_sdl_gl.sup --leak-check=full --show-leak-kinds=all ./prog.out

файл: linux_sdl_gl.sup

# Copyright (c) <'2019'> <'Alrick Grandison'>

# This software is provided 'as-is', without any express or implied
# warranty. In no event will the authors be held liable for any damages
# arising from the use of this software.

# Permission is granted to anyone to use this software for any purpose,
# including commercial applications, and to alter it and redistribute it
# freely, subject to the following restrictions:

# 1. The origin of this software must not be misrepresented; you must not
#    claim that you wrote the original software. If you use this software
#    in a product, an acknowledgment in the product documentation would be
#    appreciated but is not required.
# 2. Altered source versions must be plainly marked as such, and must not be
#    misrepresented as being the original software.
# 3. This notice may not be removed or altered from any source distribution.

{
   opengl_memcpy_addr8
   Memcheck:Addr8
   fun:memcpy@GLIBC*
   obj:/usr/lib/x86_64-linux-gnu/dri/*_dri.so
   ...
}

{
   opengl_memcpy_addr1
   Memcheck:Addr1
   fun:memcpy@GLIBC*
   obj:/usr/lib/x86_64-linux-gnu/dri/*_dri.so
   ...
}

{
   opengl_memset_addr8
   Memcheck:Addr8
   fun:memset
   obj:/usr/lib/x86_64-linux-gnu/dri/*_dri.so
   ...
}

{
   sdl_leak_reachable
   Memcheck:Leak
   match-leak-kinds: reachable
   ...
   fun:SDL_Init_REAL
   ...
}

{
   x11_leak_reachable
   Memcheck:Leak
   match-leak-kinds: reachable
   ...
   obj:/usr/lib/x86_64-linux-gnu/libX11.so.*
   ...
}

{
   sdl_leak_indirect
   Memcheck:Leak
   match-leak-kinds: indirect
   ...
   fun:SDL_Init_REAL
   ...
}

{
  sdl_leak_definite
   Memcheck:Leak
   match-leak-kinds: definite
   ...
   fun:SDL_Init_REAL
   ...
}

# OpenGL Calls DL under the Hood - Taken straight out of Valgrind --gen-suppressions
# Could overlap with non-graphics DL api calls
# But, If you are not using DL directly, then don't worry about this
{
   dl_leak_reachable
   Memcheck:Leak
   match-leak-kinds: reachable
   ...
   fun:dlopen@@GLIBC*
   ...
}

# Same as above but more generic
# Could overlap with non-graphics DL api calls
# But, If you are not using DL directly, then don't worry about this
{
   dl_leak_reachable
   Memcheck:Leak
   match-leak-kinds: reachable
   ...
   fun:_dl_*
   ...
}

{
   x11_leak_indirect
   Memcheck:Leak
   match-leak-kinds: indirect
   ...
   obj:/usr/lib/x86_64-linux-gnu/libX11.so.*
   ...
}

{
   x11_leak_definite
   Memcheck:Leak
   match-leak-kinds: definite
   ...
   obj:/usr/lib/x86_64-linux-gnu/libX11.so.*
   ...
}

{
   x11_leak_possible
   Memcheck:Leak
   match-leak-kinds: possible
   ...
   obj:/usr/lib/x86_64-linux-gnu/libX11.so.*
   ...
}

{
   opengl_leak_reachable
   Memcheck:Leak
   match-leak-kinds: reachable
   ...
   obj:/usr/lib/x86_64-linux-gnu/libGLX.so.*
   ...
}

github: valgrind код подавления

1
ответ дан 29 November 2019 в 05:43
поделиться

Одиночки практически всегда являются "утечкой" со стандартными реализациями. Обычно это нормально, так как обычно не хочется разгружать консоль для таких вещей, как печать

.
-6
ответ дан 29 November 2019 в 05:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: