2010-02-17 94 views
4

对于在我们手动重新启动计算机之前永不退出的性能分析应用程序,我有一个疑问。分析基于C或C++的应用程序永不退出

我使用了像valgrind这样的工具来讨论内存泄漏或在某个时间之后退出的任何应用程序的膨胀。

但是,如果可能的话,是否有任何工具可以用于告知内存消耗,膨胀,应用程序在不同阶段创建的开销?

注:我更intrested了解哪些不退出应用程序......如果一个应用程序退出,我可以使用的工具,如Valgrind的..节目

回答

-1

的工作,剖析内存泄漏是基于检测由操作系统释放的内存,而不是程序。

+0

我没有得到你zabulus – codingfreak 2010-02-17 13:17:28

6

我会考虑从程序中添加一个优雅的退出。

+0

但是,如果程序永远不会退出并继续运行几天? – codingfreak 2010-02-17 10:34:36

+10

@codingfreak不要编写这样的应用程序 - 所有应用程序,甚至是服务器,都应该有一种以受控方式关闭的方法。 – 2010-02-17 10:39:51

+5

几乎所有的嵌入式应用程序都不会退出 – chrmue 2010-02-17 12:29:07

0

Rational Purify可以做到这一点,至少在Windows上。 There seem to be a linux版本,但我不知道它是否可以做同样的事情。

+0

看起来它在功能上与其他内存调试器相似,如Valgrind。 – codingfreak 2010-02-17 10:41:31

+0

IME Purify Windows和Unix版本的功能非常接近,所以它应该能够执行此操作。 – 2010-02-17 10:47:19

+0

@codingfreak与purify你可以开始你的应用程序,等待它变得稳定,扫描内存泄漏(有可能在这个阶段很多),等待多一点,只扫描*新*内存泄漏 – 2010-02-17 11:39:17

0

有些工具允许您在程序执行期间的任何时候强制进行内存分析。这种方法并不像检查退出那样可靠,但它给了你一个起点。

这是Windows example使用LeakDiag。

+0

嗯我我正在寻找开源和Linux的东西 – codingfreak 2010-02-17 10:47:01

0

您是否尝试过GNU Gprof?

请注意,在本文档中,“cc”和“gcc”是可以互换的。 (“cc”被认为是“gcc”的别名。) http://www.cs.utah.edu/dept/old/texinfo/as/gprof_toc.html

+0

你可以做得比** gprof **更好:http://stackoverflow.com/questions/1777556/alternatives-to-gprof/1779343#1779343 – 2010-02-17 14:13:04

0

您的问题就像是在寻找top。它很好地显示了(除其他之外)当前正在运行的进程的内存消耗。 (限于终端中的一页。)在Linux上,按“M”按内存使用情况进行排序。手册页显示了更多的排序和过滤选项。

+0

是的顶部可能有助于确定一个应用程序的总空间使用情况......但我们无法检测到有多少内存是臃肿的还是泄漏的? – codingfreak 2010-02-17 13:19:31

+0

对。没有一些类似垃圾回收的系统,在程序运行时没有办法检测泄漏的内存 - 泄露的内存与活动内存不同,但目前处于休眠状态?无论如何,区分实际使用的膨胀和内存无法自动完成。至少不完全,我会对有用的部分解决方案感到有些惊讶。 – 2010-02-18 13:10:57

0

我已经使用合理的净化API来检查增量泄漏。没有在Linux中使用API​​。我在Valgrind User Manual找到了VALGRIND_DO_LEAK_CHECK选项,我认为这足以满足您的要求。

+0

但valgrind要求应用程序退出吗? – codingfreak 2010-02-18 04:32:43

+0

您需要在程序中包含memcheck.h并使用VALGRIND_DO_LEAK_CHECK。我没有使用过,请检查。 – Andy 2010-02-18 06:22:36

+0

似乎我需要将valgrind整合到我的程序中。然后让我试一试? – codingfreak 2010-11-03 04:37:24

1

