我可以打破的內置功能,如preg_replace
通過php_pcre_replace
休息,如何在用戶定義的PHP函數上使用dbg設置斷點?
,但我自己的函數(function func(){...}
),我該怎麼設置斷點呢?
我可以打破的內置功能,如preg_replace
通過php_pcre_replace
休息,如何在用戶定義的PHP函數上使用dbg設置斷點?
,但我自己的函數(function func(){...}
),我該怎麼設置斷點呢?
如果您的函數是在PHP解釋器本身中定義的,並且在運行時基本上被解釋和評估,而不是作爲預編譯的基於C的插件,那麼您將無法訪問它從gdb開始,除非您要逐步介紹實際的PHP解釋器執行循環本身,即使如此,我也不確定如何確切知道它是何時被調用的函數。可能有效的一些可能性是監視所有對PHP的的調用,或者可能發出SIGTRAP
使用posix_kill
和posix_getpid
來處理函數中的PHP進程,以便在函數執行時停止gdb。另一方面,內置函數實際上是用C實現的,所以當解釋器調用這些函數時,它會調用編譯代碼,因此可以很容易地在gdb中設置斷點。
因此,例如,加入這一行你的PHP函數中(可能是在正確的開始)
posix_kill(posix_getpid(), SIGTRAP);
應該停止你在點呼叫使用gdb監視PHP的過程,這將在解釋器中的用戶定義的PHP函數中。根據您的操作系統,SIGTRAP的值可能沒有定義,所以您可能需要查看您的操作系統的signal.h文件,以查看哪些信號值是合適的。但SIGTRAP可用於任何符合POSIX標準的操作系統。
最後,一定要在不使用gdb時刪除這一行,否則只會在信號引發時終止運行腳本的PHP進程。
不能執行Zend調試器嗎? – 2011-05-16 06:10:49