当用valgrind/callgrind运行我的程序时,我得到以下消息:
==21734== brk segment overflow in thread #1: can't grow to 0x4a39000
(使用不同的地址)
请注意,它之前没有堆栈溢出消息.
我找不到关于此消息的任何文档,我不知道究竟是什么溢出.
任何人都可以帮我弄清问题是什么?这是valgrind或我的程序的问题吗?
我过去常常用来valgrind检测Mac OS X 10.6(Snow Leopard)和10.7(Lion)上我的C/C++应用程序的内存泄漏,但我发现最近的版本如10.8(Mountain Lion)和10.9(Mavericks)不支持我升级了操作系统.是否valgrind可以在Mac OS X 10.9上安装其他类似内容?
Valgrind线程错误检测工具Helgrind的文档,可在此处找到
警告说,如果你使用GCC来编译你的OpenMP代码,GCC的OpenMP运行时库(libgomp.so)将导致混乱的数据争用的误报,因为它使用原子机器指令和Linux futex系统调用而不是POSIX pthreads原语.它告诉您,您可以通过使用--disable-linux-futex配置选项重新编译GCC来解决此问题.
所以我尝试了这个.我使用配置选项编译并安装到本地目录(〜/ GCC_Valgrind/gcc_install)一个新的GCC版本4.7.0(撰写本文时的最新版本)--disable-linux-futex.然后我创建了一个没有可见数据竞争的小型OpenMP测试程序(test1.c):
/* test1.c */
#include <omp.h>
#include <stdio.h>
#include <stdlib.h>
#define NUM_THREADS 2
int a[NUM_THREADS];
int main(void) {
int i;
#pragma omp parallel num_threads(NUM_THREADS)
{
int tid = omp_get_thread_num();
a[tid] = tid + 1;
}
for (i = 0; i < NUM_THREADS; i++)
printf("%d ", a[i]);
printf("\n");
return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)
我编译了这个程序如下
~/GCC_Valgrind/gcc_install/bin/gcc -Wall -fopenmp -static -L~/GCC_Valgrind/gcc_install/lib64 -L~/GCC_Valgrind/gcc_install/lib -o test1 test1.c
Run Code Online (Sandbox Code Playgroud)
但是,我得到了30个误报数据竞赛报告! …
我有一个可连接的pthread运行器函数,定义如下:
void *sumOfProducts(void *param)
{
...
pthread_exit(0);
}
Run Code Online (Sandbox Code Playgroud)
该线程应该加入主线程.
每当我通过Valgrind运行我的程序时,我会得到以下泄漏:
LEAK SUMMARY:
definitely lost: 0 bytes in 0 blocks
indirectly lost: 0 bytes in 0 blocks
possibly lost: 0 bytes in 0 blocks
still reachable: 968 bytes in 5 blocks
suppressed: 0 bytes in 0 blocks
ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 15 from 10)
Run Code Online (Sandbox Code Playgroud)
我检查了pthreads的手册页,其中说:
The new thread terminates in one of the following ways:
* It calls pthread_exit(3), specifying an exit status value that …Run Code Online (Sandbox Code Playgroud) 我遵循本指南:
在我下载了包之后,我运行了sh脚本,但是当我启动make install命令时,它无法创建该文件夹,因为它没有权限(即使我已经使用了该sudo命令).
此外,我尝试使用brew,但我有这个错误:
valgrind:由于上游不兼容,此公式要么不能在比El Capitan更新的macOS版本上按预期编译或运行.
错误:未满足的要求未通过此构建.
是否有任何valgrind的扩展,可以在命令窗口中使用,这将帮助我知道我的C代码中每个函数花费的时间(以秒为单位)?
谢谢=)
我有一个流程x,我想检查泄漏valgrind.问题在于x运行y,y反过来运行z.我不能x独立运行因为y并z设置环境x,例如环境变量,命令行开关,所需的文件x等.
valgrind继续运行z但是要跟踪它找到的任何叉子并报告它们吗? valgrind跟踪任何问题,但只报告名为的进程x吗? valgrind附加已经运行的进程,我可以用gdb做的方式吗?我不知道这是否重要,但我在SuSE64 linux和valgrind-2.4.0下运行.
谢谢!
就在几天前,我开始研究一个名为check的单元测试框架,我打算在Linux下运行c代码测试.
现在检查一些设计良好的代码和一些测试代码可以帮助我验证基本功能是否正确,我的意思是很容易看到变量和响应然后决定一个函数是否正确.
但是,假设我想测试一个动态内存结构,其中包含很多关于malloc和free的内容结构,事实证明我可以将数据放入并再次获取正确的数据.但这并不能证明我在这个过程中没有打破一些记忆,让我说我忘了释放一半的记忆并丢失指针(一个经典的memleak).该代码可能会通过大部分单元测试.
所以现在问题是:用Valgrind运行整个单元测试代码并让他检测出任何malloc/free问题是一个好主意吗?(或者可能像电围栏一样编译?)
感觉这是一个好主意,但我不确定我是怎么进入这里的......
谢谢约翰
更新:感谢道格拉斯和乔纳森,看起来这是一个好主意,我应该继续:-)
更新: Valgrind是一个有趣的工具,但我发现这样做的第一个memleaks是在测试框架而不是我自己的代码(虽然非常有趣).因此,在将自己的代码颠倒之前,向其余部分提示将验证您使用的单元测试框架是否没有泄漏.在我的案例中只需要一个空的测试用例,因为那时只有单元测试框架正在运行.
我可以将Valgrind memcheck的输出"可能丢失"视为"绝对丢失"吗?
可能丢失或"可疑":找到指向块内部的指针.指针可能最初指向开头并且已经移动,或者它可能完全不相关.Memcheck认为这样的块是"可疑的",因为不清楚它的指针是否仍然存在.
绝对丢失或"泄露":最糟糕的结果是没有找到指向该块的指针.该块被归类为"泄露",因为程序员不可能在程序退出时释放它,因为没有指向它的指针.这可能是在程序的某些早期点丢失指针的症状
我知道Valgrind,但它只是检测内存管理问题.我正在搜索的是一个工具,它给了我一个概述,我的程序的哪些部分确实消耗了多少内存.使用例如树图(如KCachegrind为Callgrind所做的)的图形表示将是很酷的.
我正在使用Linux机器,因此Windows工具对我没有多大帮助.