2011-05-15 56 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