在 C 程序中为 jemalloc 设置MALLOC_CONF环境变量不起作用



由于某种原因,我正在尝试使用 jemalloc 进行内存分析,由于某种原因我无法控制父进程,所以我没有在外面设置 env 变量MALLOC_CONF而是尝试在程序中设置变量,但似乎它不起作用。

我尝试将MALLOC_CONF环境设置为外部,然后启动该过程..它有效。

下面是示例程序的片段

void keep_mallocing(int count, size_t size, int **ptr) {
int i =0;
for(i=0; i<count; i++) {
ptr[i] = malloc(size);
memset(ptr[i], 0, size);
}
}
void keep_freeing(int count, int **ptr) {
int i = 0;
for(i=0; i<count; i++) {
free(ptr[i]);
}
}
void handle_sigusr1(int sig)
{
//      malloc_stats_print(NULL, NULL, "g,l,b,h,m,a");
char *path = 0;
path = getenv( "MALLOC_CONF" );
printf("path : %sn", path);
mallctl("prof.dump", NULL, NULL, NULL, 0);
return;
}
int
main(int argc, char **argv) {
signal(SIGUSR1, handle_sigusr1);
setenv("MALLOC_CONF", "prof:true,prof_prefix:jeprof.out", 1);
while(1)
{
int *ptr[10] = {0};
// count, bytes, ptr
keep_mallocing(10, 1000000, ptr);
sleep (1);
// count, ptr
keep_freeing(7, ptr);
sleep (5);
}
return 0;
}

我正在使用以下命令来编译代码(我已经尝试了静态和动态链接(

gcc -ggdb3 use_jemalloc.c -std=gnu99 -o abc /usr/local/lib/libjemalloc.a -lpthread -ldl -lm

如果我导出变量然后运行似乎可以正常工作

$ ls
abc  use_jemalloc.c
$ export MALLOC_CONF="prof:true,prof_prefix:jeprof.out"
$ ./abc &
[1] 23220
$ kill -10 `pidof abc`
path : prof:true,prof_prefix:jeprof.out
$ ls
abc  jeprof.out.23220.0.m0.heap  use_jemalloc.c

但是如果你使变量无效,然后它不会生成任何东西

$ rm jeprof.*
$ ls
abc  use_jemalloc.c
$ export MALLOC_CONF=
$ echo $MALLOC_CONF

$ ./abc &
[1] 23244
$ kill -10 `pidof abc`
path : prof:true,prof_prefix:jeprof.out
$ ls
abc  use_jemalloc.c

如果jemalloc只在启动时检查值,则可以检查是否未设置MALLOC_CONF环境变量,如果未设置,则可以设置它并重新exec以使用设置的环境变量重新启动进程:

#include <unistd.h>
#include <stdlib.h>
int main( int argc, char **argv )
{
char *envval = getenv( "MALLOC_CONF" );
if ( NULL == envval )
{
setenv( "MALLOC_CONF", "prof:true,prof_prefix:jeprof.out", 1 );
execv( argv[ 0 ], argv );
}
...
}

请注意,如果在main()之前运行的代码执行打开文件并使其保持打开状态等操作,这可能会导致问题。 这不太可能。

相关内容

  • 没有找到相关文章