- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
所以我遇到了一个奇怪的问题,我希望有人能解释一下......我有以下代码:
#include <unistd.h>
#include <mcheck.h>
#include <pthread.h>
static void *run(void *args)
{
sleep(1);
return NULL;
}
int main()
{
mtrace();
pthread_t thread;
pthread_create(&thread, NULL, run, NULL);
pthread_join(thread, NULL);
return 0;
}
我编译我用这两种方式编译它:
g++ -static program.cpp -lpthread
和
g++ program.cpp -ltpthread
当我查看 mtrace 的输出时(在我的例子中是 mem.out)
当我使用 -static
选项时,我看到以下内容,mtrace
报告:
Memory Not freed:
__________________
Address Size Caller
0x085ac350 0x88 program.cpp:0
但是当我排除 -static
选项时,mtrace
报告光荣的:
No memory leaks.
关于这里发生的事情有什么想法吗?
最佳答案
这是在我的常规桌面 Linux 系统 (FC-17) 上重现它的方法:
#include <mcheck.h>
#include <pthread.h>
extern "C" { static void *run(void *) { return 0; } }
int main() {
mtrace();
pthread_t thread;
pthread_create(&thread, 0, run, 0);
pthread_join(thread, 0);
return 0;
}
使用 g++ -g -static -pthread
编译。这就是我执行它以获得 mtrace
错误的方式:
$ MALLOC_TRACE=mt.txt mtrace ./a.out mt.txt
Memory not freed:
-----------------
Address Size Caller
0x00000000011a9c90 0x110 at 0x43d7f9
我有一个 64 位系统,所以大小不匹配。当我反汇编 gdb
中的地址时,它给出了这个:
(gdb) disass 0x43d7f9
Dump of assembler code for function _dl_allocate_tls:
0x000000000043d7c0 <+0>: mov %rbx,-0x20(%rsp)
0x000000000043d7c5 <+5>: mov %rbp,-0x18(%rsp)
...
0x000000000043d7f4 <+52>: callq 0x428150 <calloc>
0x000000000043d7f9 <+57>: test %rax,%rax
0x000000000043d7fc <+60>: je 0x43d8e0 <_dl_allocate_tls+288>
...
所以它看起来像是为线程分配了一些线程本地存储。这似乎是每个线程的一次性分配,因为当我在加入后添加一个 pthread_create
调用时没有额外的分配,而当我在加入之前添加它时有一个。 _dl_allocate_tls
表明这通常是在动态链接期间调用的函数,但它似乎是在线程堆栈初始化期间调用的。通过 glibc
代码的 grep 显示它正在 allocate_stack.c
中调用。
glibc
中似乎确实有对_dl_deallocate_tls
的相应调用,所以我认为这个错误是无害的。 valgrind
不会发现任何内存泄漏。
关于c++ - g++ -static 导致内存泄漏(mtrace 报告),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12145662/
我正在使用 gnu mtrace 工具来检查 C 代码中的内存泄漏。这会生成一个难以阅读的文本文件(大概是所有动态内存操作的日志),该文件可以由也称为 mtrace 的 perl 脚本解释。 我试过使
如何启用 mtrace() (和 MALLOC_TRACE env)用于没有源的二进制程序? mtrace 是 glibc 的特性:http://www.gnu.org/s/hello/manual/
我有一个程序执行 5 个 mallocs 和 3 个 free。我在开始时调用 mtrace(),在结束时调用 muntrace()。如果我正常运行程序,mtrace 将报告丢失的释放。如果我这样做:
我正在尝试使用 mtrace 检测 Fortran 程序中的内存泄漏。我正在使用 gfortran 编译器。有关 mtrace 的(工作)C 示例,请参见维基百科条目:http://en.wikipe
当我在我的 c++ 程序中使用 mtrace 时,我得到如下输出 内存未释放: Address Size Caller 0x0804a3c8 0
我是一名 c 程序员,我是 c++ 的新手。在 c 中,我们有 mtrace() 函数来跟踪有关分配和释放内存的信息。 是否有任何类似的功能可以做到这一点,但在 c++ 中。 最佳答案 mtrace不
为什么 Linux mtrace 实用程序不跟踪通过 mmap()/munmap() 调用完成的内存分配?如何实现以及实现的挑战是什么? 我需要一个可靠的工具来跟踪我的应用程序完成的内存分配,该应用程
所以我遇到了一个奇怪的问题,我希望有人能解释一下......我有以下代码: #include #include #include static void *run(void *args) {
我正在尝试调试内存泄漏问题。我正在使用 mtrace()获取 malloc/free/realloc 跟踪。我已经运行了我的程序,现在有一个巨大的日志文件。到目前为止,一切都很好。但是我在解释文件时遇
我是一名优秀的程序员,十分优秀!