mirror of
https://github.com/microsoft/mimalloc.git
synced 2024-12-28 05:50:51 +08:00
Merge branch 'dev' into dev-slice
This commit is contained in:
commit
5e09f1b051
BIN
bin/minject.exe
BIN
bin/minject.exe
Binary file not shown.
Binary file not shown.
43
bin/readme.md
Normal file
43
bin/readme.md
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
# Windows Override
|
||||||
|
|
||||||
|
<span id="override_on_windows">Dynamically overriding on mimalloc on Windows</span>
|
||||||
|
is robust and has the particular advantage to be able to redirect all malloc/free calls that go through
|
||||||
|
the (dynamic) C runtime allocator, including those from other DLL's or libraries.
|
||||||
|
As it intercepts all allocation calls on a low level, it can be used reliably
|
||||||
|
on large programs that include other 3rd party components.
|
||||||
|
There are four requirements to make the overriding work robustly:
|
||||||
|
|
||||||
|
1. Use the C-runtime library as a DLL (using the `/MD` or `/MDd` switch).
|
||||||
|
|
||||||
|
2. Link your program explicitly with `mimalloc-override.dll` library.
|
||||||
|
To ensure the `mimalloc-override.dll` is loaded at run-time it is easiest to insert some
|
||||||
|
call to the mimalloc API in the `main` function, like `mi_version()`
|
||||||
|
(or use the `/INCLUDE:mi_version` switch on the linker). See the `mimalloc-override-test` project
|
||||||
|
for an example on how to use this.
|
||||||
|
|
||||||
|
3. The `mimalloc-redirect.dll` (or `mimalloc-redirect32.dll`) must be put
|
||||||
|
in the same folder as the main `mimalloc-override.dll` at runtime (as it is a dependency of that DLL).
|
||||||
|
The redirection DLL ensures that all calls to the C runtime malloc API get redirected to
|
||||||
|
mimalloc functions (which reside in `mimalloc-override.dll`).
|
||||||
|
|
||||||
|
4. Ensure the `mimalloc-override.dll` comes as early as possible in the import
|
||||||
|
list of the final executable (so it can intercept all potential allocations).
|
||||||
|
|
||||||
|
For best performance on Windows with C++, it
|
||||||
|
is also recommended to also override the `new`/`delete` operations (by including
|
||||||
|
[`mimalloc-new-delete.h`](../include/mimalloc-new-delete.h)
|
||||||
|
a single(!) source file in your project).
|
||||||
|
|
||||||
|
The environment variable `MIMALLOC_DISABLE_REDIRECT=1` can be used to disable dynamic
|
||||||
|
overriding at run-time. Use `MIMALLOC_VERBOSE=1` to check if mimalloc was successfully redirected.
|
||||||
|
|
||||||
|
## Minject
|
||||||
|
|
||||||
|
We cannot always re-link an executable with `mimalloc-override.dll`, and similarly, we cannot always
|
||||||
|
ensure the the DLL comes first in the import table of the final executable.
|
||||||
|
In many cases though we can patch existing executables without any recompilation
|
||||||
|
if they are linked with the dynamic C runtime (`ucrtbase.dll`) -- just put the `mimalloc-override.dll`
|
||||||
|
into the import table (and put `mimalloc-redirect.dll` in the same folder)
|
||||||
|
Such patching can be done for example with [CFF Explorer](https://ntcore.com/?page_id=388).
|
||||||
|
|
||||||
|
The `minject` program can also do this from the command line, use `minject --help` for options.
|
51
readme.md
51
readme.md
@ -29,6 +29,8 @@ It also includes a robust way to override the default allocator in [Windows](#ov
|
|||||||
bounded worst-case times with reference counting).
|
bounded worst-case times with reference counting).
|
||||||
Partly due to its simplicity, mimalloc has been ported to many systems (Windows, macOS,
|
Partly due to its simplicity, mimalloc has been ported to many systems (Windows, macOS,
|
||||||
Linux, WASM, various BSD's, Haiku, MUSL, etc) and has excellent support for dynamic overriding.
|
Linux, WASM, various BSD's, Haiku, MUSL, etc) and has excellent support for dynamic overriding.
|
||||||
|
At the same time, it is an industrial strength allocator that runs (very) large scale
|
||||||
|
distributed services on thousands of machines with excellent worst case latencies.
|
||||||
- __free list sharding__: instead of one big free list (per size class) we have
|
- __free list sharding__: instead of one big free list (per size class) we have
|
||||||
many smaller lists per "mimalloc page" which reduces fragmentation and
|
many smaller lists per "mimalloc page" which reduces fragmentation and
|
||||||
increases locality --
|
increases locality --
|
||||||
@ -392,32 +394,41 @@ the [shell](https://stackoverflow.com/questions/43941322/dyld-insert-libraries-i
|
|||||||
|
|
||||||
### Dynamic Override on Windows
|
### Dynamic Override on Windows
|
||||||
|
|
||||||
<span id="override_on_windows">Overriding on Windows</span> is robust and has the
|
<span id="override_on_windows">Dynamically overriding on mimalloc on Windows</span>
|
||||||
particular advantage to be able to redirect all malloc/free calls that go through
|
is robust and has the particular advantage to be able to redirect all malloc/free calls that go through
|
||||||
the (dynamic) C runtime allocator, including those from other DLL's or libraries.
|
the (dynamic) C runtime allocator, including those from other DLL's or libraries.
|
||||||
|
As it intercepts all allocation calls on a low level, it can be used reliably
|
||||||
|
on large programs that include other 3rd party components.
|
||||||
|
There are four requirements to make the overriding work robustly:
|
||||||
|
|
||||||
The overriding on Windows requires that you link your program explicitly with
|
1. Use the C-runtime library as a DLL (using the `/MD` or `/MDd` switch).
|
||||||
the mimalloc DLL and use the C-runtime library as a DLL (using the `/MD` or `/MDd` switch).
|
2. Link your program explicitly with `mimalloc-override.dll` library.
|
||||||
Also, the `mimalloc-redirect.dll` (or `mimalloc-redirect32.dll`) must be put
|
To ensure the `mimalloc-override.dll` is loaded at run-time it is easiest to insert some
|
||||||
in the same folder as the main `mimalloc-override.dll` at runtime (as it is a dependency).
|
call to the mimalloc API in the `main` function, like `mi_version()`
|
||||||
The redirection DLL ensures that all calls to the C runtime malloc API get redirected to
|
(or use the `/INCLUDE:mi_version` switch on the linker). See the `mimalloc-override-test` project
|
||||||
mimalloc (in `mimalloc-override.dll`).
|
for an example on how to use this.
|
||||||
|
3. The [`mimalloc-redirect.dll`](bin) (or `mimalloc-redirect32.dll`) must be put
|
||||||
|
in the same folder as the main `mimalloc-override.dll` at runtime (as it is a dependency of that DLL).
|
||||||
|
The redirection DLL ensures that all calls to the C runtime malloc API get redirected to
|
||||||
|
mimalloc functions (which reside in `mimalloc-override.dll`).
|
||||||
|
4. Ensure the `mimalloc-override.dll` comes as early as possible in the import
|
||||||
|
list of the final executable (so it can intercept all potential allocations).
|
||||||
|
|
||||||
To ensure the mimalloc DLL is loaded at run-time it is easiest to insert some
|
For best performance on Windows with C++, it
|
||||||
call to the mimalloc API in the `main` function, like `mi_version()`
|
|
||||||
(or use the `/INCLUDE:mi_version` switch on the linker). See the `mimalloc-override-test` project
|
|
||||||
for an example on how to use this. For best performance on Windows with C++, it
|
|
||||||
is also recommended to also override the `new`/`delete` operations (by including
|
is also recommended to also override the `new`/`delete` operations (by including
|
||||||
[`mimalloc-new-delete.h`](https://github.com/microsoft/mimalloc/blob/master/include/mimalloc-new-delete.h) a single(!) source file in your project).
|
[`mimalloc-new-delete.h`](include/mimalloc-new-delete.h)
|
||||||
|
a single(!) source file in your project).
|
||||||
|
|
||||||
The environment variable `MIMALLOC_DISABLE_REDIRECT=1` can be used to disable dynamic
|
The environment variable `MIMALLOC_DISABLE_REDIRECT=1` can be used to disable dynamic
|
||||||
overriding at run-time. Use `MIMALLOC_VERBOSE=1` to check if mimalloc was successfully redirected.
|
overriding at run-time. Use `MIMALLOC_VERBOSE=1` to check if mimalloc was successfully redirected.
|
||||||
|
|
||||||
(Note: in principle, it is possible to even patch existing executables without any recompilation
|
We cannot always re-link an executable with `mimalloc-override.dll`, and similarly, we cannot always
|
||||||
|
ensure the the DLL comes first in the import table of the final executable.
|
||||||
|
In many cases though we can patch existing executables without any recompilation
|
||||||
if they are linked with the dynamic C runtime (`ucrtbase.dll`) -- just put the `mimalloc-override.dll`
|
if they are linked with the dynamic C runtime (`ucrtbase.dll`) -- just put the `mimalloc-override.dll`
|
||||||
into the import table (and put `mimalloc-redirect.dll` in the same folder)
|
into the import table (and put `mimalloc-redirect.dll` in the same folder)
|
||||||
Such patching can be done for example with [CFF Explorer](https://ntcore.com/?page_id=388)).
|
Such patching can be done for example with [CFF Explorer](https://ntcore.com/?page_id=388) or
|
||||||
|
the [`minject`](bin) program.
|
||||||
|
|
||||||
## Static override
|
## Static override
|
||||||
|
|
||||||
@ -439,7 +450,7 @@ This is provided by [`mimalloc-override.h`](https://github.com/microsoft/mimallo
|
|||||||
under your control or otherwise mixing of pointers from different heaps may occur!
|
under your control or otherwise mixing of pointers from different heaps may occur!
|
||||||
|
|
||||||
|
|
||||||
## Tools
|
# Tools
|
||||||
|
|
||||||
Generally, we recommend using the standard allocator with memory tracking tools, but mimalloc
|
Generally, we recommend using the standard allocator with memory tracking tools, but mimalloc
|
||||||
can also be build to support the [address sanitizer][asan] or the excellent [Valgrind] tool.
|
can also be build to support the [address sanitizer][asan] or the excellent [Valgrind] tool.
|
||||||
@ -447,7 +458,7 @@ Moreover, it can be build to support Windows event tracing ([ETW]).
|
|||||||
This has a small performance overhead but does allow detecting memory leaks and byte-precise
|
This has a small performance overhead but does allow detecting memory leaks and byte-precise
|
||||||
buffer overflows directly on final executables. See also the `test/test-wrong.c` file to test with various tools.
|
buffer overflows directly on final executables. See also the `test/test-wrong.c` file to test with various tools.
|
||||||
|
|
||||||
### Valgrind
|
## Valgrind
|
||||||
|
|
||||||
To build with [valgrind] support, use the `MI_TRACK_VALGRIND=ON` cmake option:
|
To build with [valgrind] support, use the `MI_TRACK_VALGRIND=ON` cmake option:
|
||||||
|
|
||||||
@ -481,7 +492,7 @@ Valgrind support is in its initial development -- please report any issues.
|
|||||||
[Valgrind]: https://valgrind.org/
|
[Valgrind]: https://valgrind.org/
|
||||||
[valgrind-soname]: https://valgrind.org/docs/manual/manual-core.html#opt.soname-synonyms
|
[valgrind-soname]: https://valgrind.org/docs/manual/manual-core.html#opt.soname-synonyms
|
||||||
|
|
||||||
### ASAN
|
## ASAN
|
||||||
|
|
||||||
To build with the address sanitizer, use the `-DMI_TRACK_ASAN=ON` cmake option:
|
To build with the address sanitizer, use the `-DMI_TRACK_ASAN=ON` cmake option:
|
||||||
|
|
||||||
@ -510,7 +521,7 @@ Adress sanitizer support is in its initial development -- please report any issu
|
|||||||
|
|
||||||
[asan]: https://github.com/google/sanitizers/wiki/AddressSanitizer
|
[asan]: https://github.com/google/sanitizers/wiki/AddressSanitizer
|
||||||
|
|
||||||
### ETW
|
## ETW
|
||||||
|
|
||||||
Event tracing for Windows ([ETW]) provides a high performance way to capture all allocations though
|
Event tracing for Windows ([ETW]) provides a high performance way to capture all allocations though
|
||||||
mimalloc and analyze them later. To build with ETW support, use the `-DMI_TRACK_ETW=ON` cmake option.
|
mimalloc and analyze them later. To build with ETW support, use the `-DMI_TRACK_ETW=ON` cmake option.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user