亚洲好骚综合-亚洲黄色录像-亚洲黄色网址-亚洲黄色网址大全-99久久99久久-99久久99久久精品国产

您的位置:軟件測試 > 開源軟件測試 > 開源性能測試工具 >
經驗分享-性能監控apache的內存
作者:網絡轉載 發布時間:[ 2013/2/18 13:48:03 ] 推薦標簽:

我曾經參與過一個比較大的項目,在這個項目里面,我們沒有一個完全確定的設計文檔,所以程序的實現常常變動。雖然我們有一個比較靈活的框架,但是從程序的角度來講,它使我們的程序非常的混亂。直到發布的日期臨近,我們還沒有一個穩定的可以用來做alpha測試的版本。所以我們必須盡快的刪除掉無用的代碼,讓這個版本足夠的穩定。但是,在這個沒有足夠規范的軟件公司,我們沒有時間也沒有足夠的精力來做邊界測試之類的工作。所以我們只能采用變通的辦法。在軟件中大的問題是內存泄漏。因為往往出現這樣的情況,我們在一段代碼中分配了內存,但是卻沒有釋放它。這造成了很大的問題。我們需要一個簡單的解決方案,能夠簡單的編譯進這個項目,在運行的時候,它能夠產生一個沒有被釋放的內存的列表,用這個列表,我們能夠改正程序的錯誤。這是我們稱之為內存跟蹤的方法。首先,我們需要一種代碼,能夠被加入到源代碼中去,而且這種代碼能夠被重用。代碼重用是一種很重要的特性,能夠節省大量的時間和金錢以及程序員的勞動。另外,我們的這種代碼必須簡單,因為我們當時已經沒有那么多的時間和精力去完全重看一遍所有的代碼來重新編寫以及改正錯誤從而使內存跟蹤能夠起作用。

好在,我們總能夠找到解決的辦法。首先,我們檢查了代碼,發現所有的代碼都是用new來分配內存,用delete來釋放內存。那么,我們能夠用一個全程替換,來替換掉所有的new和delete操作符嗎?不能。因為代碼的規模太大了,那樣做除了浪費時間沒有別的任何好處。好在我們的源代碼是用C++來寫成的,所以,這意味著沒有必要替換掉所有的new和delete,而只用重載這兩個操作符。對了,值用重載這兩個操作符,我們能在分配和釋放內存之前做點什么。這是一個的好消息。我們也知道該如何去做。因為,MFC也是這么做的。我們需要做的是:跟蹤所有的內存分配和交互引用以及內存釋放。我們的源代碼使用Visual C++寫成,當然這種解決方法也可以很輕松的使用在別的C++代碼里面。要做的第一件事情是重載new和delete操作符,它們將會在所有的代碼中被使用到。我們在stdafx.h中,加入:
      #ifdef _DEBUG
      inline void * __cdecl operator new(unsigned int size,
                                         const char *file, int line)
      {
      };

      inline void __cdecl operator delete(void *p)
      {
      };
      #endif
這樣,我們重載了new和delete操作符。我們用$ifdef和#endif來包住這兩個重載操作符,這樣,這兩個操作符不會在發布版本中出現。看一看這段代碼,會發現,new操作符有三個參數,它們是,分配的內存大小,出現的文件名,和行號。這對于尋找內存泄漏是必需的和重要的。否則,會需要很多時間去尋找它們出現的確切地方。加入了這段代碼,我們的調用new()的代碼仍然是指向只接受一個參數的new操作符,而不是這個接受三個參數的操作符。另外,我們也不想記錄所有的new操作符的語句去包含__FILE__和__LINE__參數。我們需要做的是自動的讓所有的接受一個參數的new操作符調用接受三個參數的new操作符。這一點可以用一點點小的技巧去做,例如下面的這一段宏定義,
      #ifdef _DEBUG
      #define DEBUG_NEW new(__FILE__, __LINE__)
      #else
      #define DEBUG_NEW new
      #endif
      #define new DEBUG_NEW
