[Mono-dev] increased memory usage when embedding mono under special environment
vladimir.jovic at ifm.com
Tue Jul 4 12:39:35 UTC 2017
I am crosscompiling mono 4.4.2 for PPC platform (couldn't compile newer version, as the configuration fails).
Also, I implemented a c++ library, which executes a C# function in DLL. This library is dynamically loaded at runtime (using dlopen) by a program with very special environment. I wouldn't be surprised to hear that this program experience both stack smash and memory overwrites at the same time, but I am not in a position to pick.
Now the problem I am having is: when I use my library in a standalone program, then it works fine. But when I use my library with the program with this special environment, than it uses 40 more megabytes to do some initializations. The parameters for both programs are the same (default, as I do not set any environment variables).
The code to set the mono library is next. As you see, it is a code that can be found in any example of how to execute a c# function from a DLL.
MonoMethod* csMethodEntryPoint = NULL;
void SetMethodEntryPoint( const std::string& ifmDllsPath )
mono_config_parse( NULL );
MonoDomain* monoDomain = mono_jit_init_version( "pdm_mono_sdk", "v4.0.30319" );
const std::string assemblyName( ifmDllsPath + "/ifmApiLinuxWrapper.dll" );
MonoAssembly* assembly = mono_domain_assembly_open( monoDomain, assemblyName.c_str() );
if ( NULL == assembly )
throw std::runtime_error( "assembly is NULL" );
MonoImage* monoImage = mono_assembly_get_image( assembly );
if ( NULL == monoImage )
throw std::runtime_error( "monoImage is NULL" );
MonoClass* entityClass = mono_class_from_name( monoImage, "ifmApiLinuxWrapper", "ifmApiLinuxWrapper" );
if ( NULL == entityClass )
throw std::runtime_error( "entityClass is NULL" );
csMethodEntryPoint = mono_class_get_method_from_name( entityClass, "ApiCmdRequest", 2 );
if ( NULL == csMethodEntryPoint )
throw std::runtime_error( "entryPoint is NULL" );
The function that allocates extra memory is mono_jit_init_version(). In a standalone program, it allocates 1M, and with this special program 20M!
I said above that I lose 40M. So, 19M with mono_jit_init_version(), and extra 21M from a call to c# function.
I took a look into the mono source code for mono_jit_init_version() function, but the function is so huge, that I got lost quite quickly.
The question is how to debug this. Can I set some environment variable to help me track why extra memory is allocated?
More information about the Mono-devel-list