小编Jan*_*ker的帖子

GNU malloc_info():获得真正分配的内存?

我正在尝试调查大型多线程服务器的内存使用情况.据mallinfo(),我得到arena=350Mfordblks=290M,这表明大部分空间实际上是浪费了里面malloc().该malloc_info()函数提供了一个很好的XML数据结构,应该是不言自明的.不过,有人可以向我解释

  • 0特别吗?是所有其他人居住的主要竞技场吗?
  • 是否<size from=.../>分配了块,免费/可用或两者兼而有之?
  • <system>元素是什么?内存分配使用mmap()/sbrk()
  • <aspace>元素是什么?有效内存?
  • 怎么样<aspace type="mprotect" .../>

只是一开始,我希望能够根据malloc()想法绘制应用程序分配的总内存,即分配但尚未释放的所有内容.

linux malloc memory-management

6
推荐指数
1
解决办法
452
查看次数

最近的Ubuntu 16.04中的JNI_CreateJavaVM()堆栈损坏

几周后,SWI-Prolog Java界面立即崩溃JNI_CreateJavaVM.好吧,在大多数机器上.它在我的一台机器上运行正常,它运行相同版本的Ubuntu和openjdk ......我把它剥离到这个小程序:

#include <jni.h>
#include <stdio.h>
#include <stdlib.h>

static JavaVM *jvm;

int
main(int argc, char **argv)
{ JavaVMInitArgs vm_args = {0};
  JNIEnv *env;
  JavaVMOption opt[8] = {0};
  int optn = 0;
  int r;

  opt[optn++].optionString = "-Djava.class.path=" "jpl.jar:.";
  opt[optn++].optionString = "-Xrs";

  vm_args.version  = JNI_VERSION_1_2;
  vm_args.nOptions = optn;
  vm_args.options  = opt;

  r = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
  fprintf(stderr, "Got %d\n", r);
  exit(0);
}
Run Code Online (Sandbox Code Playgroud)

这是使用编译的

JVM=/usr/lib/jvm/java-8-oracle
#JVM=/usr/lib/jvm/java-1.8.0-openjdk-amd64

gcc -I$JVM/include \
    -I$JVM/include/linux \
    -L$JVM/jre/lib/amd64/server \
    -L$JVM/jre/lib/amd64 \
    -g -Wall -o t t.c …
Run Code Online (Sandbox Code Playgroud)

java ubuntu java-native-interface

6
推荐指数
1
解决办法
348
查看次数

OSX stat() 和 libffi

我正在尝试使用 libffi 在 macos (10.11) 上访问 stat()。这是用于 SWI-Prolog 的新的基于 FFI 的外部接口的一部分。该接口解析<sys/stat.h>头以获取函数原型和struct stat类型。但是,我得到了虚假的值。如果我编译下面的代码并mystat从生成的.dylib.

#include <sys/stat.h>

int
mystat(const char *name, struct stat *buf)
{ return stat(name, buf);
}
Run Code Online (Sandbox Code Playgroud)

我怀疑我statdlsym(). /usr/lib/libc.dylib和都试过了/usr/lib/libSystem.B.dylib。这给出了相同的结果。如果我nm在上面的 dylib 上运行,我会得到 U _stat$INODE64. dlsym不适用于stat$INODE64. 查看 libc.dylib 我们得到

534_> nm /usr/lib/libc.dylib | grep stat
0000000000001ac5 T R8289209$_pthread_attr_setdetachstate
0000000000001af7 T R8289209$_stat
                 U _pthread_attr_setdetachstate
                 U _stat
Run Code Online (Sandbox Code Playgroud)

两者有什么关系?任何人都知道可能会发生什么?

macos dylib libffi

5
推荐指数
1
解决办法
311
查看次数

gcc-11 不正确,可能会在未初始化的情况下使用,这似乎很难避免

我发现了一种似乎完全没问题的特定使用模式,并且以前没有编译器抱怨过。现在它对 gcc-11 发出警告:下面是一个接近最小的示例。另存为t.c并使用 进行编译gcc-11 -O2 -Wall -c t.c

\n
#include <stdlib.h>\n#include <string.h>\n\nextern void f(const char *s);\n\nvoid\nt(int len, char *d)\n{ char tmp[500];\n  char *s, *o;\n  int i;\n\n  if ( len <= sizeof(tmp) )\n    s = tmp;\n  else if ( !(s=malloc(len)) )\n    return;\n\n  for(o=s,i=0; i < len; i++)\n    *o++ = d[i]+1;\n\n  f(s);\n//  i = strlen(s);\n  if ( s != tmp )\n    free(s);\n}\n\n
Run Code Online (Sandbox Code Playgroud)\n

编译结果为:

\n
gcc-11 -O2 -Wall -c t.c\nt.c: In function \xe2\x80\x98t\xe2\x80\x99:\nt.c:20:3: warning: \xe2\x80\x98s\xe2\x80\x99 may be used …
Run Code Online (Sandbox Code Playgroud)

c gcc gcc11

4
推荐指数
1
解决办法
1442
查看次数

在cmake中传递空字符串?

我正在尝试重新定义 cmake 中的函数。但是,只有这个函数的一些签名。如果我不认识签名,我只想用所有原始参数调用原始签名。这工作正常,除非函数 os 以空字符串 ( "") 作为参数调用。这个问题可以这样说明:

function(y)
  list(LENGTH ARGN len)
  message("y got ${len} elements: ${ARGN}")
endfunction()

function(x)
  list(LENGTH ARGN len)
  message("x got ${len} elements: ${ARGN}")
  y(${ARGN})
endfunction()

x(a b "")
x(a "" c)
Run Code Online (Sandbox Code Playgroud)

将以上内容保存到x.cmake并运行cmake -P x.cmake,打印

> cmake -P x.cmake
x got 3 elements: a;b;
y got 2 elements: a;b
x got 3 elements: a;;c
y got 2 elements: a;c
Run Code Online (Sandbox Code Playgroud)

即,y没有得到空字符串,并且我重新定义的函数停止工作。任何关于如何传递所有参数(包括空字符串)的线索?

真实的用例是尝试重新定义file以更改安装。您的替代方案似乎不适用于此:

function(file)
  message("Calling file(${ARGN})")
  _file("${ARGN}")
endfunction() …
Run Code Online (Sandbox Code Playgroud)

cmake

3
推荐指数
1
解决办法
3255
查看次数