我可以打破的内置功能,如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