現在我們所有的接受一個參數的new操作符都成為了接受三個參數的new操作符號,__FILE__和__LINE__被預編譯器自動的插入到其中了。然后,是作實際的跟蹤了。我們需要加入一些例程到我們的重載的函數中去,讓它們能夠完成分配內存和釋放內存的工作。這樣來做, #ifdef _DEBUG
      inline void * __cdecl operator new(unsigned int size,
                                         const char *file, int line)
      {
void *ptr = (void *)malloc(size);
AddTrack((DWORD)ptr, size, file, line);
return(ptr);
      };
      inline void __cdecl operator delete(void *p)
      {
RemoveTrack((DWORD)p);
free(p);
      };
      #endif
另外,還需要用相同的方法來重載new[]和delete[]操作符。這里省略掉它們了。
后,我們需要提供一套函數AddTrack()和RemoveTrack()。我用STL來維護存儲內存分配記錄的連接表。
這兩個函數如下:
      typedef struct {
DWORD address;
DWORD size;
char file[64];
DWORD line;
      } ALLOC_INFO;

      typedef list<ALLOC_INFO*>; AllocList;

      AllocList *allocList;

      void AddTrack(DWORD addr, DWORD asize, const char *fname, DWORD lnum)
      {
ALLOC_INFO *info;

if(!allocList) {
allocList = new(AllocList);
}

info = new(ALLOC_INFO);
info->;address = addr;
strncpy(info->;file, fname, 63);
info->;line = lnum;
info->;size = asize;
allocList->;insert(allocList->;begin(), info);
      };

      void RemoveTrack(DWORD addr)
      {
AllocList::iterator i;

if(!allocList)
return;
for(i = allocList->;begin(); i != allocList->;end(); i++)
{
if((*i)->;address == addr)
{
allocList->;remove((*i));
break;
}
}
      };
現在,在我們的程序退出之前,allocList存儲了沒有被釋放的內存分配。為了看到它們是什么和在哪里被分配的,我們需要打印出allocList中的數據。我使用了Visual C++中的Output窗口來做這件事情。
      void DumpUnfreed()
      {
AllocList::iterator i;
DWORD totalSize = 0;
char buf[1024];

if(!allocList)
return;

for(i = allocList->;begin(); i != allocList->;end(); i++) {
sprintf(buf, "%-50s: LINE %d, ADDRESS %d %d unfreed ",
(*i)->;file, (*i)->;line, (*i)->;address, (*i)->;size);
OutputDebugString(buf);
totalSize += (*i)->;size;
}
sprintf(buf, "----------------------------------------------------------- ");
OutputDebugString(buf);
sprintf(buf, "Total Unfreed: %d bytes ", totalSize);
OutputDebugString(buf);
      };
現在我們有了一個可以重用的代碼,用來監測跟蹤所有的內存泄漏了。這段代碼可以用來加入到所有的項目中去。雖然它不會讓你的程序看起來更好,但是起碼它能夠幫助你檢查錯誤,讓程序更加的穩定。

軟件測試工具 | 聯系我們 | 投訴建議 | 誠聘英才 | 申請使用列表 | 網站地圖
滬ICP備07036474 2003-2017 版權所有 上海澤眾軟件科技有限公司 Shanghai ZeZhong Software Co.,Ltd
主站蜘蛛池模板: 国产日韩欧美一区二区 | 成人在线观看播放 | 在线观看黄日本高清视频 | 中国又粗又大又爽的毛片 | 午夜寂寞影 | www.日| 最近中文字幕免费国语 | 一本在线免费视频 | 成年美女黄网站色大免费观看软件 | 国产你懂的在线观看 | 91在线亚洲精品专区 | 在线好吊色视频98gao | 欧美日韩中文国产 | 国产黄视频在线观看 | 亚洲一区 中文字幕 | 日本r级在线观看播放 | 日韩欧美一区二区三区不卡在线 | 免费在线黄视频 | 成年黄网站色大免费全看 | 天堂网成人 | 国内不卡一二三四区 | 国产视频久 | 成人亚洲网站www在线观看 | 一级做a爰片久久毛片武则天 | 在线看毛片网站 | 成人午夜在线观看 | 亚洲阿v天堂最新版2021 | 国产一国产一级新婚之夜 | 日日干干 | 一区二区视频在线免费观看 | 久久精品免费播放 | 91在线 | 亚洲 | 亚洲欧洲日韩在线 | h在线播放 | 在线视频一区二区三区四区 | 欧美婷婷 | 35pao免费视频 | 一级特黄录像播放 | 一个人免费观看www视频 | 午夜小视频男女在线观看 | 91在线视频免费播放 |