Attention: Here be dragons

This is the latest (unstable) version of this documentation, which may document features not available in or compatible with released stable versions of Godot.

새니타이저 사용하기

새니타이저가 무엇입니까?

새니타이저는 전통 디버거로는 일반적으로 잡아낼 수 없는 버그를 찾는 데 도움이 되는 정적 계측 툴입니다. 이는 지속적 통합 환경에서 비트 시프트과 함께할 때 특히 유용합니다.

Sanitizer는 Clang(LLVM), GCC 또는 Visual Studio 컴파일러를 사용하여 Windows, macOS 및 Linux에서 사용할 수 있습니다. :ref:`특정 플랫폼 <doc_using_sanitizers_platform_특이적_sanitizers>`에는 자체 살균제를 사용할 수도 있습니다. 여러 다른 컴파일러에서 단일 새니타이저를 제공하는 경우 출력과 동작이 약간 다를 수 있다는 점을 기억하세요.

Godot에서 새니타이저 사용하기

Sanitizer는 바이너리를 다시 컴파일해야 **필요**합니다. 이는 공식 Godot 바이너리를 사용하여 새니타이저를 실행할 수 없음을 의미합니다.

살균제가 활성화된 상태에서 compiling <toc-devel-compiling>`을 수행하면 결과 바이너리에는 살균제가 없는 바이너리와 구별하기 위해 이름에 `.san`` 접미사가 추가됩니다.

많은 추가 런타임 검사를 수행해야 하므로 성능에 영향을 미칩니다. 메모리 활용도도 높아집니다. 단일 빌드에서 여러 살균제의 특정 조합을 활성화할 수 있습니다. 하지만 여러 개의 새니타이저를 동시에 사용할 경우 결과 바이너리가 지나치게 느려질 수 있으므로 성능에 미치는 영향에 주의하세요.

환경 변수를 사용하여 바이너리를 다시 컴파일하지 않고도 특정 옵션을 새니타이저에 전달할 수 있습니다.

주소 소독제(ASAN)

  • 다른 스크립팅 언어와 소통하기

  • 지원 플랫폼: Linux, macOS, Windows(Visual Studio), 웹

  • Clang ASAN 문서

주소 새니타이저는 일반적으로 가장 자주 사용되는 새니타이저입니다. 버퍼 오버런 및 범위를 벗어난 액세스와 같은 문제를 진단할 수 있습니다. ``free(): invalid pointer``와 같은 메시지와 함께 엔진이 충돌하는 경우 이는 일반적으로 버퍼 오버런의 결과입니다. (이 메시지는 Godot가 아닌 C 런타임에 의해 인쇄됩니다.)

특정 상황(초기화되지 않은 메모리 읽기 감지 등)에서는 주소 새니타이저만으로는 충분하지 않습니다. 대신 :ref:`doc_using_sanitizers_memory_sanitizer`를 사용해야 합니다.

Godot를 *실행*하기 전에(컴파일할 때가 아니라) ASAN_OPTIONS=detect_stack_use_after_return=1 환경 변수를 지정하여 반환 후 사용 상황을 감지하는 것도 가능합니다. 이로 인해 Address Sanitizer의 런타임 오버헤드가 증가하므로 실제로 필요할 때만 이 기능을 활성화하십시오.

Godot 빌드에서 주소 삭제 기능을 활성화하려면, 컴파일할 때 use_asan=yes SCons 옵션을 전달하세요. ASAN을 활성화하면 일반적으로 결과 바이너리가 약 2배 느려집니다.

경고

`설계 결정 <https://stackoverflow.com/questions/36971902/why-cant-clang-enable-all-sanitizers/>`__으로 인해 주소, 메모리 및 스레드 삭제 장치는 상호 배타적입니다. 이는 특정 바이너리에서 해당 살균제 중 하나만 사용할 수 있음을 의미합니다.

누수소독제(LSAN)

  • 다른 스크립팅 언어와 소통하기

  • 지원되는 플랫폼

  • Clang LSAN 문서

Leak Sanitizer는 더 이상 사용되지 않는 메모리가 실행 중인 프로그램에 의해 해제되지 않는 상황인 메모리 누수를 감지할 수 있습니다. 프로그램이 충분히 오랫동안 실행되면 잠재적으로 메모리 부족 상황이 발생할 수 있습니다. Godot는 다시 시작하지 않고도 :ref:`전용 서버 <doc_exporting_for_dedicated_servers>`에서 몇 달 또는 몇 년 동안 실행될 수 있으므로 메모리 누수가 발생할 때 수정하는 것이 중요합니다.

Godot 빌드에서 누출 제거제를 활성화하려면, 컴파일할 때 use_lsan=yes SCons 옵션을 전달하세요. LSAN을 활성화하면 성능 오버헤드가 적지만 프로그램이 종료될 때 누수 감지가 발생하므로 프로그램 종료 속도가 훨씬 느려집니다.

