用valgrind檢測php擴充記憶體泄露_PHP教程

來源:互聯網
上載者:User
原文:https://bugs.php.net/bugs-getting-valgrind-log.php

前提

1,編譯php的時候,必須要帶上--enable-debug選項

2,禁用php的記憶體管理。

禁用Zend MM

Zend虛擬機器使用了自己的程式來最佳化記憶體管理,因此,valgrind無法探測到大部分的記憶體問題。在使用valgrind執行php之前,你必須禁用Zend內建的記憶體管理器。禁用方式為將環境變數USE_ZEND_ALLOC設定成0。

export USE_ZEND_ALLOC=0

或者

setenv USE_ZEND_ALLOC 0

上述方式適用於php5.2及以上的版本。5.2之前的php需要在編譯的時候帶上--disable-zend-memory-manager選項。

使用共用擴充

為了能在valgrind中正確顯示extension的記憶體堆棧,需要設定:

export ZEND_DONT_UNLOAD_MODULES=1

或者

setenv ZEND_DONT_UNLOAD_MODULES 1

該設定作用於PHP 5.3.11及之後的版本。

編者註:舉例來說,如果不設定ZEND_DONT_UNLOAD_MODULES,valgrind可能會報告

$ valgrind --leak-check=full --show-reachable=yes php test.php
...
==25829== 8 bytes in 1 blocks are indirectly lost in loss record 2 of 21
==25829== at 0x4C25E84: ???
==25829== by 0xCE440DC: ???
==25829== by 0xCE44316: ???
==25829== by 0xCE44368: ???
==25829== by 0xCBEE55F: ???
==25829== by 0xCBD3F87: ???
==25829== by 0x949A85: zend_activate_modules (zend_API.c:2285)
==25829== by 0x8B5EBC: php_request_startup (main.c:1491)
==25829== by 0xA84F7B: main (php_cli.c:1356)
...

如果設定ZEND_DONT_UNLOAD_MODULES,則會顯示如下

$ valgrind --leak-check=full --show-reachable=yes php test.php
...
==25824== 8 bytes in 1 blocks are still reachable in loss record 2 of 30
==25824== at 0x4C25E84: calloc (in /usr/lib/valgrind/vgpreload_memcheck.so)
==25824== by 0xCE440DC: event_base_priority_init (in /usr/lib/libevent-1.4.so.2.1.3)
==25824== by 0xCE44316: event_base_new (in /usr/lib/libevent-1.4.so.2.1.3)
==25824== by 0xCE44368: event_init (in /usr/lib/libevent-1.4.so.2.1.3)
==25824== by 0xCBEE55F: zm_activate_http_request_pool (http_request_pool_api.c:58)
==25824== by 0xCBD3F87: zm_activate_http (http.c:373)
==25824== by 0x949A85: zend_activate_modules (zend_API.c:2285)
==25824== by 0x8B5EBC: php_request_startup (main.c:1491)
==25824== by 0xA84F7B: main (php_cli.c:1356)
...

使用CLI,web server內建或者CGI方式來執行php

為了使php CLI/CGI產生valgrind日誌,你需要用以下命令來執行:

valgrind --tool=memcheck --num-callers=30 --log-file=php.log /path/to/php-cli script.php

這樣會將log輸出到目前的目錄下的php.log檔案中。

如果要檢測web server內建的php,需要對CLI可執行檔使用適當的-S和-t參數。然後通過瀏覽器請求來執行,再看php.log中的valgrind錯誤。

通過valgrind執行PHP Apache module

如果你是靜態編譯php和apache,那麼需要確保apache的bin沒有在make install之後被分離,否則會丟失所需的調試資訊。檢測如下,執行/path/to/httpd,這樣會輸出一些東西(例如not stripped)

$ file /usr/local/apache2/bin/httpd
/usr/local/apache2/bin/httpd: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), for GNU/Linux 2.6.4, dynamically linked (uses shared libs), not stripped

如果要針對apache的php mod來產生valgrind的檢測報告,你需要在valgrind下運行apache:

valgrind --tool=memcheck --num-callers=30 --log-file=apache.log /usr/local/apache/bin/httpd -X

通過瀏覽器請求來訪問,所有的記憶體錯誤都會輸出到apache.log中。

http://www.bkjia.com/PHPjc/440136.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/440136.htmlTechArticle原文:https://bugs.php.net/bugs-getting-valgrind-log.php 前提 1,編譯php的時候,必須要帶上 --enable-debug選項 。 2,禁用php的記憶體管理。 禁用Zend MM Z...

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.