我试图在我的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) 我正在尝试使用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== …
有人能告诉我是否提升线程库泄漏.在我看来它确实如此:谷歌说我应该使用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) 我已经实现了一种压缩算法(使用霍夫曼编码),它使用节点的优先级队列(我定义的结构).现在,当我在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) 我正在使用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无法描述我的应用程序?
我正在为valgrind中的cachegrind/callgrind工具整理一个小补丁,它将使用完全通用的代码,CPU指令和缓存配置自动检测(现在只有x86/x64自动配置,而其他架构不提供CPUID类型配置为非特权代码).此代码需要完全在非特权上下文中执行,即纯用户模式代码.它还需要可以在非常不同的POSIX实现中移植,因此grokking/proc/cpuinfo不会这样做,因为我们的目标系统之一没有这样的东西.
检测CPU的频率,高速缓存的数量,它们的大小,甚至高速缓存行大小都可以使用100%通用POSIX代码完成,该代码没有任何特定于CPU的操作码(只是很多合理的假设,例如添加两个数字在一起,如果没有内存或寄存器依赖性停顿,可能会在一个周期内执行).这部分相当简单.
什么不是那么简单,为什么我问StackOverflow,是如何检测给定缓存的缓存行关联性?关联性是缓存中可以包含来自主内存的给定缓存行的位数.我可以看到可以检测到L1缓存关联性,但L2缓存?当然L1关联性会受到影响吗?
我很欣赏这可能是一个无法解决的问题.但我把它扔到StackOverflow上,并希望有人知道我不知道的事情.请注意,如果我们在这里失败,我将简单地以四方式的关联性默认值进行硬编码,假设它不会对结果产生巨大影响.
谢谢,
尼尔
我首先查找了现有的答案,并看到Valgrind是每个人最喜欢的linux上内存泄漏调试工具.不幸的是,Valgrind似乎并不适用于我的目的.我会尽力解释原因.
约束:
我需要的是相当于Microsoft的UMDH:打开每个堆分配的堆栈跟踪,然后在某个时间点转储按堆栈分组的所有分配,并按分配计数按降序排序.我们的应用程序在Windows和Linux平台上提供,因此我知道在UMDH下的Windows上的性能仍然可以容忍.
以下是我考虑的工具/方法
我错过了什么吗?是否有任何轻量级Valgrind选项或现有的LD_PRELOAD工具?
我的程序处理大错误,在开发过程中会在控制台上产生大量输出.它遭受内存损坏,我尝试使用valgrind来定位错误.
不幸的是,我无法在输出行中找到错误消息,并且当它们弹出时它们会快速刷新以取消执行.它们必须在那里才能找到错误(哪个元素确实会导致错误等等).然后在我的程序中重定向不起作用,就像管道输出只重定向程序输出,而不是valgrind输出.
你能给我一个如何解决这个问题的提示吗?
可以说我使用的是一个使用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) 我有这个代码来获取有关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) valgrind ×10
c ×4
c++ ×4
memory-leaks ×3
debugging ×2
linux ×2
boost ×1
centos ×1
cpu-cache ×1
getaddrinfo ×1
massif ×1
python ×1
qt ×1
suppression ×1
ubuntu ×1