您可以使用GNU gprof,但它也有问题,它需要退出程序。 你可以通过调用gprof的内部函数来克服这个问题。 (见下文)这可能是一个真正的“脏”黑客攻击,取决于gcc的版本,和,和,...但它的工作原理。

 

#include "sys/gmon.h" 


extern "C" //the internal functions and vars of gprof 
{ 
    void moncontrol (int mode); 
    void monstartup (unsigned long lowpc, unsigned long highpc); 
    void _mcleanup (void); 
    extern void _start(void), etext(void); 
    extern int __libc_enable_secure; 
} 

// call this whenever you want to write profiling information to file 
void WriteProfilingInformation(char* Name) 
{ 
    setenv("GMON_OUT_PREFIX",Name,1); // set file name 

    int old = __libc_enable_secure; // save old value 
    __libc_enable_secure = 0;  // has to be zero to change profile file name 
    _mcleanup(); 
    __libc_enable_secure = old;  // reset to old value 

    monstartup(lowpc, highpc);  // restart profiler 
    moncontrol(1);     // enable profiler 
} 
+0

好吧,它是类似的每一次的时间我们会降低旧的价值观,并重新开始回到分析器? ... – codingfreak 2010-02-17 13:21:35

+0

@codingfreak:就是这样! – chrmue 2010-02-17 14:41:47

+0

这是一个很有效的方法.. ???通过时间跨度,我们可能知道内存消耗会增加或减少。即使在顶层的帮助下,我们也可以做同样的事情。对不起如果我错了我只是说 – codingfreak 2010-02-18 04:31:53

0

对于Windows,DebugDiag会这样做。 最终生成报告,可能会发生内存泄漏。 也有内存压力分析。 它可以免费@微软。从here

+0

“最终生成报告”......你的意思是如果应用程序退出?如果是 - 那么我得到了像Valgrind这样的开源工具... – codingfreak 2010-02-18 04:29:44

3

下载它dtrosset的观点很好,但显然被误解了。添加一个意味着终止程序,以便您可以执行一个干净的分析。这可以像为SIGUSR1添加信号处理程序一样简单,例如,可以在您决定的时间点终止程序。取决于您的操作系统,您可以使用多种方法。

从不存在的应用程序(嵌入式,守护进程等)和无法退出的应用程序之间存在很大差异。以前是正常的,后者是糟糕的设计。

如果有什么,该应用程序可以被强制中止(* nix上的SIGKILL,终止于win32),你会得到你的分析。该方法不会给您的应用程序提供清理机会,因此很可能会保留内存报告。

0

您需要stackshots。可以使用pstacklsstack,或者只是在调试器或IDE下运行它并随机暂停(Ctrl-C)。它不会告诉你有关内存泄漏的情况,但它会给你一个关于如何使用时间以及为什么的好主意。

如果因为内存泄漏而使用了时间,您会看到很多以样本结尾的内存管理例程。如果它们位于mallocnew之上,那么会看到哪些对象正在被分配以及为什么,并且您可以考虑如何减少这种情况。

2

性能分析是干扰性的,因此无论如何,您都不想部署带有配置程序的应用程序。因此,包含一些#ifdef PROFILE_MODE-在适当的时间后退出应用程序的代码。用-DPROFLILE_MODE,配置文件编译。不使用PROFILE_MODE进行部署。

+0

edgar有一些应用程序在退出时会给企业带来很大的损失....所以在那种情况下呢? – codingfreak 2010-02-18 04:25:11

+0

在这种情况下,您仍然不会使用附加的分析器运行该应用程序。安全关键应用程序通常使用冗余,关键业务应用程序通常会在部署前采用监视,主动一致性检查和充分的校对/测试。你在找什么? – 2010-02-18 12:46:08

2

修改你的程序稍微让你可以在任何时候申请Valgrind的泄漏检查 - 当命令要做到这一点是收到,程序应该使用VALGRIND_DO_LEAK_CHECKmemcheck.h(这不会有任何影响,如果程序没有运行在Valgrind下)。