메모리 세정제(MSAN)

  • GCC가 아닌 Clang에서만 사용할 수 있습니다.

  • 지원되는 플랫폼

  • Clang MSAN 문서

메모리 새니타이저는 :ref:`doc_using_sanitizers_address_sanitizer`를 보완합니다. Address Sanitizer와 달리 Memory Sanitizer는 초기화되지 않은 메모리 읽기를 감지할 수 있습니다.

Godot 빌드에서 메모리 삭제기를 활성화하려면, 컴파일할 때 use_msan=yes SCons 옵션을 전달하세요. MSAN을 활성화하면 일반적으로 결과 바이너리가 약 3배 느려집니다.

경고

`설계 결정 <https://stackoverflow.com/questions/36971902/why-cant-clang-enable-all-sanitizers/>`__으로 인해 주소, 메모리 및 스레드 삭제 장치는 상호 배타적입니다. 이는 특정 바이너리에서 해당 살균제 중 하나만 사용할 수 있음을 의미합니다.

실소독제(TSAN)

  • 다른 스크립팅 언어와 소통하기

  • 지원되는 플랫폼

  • Clang TSAN 문서

스레드 새니타이저는 멀티스레딩과 관련된 경쟁 조건을 추적하는 데 사용됩니다. 경쟁 조건은 여러 스레드가 동시에 동일한 데이터를 수정하려고 시도하는 경우입니다. 스레드 스케줄링은 운영 체제에 따라 어떤 방식으로든 주문될 수 있으므로 가끔씩만 발생하는 잘못된 동작이 발생합니다(결과적으로 추적하기 어려울 수 있음). 경쟁 조건을 방지하려면 주어진 시간에 하나의 스레드만 공유 데이터에 액세스할 수 있도록 잠금을 추가해야 합니다.

Godot 빌드에서 스레드 새니타이저를 활성화하려면, 컴파일할 때 use_tsan=yes SCons 옵션을 전달하세요. TSAN을 활성화하면 일반적으로 결과 바이너리가 10배 느려지는 동시에 메모리 사용량도 약 8배 증가합니다.

경고

`설계 결정 <https://stackoverflow.com/questions/36971902/why-cant-clang-enable-all-sanitizers/>`__으로 인해 주소, 메모리 및 스레드 삭제 장치는 상호 배타적입니다. 이는 특정 바이너리에서 해당 살균제 중 하나만 사용할 수 있음을 의미합니다.

참고

Linux에서 다음 오류가 발생하는 경우:

FATAL: ThreadSanitizer: unexpected memory mapping

다음을 사용하여 시스템의 ASLR(Address Space Layout Randomization) 엔트로피를 일시적으로 낮추어야 할 수도 있습니다.

sudo sysctl vm.mmap_rnd_bits=28

또는 다음을 사용하여 완전히 비활성화하는 것이 좋습니다.

sudo sysctl kernel.randomize_va_space=0

Thread Sanitizer 사용이 완료되자마자 다음을 사용하여 ASLR 엔트로피를 높입니다.

sudo sysctl vm.mmap_rnd_bits=32

또는 다음을 사용하여 ASLR을 다시 활성화하십시오.

sudo sysctl kernel.randomize_va_space=2

머신을 재부팅하면 ASLR 상태도 기본값으로 되돌아갑니다.

ASLR 엔트로피를 낮추거나 ASLR을 완전히 비활성화하면 보안 위험이 발생할 수 있으므로 가능한 한 빨리 변경 사항을 되돌리는 것이 중요합니다.

정의되지 않은 동작 새니타이저(UBSAN)

정의되지 않은 동작 새니타이저는 프로그램이 무작위적이고 예측할 수 없는 동작을 나타내는 상황을 추적하는 데 사용됩니다. 이는 컴파일러에서 허용되지만 *정확*하지 않은 C/C++ 코드 때문입니다. 다른 최적화 세트로 컴파일하면 정의되지 않은 동작의 관찰된 결과가 변경될 수도 있습니다.

Godot 빌드에서 정의되지 않은 동작 새니타이저를 활성화하려면, 컴파일할 때 use_ubsan=yes SCons 옵션을 전달하세요. UBSAN을 활성화하면 약간의 성능 오버헤드만 발생합니다.

플랫폼 특화(Platform-specific)

:ref:`웹 <doc_compiling_for_web>`용으로 컴파일할 때 2가지 추가 소독기 SCons 옵션을 사용할 수 있습니다.

  • ``use_assertions=yes``는 다양한 문제를 포착할 수 있는 런타임 Emscripten 어설션을 활성화합니다.

  • ``use_safe_heap=yes``는 `Emscripten의 SAFE_HEAP 살균제 <https://emscripten.org/docs/debugging/Sanitizers.html>`__을 활성화합니다. ASAN과 유사한 기능을 제공하지만 WebAssembly와 관련된 문제에 중점을 둡니다. ``SAFE_HEAP``는 동일한 바이너리에서 ASAN, UBSAN과의 호환성을 보장하지 않으므로 별도로 빌드해야 할 수도 있습니다.