我试图使用perfmon Windows实用程序来调试进程中的内存泄漏.
这就是perfmon解释这些术语的方式:
Working Set是此过程的工作集的当前大小(以字节为单位).工作集是过程中线程最近触及的一组内存页面.如果计算机中的可用内存超过阈值,则即使不使用页面,页面也会保留在进程的工作集中.当可用内存低于阈值时,将从工作集中剪裁页面.如果需要它们,它们将在离开主存储器之前被软故障返回工作集.
Virtual Bytes是进程正在使用的虚拟地址空间的当前大小(以字节为单位).使用虚拟地址空间不一定意味着相应地使用磁盘或主存储器页面.虚拟空间是有限的,并且该过程可以限制其加载库的能力.
Private Bytes是此进程分配的内存的当前大小(以字节为单位),无法与其他进程共享.
这些是我的问题:
是否应该测量私有字节,以确定进程是否有任何泄漏,因为它不涉及任何共享库,如果发生任何泄漏,将来自进程本身?
该进程消耗的总内存是多少?它是虚拟字节还是虚拟字节和工作集的总和?
私有字节,工作集和虚拟字节之间是否有任何关系?
还有其他工具可以更好地了解内存使用情况吗?
我正在尝试调试一些处理大文件的工作.代码本身有效,但.NET Runtime本身报告了偶发错误.对于上下文,这里的处理是1.5GB文件(仅加载到内存中一次)被处理并在循环中释放,故意试图重现这个不可预测的错误.
我的测试片段基本上是:
try {
byte[] data =File.ReadAllBytes(path);
for(int i = 0 ; i < 500 ; i++)
{
ProcessTheData(data); // deserialize and validate
// force collection, for tidiness
GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);
GC.WaitForPendingFinalizers();
}
} catch(Exception ex) {
Console.WriteLine(ex.Message);
// some more logging; StackTrace, recursive InnerException, etc
}
Run Code Online (Sandbox Code Playgroud)
(带有一些时间和其他东西)
循环将完全成功地处理非确定性迭代次数- 没有任何问题; 那么这个过程会突然终止.异常处理程序未被命中.测试确实涉及大量的内存使用,但它在每次迭代过程中锯齿非常好(没有明显的内存泄漏,并且我有足够的空间 - 在锯齿的最差点处有14GB未使用的主存储器) .该过程是64位.
Windows错误日志包含3个新条目,(通过退出代码80131506)建议执行引擎错误 - 一个讨厌的小动物.一个相关的答案,建议GC错误,用"修复"来禁用并发GC; 但是这个"修复"并不能解决这个问题.
澄清:这个低级错误没有触及CurrentDomain.UnhandledException事件.
澄清:GC.Collect只有监控锯齿状记忆,检查内存泄漏并保持可预测性; 删除它不会使问题消失:它只是使它在迭代之间保持更多内存,并使dmp文件更大; p
通过添加更多的控制台跟踪,我发现它在以下每个过程中出现故障:
foreach一些数据) …我在我的C++应用程序上遇到随机崩溃,它可能不会崩溃一个月,然后在一小时内崩溃10次,有时可能会在启动时崩溃,而有时可能会在运行几个小时后崩溃(或者不会崩溃)所有).
我在GNU/Linux上使用GCC,在Windows上使用MingW,因此我无法使用Visual Studio JIT Debug ...
我不知道如何继续,随机查看代码是行不通的,代码是巨大的(好的部分不是我的工作,它也有一些很多遗留的东西),我也没有有关如何重现崩溃的线索.
编辑:很多人提到......我如何制作核心转储,小型转储或其他转储?这是我第一次需要进行事后调试.
EDIT2:实际上,DrMingw捕获了一个调用堆栈,没有内存信息......不幸的是,调用堆栈对我没什么帮助,因为接近结束突然它进入了一些我没有调试信息的库(或其他东西) ,只产生一些十六进制数...所以我仍然需要一些体面的转储,提供更多的信息(特别是关于内存中的内容...具体来说,在那里给出了"访问冲突"错误的地方)
此外,我的应用程序使用Lua和Luabind,可能错误是由.lua脚本引起的,但我不知道如何调试它.
我需要一个免费工具(甚至是试用版)的建议来检测Windows下的C++内存泄漏(Visual Studio 2005).
我看过网,但我更喜欢推荐.
在我的工作中,我经常面对相当常见的编程错误 - 使用一些已经被释放的对象.这在C++中调用UB.在linux上,通常使用Valgrind工具Memcheck来解决这类问题.来自Memcheck手册:
Memcheck试图确定非法地址可能涉及的内容,因为这通常很有用.因此,如果它指向已经释放的内存块,您将被告知这一点,以及块被释放的位置.
Memcheck为我提供了调用堆栈,对象被解除分配,我可以继续调试问题.是否有类似的工具用于具有相同功能的Windows,最好是免费的?
我的目的是在Windows上Clang用作替代,以便Valgrind在我编写的C/C++程序中找到缓冲区溢出,动态内存滥用等.我已按照此处提供的说明成功构建了Clang .
我试图编译一个简单的C程序与-faddress-消毒剂选项(如指定位置)及以下的错误被抛出-
gcc.exe: error: unrecognized command line option '-faddress-sanitizer'
Using built-in specs.
COLLECT_GCC=C:/MinGW/bin/gcc.exe
Target: mingw32
Configured with: ../gcc-4.7.0/configure --enable-languages=c,c++,ada,fortran,objc,obj- c++ --disable-sjlj-exceptions --with-dwarf2 --enable-shared --enable-libgomp --disable-win32-registry --enable-libstdcxx-debug --disable-build-poststage1-with-cxx --enable-version-specific-runtime-libs --build=mingw32 --prefix=/mingw
Thread model: win32
gcc version 4.7.0 (GCC)
clang: error: assembler (via gcc) command failed with exit code 1 (use -v to see invocation)
Run Code Online (Sandbox Code Playgroud)
为什么clang(据我所知)调用GCC?当然GCC不支持-faddress-sanitizer选项.
我很高兴有可能使用这个,因为我一直试图找到一个好的(免费)替代Valgrind一段时间.有人可以帮忙吗?
我不知道在这里想些什么......
我们有一个作为服务运行的组件.它在我的本地机器上运行得非常好,但是在其他一些机器上(两台机器RAM都等于2GB),它会在第二天和连续几天开始生成bad_alloc异常.问题是该过程的内存使用量保持不变,大约为50Mb级别.另一个奇怪的事情是,通过跟踪消息,我们已经定义了从stringstream对象抛出的异常,该对象只会向流中插入不超过1-2 Kb的数据.如果重要的话,我们正在使用STL-Port.
现在,当你得到一个bad_alloc异常时,你认为这是一个内存泄漏.但是我们所有的手动分配都包含在一个智能指针中.此外,当整个过程仅使用~50Mb(内存使用量每天保持不变(并且肯定不会上升))时,我无法理解stringstream对象如何缺少内存.
我无法为您提供代码,因为项目非常大,抛出异常的部分除了创建字符串流和<<某些数据然后记录它之外别无其他功能.
所以,我的问题是......当进程只使用2GB的50Mb内存时,如何发生内存泄漏/ bad_alloc?还有什么其他的猜测可能是错的?
在此先感谢,我知道这个问题很模糊,我只是有点绝望,我尽力解释这个问题.
我在Linux中使用过valgrind.谁能告诉我一些类似的工具来检查Windows中的内存泄漏?
最近我用QT Creator开发了C++.一切都很好,我几乎正在打包和分发我的应用程序.但显然在任何发布之前,你最好确保一切正确.所以我正处于测试阶段,有些东西告诉我,我有一些轻微的内存问题.没什么大不了的,但我喜欢这些; ...).
所以我决定尝试一些内存泄漏检测库.对于初学者,我看了这个问题.由于费用原因,我无视Purify和Insure ++.其他人建议使用MSVC编译器,以便我可以使用CRT内存验证例程.我考虑过但现在决定反对,因为它会对在QT Creator中使用调试器产生影响.
然后我偶然发现了DUMA,我使用QT附带的MinGW32编译器进行编译.然而,我发现由于令人难以置信的分段错误,它在QT中并不能很好地发挥作用.我知道他们是DUMA的工作方式,但我很确定我没有像DUMA试图让我相信的那样搞砸了.
我尝试的另一件事是谷歌性能工具,我很遗憾无法使用QT提供的MinGW32版本进行编译,即使我添加了所需的依赖项.
所有这些都让我想到了一个问题:QT Creator开发人员是否有任何可行的解决方案想要检查他们的程序是否存在内存泄漏?
谢谢,
我正在研究将植绒算法应用到更大的系统中.OGRE用于渲染,luabind用于能够从LUA,yatta yatta进行通信,这些东西不应该太重要.
我基本上按雷诺'boids-model实现了算法.这意味着,一个Boid(如"群中的一条鱼")根据它在某个半径内的邻居移动.事情就是这样,它的基本复杂性是O(n²),因为如果它们在范围内,每个boid都必须检查所有它们的flockmates,然后考虑一些因素来计算自己的运动.
算法本身实现并运行顺畅.它接受所有不同尺寸的模型,它可以在2D和3D空间中工作,它很好吃,我已经有一段时间了.
我的问题是,当我在boid数字中遇到一种"障碍"时,算法会在运行时崩溃,大约200-250甚至变化.现在,如果它变得越来越慢,直到我被打破到1 fps,我就能理解,算法的简单性能就是问题所在.但是,例如,199 boids完美运行,201根本不工作并且在运行时崩溃.这对我来说非常令人惊讶.
我实现了两个类:"Swarm"和"Boid".Swarm用于保存指向swarm的所有boid的指针,但计算不多,在Boid中发生移动.
swarm.h:
#ifndef __SWARM_H__
#define __SWARM_H__
#include <vector>
#include "boid.h"
namespace Core {
class swarm {
public:
swarm();
~swarm();
bool move(float timeSinceLastFrame);
bool addBoid(boid *thisBoid);
bool removeBoidByName(std::string boidName);
bool writeAllBoidNames();
std::vector<boid*> getFlockMates();
private:
std::vector<boid*> flock;
float timePassed;
};
}
#endif
Run Code Online (Sandbox Code Playgroud)
boid.h:
#ifndef __BOID_H__
#define __BOID_H__
#include "Ogre.h"
#include <vector>
#include <stdlib.h>
namespace Core {
class swarm;
class boid {
public:
boid(Ogre::SceneNode *thisNode, Ogre::String orientation, swarm *thisSwarm); // Constructor - direkter Node-Zugriff
boid(Ogre::MovableObject *thisObject, …Run Code Online (Sandbox Code Playgroud)