标签: valgrind

在valgrind下运行python会显示许多内存错误,这是正常的吗?

我试图在我的Python C扩展中调试内存崩溃,并尝试在valgrind下运行脚本.我发现valgrind输出中有太多的"噪音",即使我运行简单的命令:

valgrind python -c ""
Run Code Online (Sandbox Code Playgroud)

Valgrind输出完整的重复信息,如下所示:

==12317== Invalid read of size 4
==12317==    at 0x409CF59: PyObject_Free (in /usr/lib/libpython2.5.so.1.0)
==12317==    by 0x405C7C7: PyGrammar_RemoveAccelerators (in /usr/lib/libpython2.5.so.1.0)
==12317==    by 0x410A1EC: Py_Finalize (in /usr/lib/libpython2.5.so.1.0)
==12317==    by 0x4114FD1: Py_Main (in /usr/lib/libpython2.5.so.1.0)
==12317==    by 0x8048591: main (in /usr/bin/python2.5)
==12317==  Address 0x43CD010 is 7,016 bytes inside a block of size 8,208 free'd
==12317==    at 0x4022F6C: free (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so)
==12317==    by 0x4107ACC: PyArena_Free (in /usr/lib/libpython2.5.so.1.0)
==12317==    by 0x41095D7: PyRun_StringFlags (in /usr/lib/libpython2.5.so.1.0)
==12317==    by 0x40DF262: (within /usr/lib/libpython2.5.so.1.0)
==12317== …
Run Code Online (Sandbox Code Playgroud)

python debugging valgrind memory-leaks python-c-extension

17
推荐指数
2
解决办法
6516
查看次数

有人使用valgrind和Qt吗?

我正在尝试使用Qt/C++调试大型应用程序构建,而valgrind报告了内部Qt内容的大量内存泄漏.任何人都可以为Qt应用程序共享适当的valgrind抑制文件吗?

谢谢 !

例如.

