gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 07:44:55 30 4
gpt4 key购买 nike

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

我已经尝试在外部设置 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 : %s\n", 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() 之前运行的代码执行诸如打开文件之类的操作并让它们保持打开状态,这可能会导致问题。这不太可能。

关于c - 在 C 程序中为 jemalloc 设置 MALLOC_CONF 环境变量不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57887914/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com