2010-02-17 33 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下)。