#include <qobject.h>
int main()
{
  QObject o;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

收益:

$ valgrind  --leak-check=full  --show-reachable=yes  ./leak
==12655== Memcheck, a memory error detector
==12655== Copyright (C) 2002-2009, and GNU GPL'd, by Julian Seward et al.
==12655== Using Valgrind-3.5.0-Debian and LibVEX; rerun with -h for copyright info
==12655== Command: ./leak
==12655== 
==12655== 
==12655== HEAP SUMMARY:
==12655==     in use at exit: 744 bytes in 7 blocks
==12655==   total heap usage: 28 allocs, 21 frees, 1,640 bytes allocated
==12655== 
==12655== …

qt valgrind

17
推荐指数
1
解决办法
1万
查看次数

提升线程泄漏C++

有人能告诉我是否提升线程库泄漏.在我看来它确实如此:谷歌说我应该使用boost线程和pthread进行编译我正在做的和版本1.40这个问题已经修复但我仍然会泄漏.请注意,这将编译正常,但检测到泄漏.

#include <boost/thread.hpp>  
#include <boost/date_time.hpp>  

void t1(){}

int main(void){
boost::thread th1(t1);
th1.join();
return 1;
}
Run Code Online (Sandbox Code Playgroud)

使用Valgrind,我得到以下输出

HEAP SUMMARY:
==8209==     in use at exit: 8 bytes in 1 blocks
==8209==   total heap usage: 5 allocs, 4 frees, 388 bytes allocated
==8209== 
==8209== 8 bytes in 1 blocks are still reachable in loss record 1 of 1
==8209==    at 0x4024F20: malloc (vg_replace_malloc.c:236)
==8209==    by 0x4038CCB: boost::detail::get_once_per_thread_epoch() (in /usr/local/lib/libboost_thread.so.1.42.0)
==8209==    by 0x40329D4: ??? (in /usr/local/lib/libboost_thread.so.1.42.0)
==8209==    by 0x4032B26: boost::detail::get_current_thread_data() (in /usr/local/lib/libboost_thread.so.1.42.0)
==8209==    by …
Run Code Online (Sandbox Code Playgroud)

c++ multithreading boost valgrind memory-leaks

17
推荐指数
1
解决办法
2308
查看次数

Valgrind:无效读取大小4 - > sigsegv,没有valgrind和视觉工作室工作正常

我已经实现了一种压缩算法(使用霍夫曼编码),它使用节点的优先级队列(我定义的结构).现在,当我在linux或visual studio中运行代码时,一切正常.当我检查visual studio中的内存泄漏时,没有给出.

现在的问题是,当我使用valgrind分析我的程序时,它终止于信号11(sigsegv).遇到的第一个错误是方法delete min中的"无效读取大小4".之后的其他错误是:Adress是释放大小为453的块内的0字节,无效写入大小4,无效释放,删除或重新分配.

任何人都可以就我可能犯的错误给出建议吗?我一直在互联网上搜索几个小时,但找不到我做错了什么(特别是因为它在没有使用valgrind时才起作用).或者提示如何调试并找出导致读取错误的原因.

非常感谢!

这是代码,以防有人想要查看它,但我想这并不是那么容易潜入这个特定的代码.

我猜它与代码的优先级队列有关:

我做霍夫曼部分的部分 - >每次删除2个最小节点并将两者的总和作为一个节点添加.

while(queue->size > 1){
    node* n1 = delete_min(queue);
    node* n2 = delete_min(queue); // all the errors are encountered in this call
    node* temp = (node*) calloc(sizeof(node),1);
    temp->amount = n1->amount + n2->amount;
    insert_node(queue,temp);
    n1->parent = temp;
    n2->parent = temp;
    temp->left = n1;
    temp->right = n2;
}
Run Code Online (Sandbox Code Playgroud)

以下是优先级队列的delete_min和insert_node方法:

void insert_node(priority_queue* p_queue, node* x){
    int i = p_queue->size;
    if(i == 0){
        p_queue->queue = (node**) malloc(sizeof(node*));
    }
    else{
        p_queue->queue = (node**) realloc(p_queue->queue,sizeof(node*)*(p_queue->size+1));
    } …
Run Code Online (Sandbox Code Playgroud)

c valgrind memory-leaks priority-queue visual-studio-2012

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

Valgrind的massif工具不会描述我的应用程序

我正在使用CentOS存储库中的标准gcc 4.4软件包在64位CentOS 5.8上开发静态链接的64位C++应用程序.它似乎使用了比我预期更多的内存,所以我尝试使用massif来分析内存使用情况.我编译了调试信息,然后运行

valgrind --tool = massif ./MyProg

从MyProg所在的目录.除了以下massif.out.XXXX示例之外,它永远不会产生任何结果.

desc: (none)
cmd: ./MyProg
time_unit: i
#-----------
snapshot=0
#-----------
time=0
mem_heap_B=0
mem_heap_extra_B=0
mem_stacks_B=0
heap_tree=empty
Run Code Online (Sandbox Code Playgroud)

请注意,这是文件的全部内容,我的程序可以运行很多分钟.

我尝试了valgrind和massif的各种选择无济于事.我甚至尝试使用MyProg的绝对路径,以防万一.我已经尝试下载最新稳定版本的valgrind(3.8.1)并编译并运行它(因为CentOS使用3.5.0)具有相同的结果.作为一个完整性检查,我跑了

valgrind --tool = massif ls -l

并且它产生了多个快照,并且按预期使用了非零内存.

我尝试使用我能想到的每种关键字组合在线搜索,但没有发现任何类似的问题.

作为旁注,我可以使用valgrind的默认memcheck工具成功分析应用程序,以防有用信息.

有谁知道为什么massif无法描述我的应用程序?

c++ linux valgrind centos massif

17
推荐指数
1
解决办法
3500
查看次数

您将如何从用户模式代码中一般性地检测缓存行关联性?

我正在为valgrind中的cachegrind/callgrind工具整理一个小补丁,它将使用完全通用的代码,CPU指令和缓存配置自动检测(现在只有x86/x64自动配置,而其他架构不提供CPUID类型配置为非特权代码).此代码需要完全在非特权上下文中执行,即纯用户模式代码.它还需要可以在非常不同的POSIX实现中移植,因此grokking/proc/cpuinfo不会这样做,因为我们的目标系统之一没有这样的东西.

检测CPU的频率,高速缓存的数量,它们的大小,甚至高速缓存行大小都可以使用100%通用POSIX代码完成,该代码没有任何特定于CPU的操作码(只是很多合理的假设,例如添加两个数字在一起,如果没有内存或寄存器依赖性停顿,可能会在一个周期内执行).这部分相当简单.

什么不是那么简单,为什么我问StackOverflow,是如何检测给定缓存的缓存行关联性?关联性是缓存中可以包含来自主内存的给定缓存行的位数.我可以看到可以检测到L1缓存关联性,但L2缓存?当然L1关联性会受到影响吗?

我很欣赏这可能是一个无法解决的问题.但我把它扔到StackOverflow上,并希望有人知道我不知道的事情.请注意,如果我们在这里失败,我将简单地以四方式的关联性默认值进行硬编码,假设它不会对结果产生巨大影响.

谢谢,
尼尔

c valgrind cpu-architecture cpu-cache

17
推荐指数
1
解决办法
2626
查看次数

Linux上的轻量级内存泄漏调试

我首先查找了现有的答案,并看到Valgrind是每个人最喜欢的linux上内存泄漏调试工具.不幸的是,Valgrind似乎并不适用于我的目的.我会尽力解释原因.

约束:

  • 泄漏仅在客户的环境中重现.由于某些法律限制,我们必须使用现有的二进制文件.没有重建.
  • 在常规环境中,我们的应用程序消耗大约10%的CPU.说,我们可以容忍高达10倍的CPU使用量增加.使用默认memcheck 设置的Valgrind会使我们的应用程序长时间无响应.

我需要的是相当于Microsoft的UMDH:打开每个堆分配的堆栈跟踪,然后在某个时间点转储按堆栈分组的所有分配,并按分配计数按降序排序.我们的应用程序在Windows和Linux平台上提供,因此我知道在UMDH下的Windows上的性能仍然可以容忍.

以下是我考虑的工具/方法

  • Valgrind-memcheck-massif工具它们做的远远超过了需要(比如为每个分配指针扫描整个进程内存),它们太慢了,它们仍然没有完全按照我的
    需要执行(转储按计数排序的callstack) ,所以我将编写一些解析输出的脚本
  • dmalloc库(dmalloc.com)需要新的二进制文件
  • LeakTracer(http://www.andreasen.org/LeakTracer/)仅适用于C++ new/delete(我也需要malloc/free),没有逐个堆栈和排序功能
  • 使用LD_PRELOAD机制将自己实现为.so库(使用LD_PRELOAD机制覆盖'malloc')至少需要一周的时间,因为我的Linux编码技能,并且感觉就像发明了一辆自行车.

我错过了什么吗?是否有任何轻量级Valgrind选项或现有的LD_PRELOAD工具?

c c++ linux valgrind

17
推荐指数
4
解决办法
2万
查看次数

第一次出错后立即停止valgrind

我的程序处理大错误,在开发过程中会在控制台上产生大量输出.它遭受内存损坏,我尝试使用valgrind来定位错误.

不幸的是,我无法在输出行中找到错误消息,并且当它们弹出时它们会快速刷新以取消执行.它们必须在那里才能找到错误(哪个元素确实会导致错误等等).然后在我的程序中重定向不起作用,就像管道输出只重定向程序输出,而不是valgrind输出.

你能给我一个如何解决这个问题的提示吗?

debugging valgrind

16
推荐指数
4
解决办法
8425
查看次数

限制--memcheck自己的代码

可以说我使用的是一个使用glibc的库.当我通过Valgrind运行它时退出程序时,Valgrind会检测到各种内存泄漏.我100%确定没有泄漏与我刚写的几行代码明确相关.有没有办法抑制其他库的泄漏,并将泄漏检测限制为您的直接代码?

例如:

valgrind --tool=memcheck --leak-check=full --leak-resolution=high \
    --log-file=vgdump ./Main
Run Code Online (Sandbox Code Playgroud)

可执行文件是从以下源构建的:

// Include header files for application components.
#include <QtGui>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QWidget window;
    window.resize( 320,240 );
    window.setWindowTitle(
        QApplication::translate( "toplevel", "Top-level Widget" ) );
    window.show( );

    QPushButton button(                   
        QApplication::translate( "childwidget", "Press me"), &window );
    button.move( 100, 100 );
    button.show( );
    int status = app.exec();
    return status;
}
Run Code Online (Sandbox Code Playgroud)

有一个报告以下内容的日志文件(删除了大部分):

   ==12803== Memcheck, a memory error detector
   ==12803== Copyright (C) 2002-2009, and GNU GPL'd, by Julian Seward …
Run Code Online (Sandbox Code Playgroud)

valgrind suppression

16
推荐指数
1
解决办法
4153
查看次数

getaddrinfo内存泄漏

我有这个代码来获取有关IPv4地址的信息:

struct addrinfo hints, *info = NULL;
char addr4[INET_ADDRSTRLEN];

memset(&hints, 0, sizeof(hints));
hints.ai_socktype = SOCK_STREAM;
hints.ai_family = AF_INET;

if (!getaddrinfo(argv[hostPara], NULL, &hints, &info)) {
    inet_ntop(AF_INET, &((const sockaddr_in *)info->ai_addr)->sin_addr, addr4, INET_ADDRSTRLEN);
}
if (info != NULL) {
    freeaddrinfo(info);
}
Run Code Online (Sandbox Code Playgroud)

但如果我测试argv [hostPara]是"www.google.com"我从valgrind得到这个:

==3632== 168 bytes in 1 blocks are still reachable in loss record 1 of 1
==3632==    at 0x4C2B6CD: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==3632==    by 0x524B5B8: make_request (check_pf.c:249)
==3632==    by 0x524BA53: __check_pf (check_pf.c:342)
==3632==    by 0x5201134: getaddrinfo (getaddrinfo.c:2458)
==3632==    by 0x40186B: main …
Run Code Online (Sandbox Code Playgroud)

c c++ ubuntu valgrind getaddrinfo

16
推荐指数
2
解决办法
2807
查看次数