mirror of https://github.com/AxioDL/metaforce.git
Add README.msan.md
This commit is contained in:
parent
3a0d2930fa
commit
3a26902951
|
@ -0,0 +1,57 @@
|
||||||
|
## Instrumenting URDE with MemorySanitizer
|
||||||
|
|
||||||
|
*For Linux and OpenGL only.*
|
||||||
|
|
||||||
|
To enable checking for uninitialized memory accesses with
|
||||||
|
[MemorySanitizer](https://clang.llvm.org/docs/MemorySanitizer.html), pass
|
||||||
|
`-DURDE\_MSAN=On` to the CMake command line.
|
||||||
|
URDE and boo will conditionally disable certain features when MemorySanitizer
|
||||||
|
is enabled. Audio will not be processed in order to avoid the significant
|
||||||
|
CPU expense required for mixing. Disabling audio also avoids the need to
|
||||||
|
track allocations made by PulseAudio. Additionally, DBus functionality is
|
||||||
|
disabled to avoid tracking its allocations.
|
||||||
|
|
||||||
|
MemorySanitizer ideally requires all code in the process be compiled for
|
||||||
|
instrumentation. In practice this is not easy since several system and
|
||||||
|
multimedia libraries are dynamically linked by URDE.
|
||||||
|
Two key system additions/modifications are required to successfully instrument.
|
||||||
|
|
||||||
|
### libc++
|
||||||
|
|
||||||
|
The C++ runtime has numerous instances of memory allocation. The easiest way
|
||||||
|
to ensure these are instrumented is to build libc++ and libc++abi with
|
||||||
|
MemorySanitizer enabled. Follow
|
||||||
|
[these instructions](https://github.com/google/sanitizers/wiki/MemorySanitizerBootstrappingClang)
|
||||||
|
up to the "Build libc++ and libc++abi with MemorySanitizer" step.
|
||||||
|
Once built, install them onto your system.
|
||||||
|
|
||||||
|
### Mesa
|
||||||
|
|
||||||
|
*Tested with Radeon SI only. Might work with Intel and Nouveau as well.*
|
||||||
|
|
||||||
|
There is not much to do with URDE in the absence of a graphics acceleration
|
||||||
|
library. Unfortunately, Mesa is a beast of a library that does not handle
|
||||||
|
MemorySanitizer instrumentation well. As an alternative, boo uses MSan's
|
||||||
|
API to contextually disable memory tracking when frequently-used OpenGL
|
||||||
|
functions are called.
|
||||||
|
|
||||||
|
Unfortunately, the Radeon SI driver (and probably others) spin up a work
|
||||||
|
queue thread that URDE has no visibility of. Memory allocations in this
|
||||||
|
thread will generate an unmanageable quantity of reports. Mesa has a convenient
|
||||||
|
thread entry implementing a generic work queue for drivers to make use of.
|
||||||
|
|
||||||
|
`#include <dlfcn.h>` and add the following code to the beginning of
|
||||||
|
`util_queue_thread_func` in `src/util/u_queue.c`:
|
||||||
|
```cpp
|
||||||
|
typedef void (*msan_function)(void);
|
||||||
|
msan_function func = dlsym(RTLD_NEXT, "__msan_scoped_disable_interceptor_checks");
|
||||||
|
if (!func)
|
||||||
|
func = dlsym(RTLD_DEFAULT, "__msan_scoped_disable_interceptor_checks");
|
||||||
|
if (func)
|
||||||
|
func();
|
||||||
|
```
|
||||||
|
|
||||||
|
Graphics driver processing should now be totally silent. There will likely
|
||||||
|
still be a large quantity of reports during application launch and exit,
|
||||||
|
but once the actual URDE mainloop begins processing, reports should be mostly
|
||||||
|
limited to the game code itself.
|
Loading…
Reference in New Issue