2011-05-15 59 views

回答

0

如果您的函數是在PHP解釋器本身中定義的,並且在運行時基本上被解釋和評估,而不是作爲預編譯的基於C的插件,那麼您將無法訪問它從gdb開始,除非您要逐步介紹實際的PHP解釋器執行循環本身,即使如此,我也不確定如何確切知道它是何時被調用的函數。可能有效的一些可能性是監視所有對PHP的​​的調用,或者可能發出SIGTRAP使用posix_killposix_getpid來處理函數中的PHP進程,以便在函數執行時停止gdb。另一方面,內置函數實際上是用C實現的,所以當解釋器調用這些函數時,它會調用編譯代碼,因此可以很容易地在gdb中設置斷點。

因此,例如,加入這一行你的PHP函數中(可能是在正確的開始)

posix_kill(posix_getpid(), SIGTRAP); 

應該停止你在點呼叫使用gdb監視PHP的過程,這將在解釋器中的用戶定義的PHP函數中。根據您的操作系統,SIGTRAP的值可能沒有定義,所以您可能需要查看您的操作系統的signal.h文件,以查看哪些信號值是合適的。但SIGTRAP可用於任何符合POSIX標準的操作系統。

最後,一定要在不使用gdb時刪除這一行,否則只會在信號引發時終止運行腳本的PHP進程。

+0

哦,對不起,聽到這是一個不可能的任務... – driver 2011-05-15 06:23:34

+0

嗯,我不會說不可能...我沒有添加一個可能性的筆記,你可以發出一個SIGTRAP信號給運行腳本的PHP進程,在用戶定義函數執行的地方停止gdb。儘管如此,你仍然需要熟悉PHP的內部數據結構,以便正確地執行你的函數的執行。 – Jason 2011-05-15 06:39:24

+0

@ Jason,你能更詳細地解釋一下監視'execute()'和'SIGTRAP'是如何實現我的目標的嗎? – driver 2011-05-15 06:45:20