2

我通过php -a在命令行键入以交互方式使用 PHP。我已修改 /etc/php5/cli/php.ini 以加载我使用 SWIG 构建的扩展模块。

当我终止交互式会话时,出现分段错误:

root@yourbox:~$ php -a
Interactive shell

php > ^DSegmentation fault
root@yourbox:~$ 

我想以详细模式运行 php,以便我可以看到导致段错误的调用。有没有办法在交互模式下详细运行 php?例如,使用 Python,可以运行python -v以获取详细的诊断信息。有没有与 PHP 等价的东西?

[[更新]]

这是使用 valgrind 时的堆栈跟踪:

root@yourbox:~$ USE_ZEND_ALLOC=0 valgrind php -a
==16414== Memcheck, a memory error detector
==16414== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.
==16414== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
==16414== Command: php -a
==16414== 

valgrind:  Fatal error at startup: a function redirection
valgrind:  which is mandatory for this platform-tool combination
valgrind:  cannot be set up.  Details of the redirection are:
valgrind:  
valgrind:  A must-be-redirected function
valgrind:  whose name matches the pattern:      strlen
valgrind:  in an object with soname matching:   ld-linux-x86-64.so.2
valgrind:  was not found whilst processing
valgrind:  symbols from the object with soname: ld-linux-x86-64.so.2
valgrind:  
valgrind:  Possible fixes: (1, short term): install glibc's debuginfo
valgrind:  package on this machine.  (2, longer term): ask the packagers
valgrind:  for your Linux distribution to please in future ship a non-
valgrind:  stripped ld.so (or whatever the dynamic linker .so is called)
valgrind:  that exports the above-named function using the standard
valgrind:  calling conventions for this platform.  The package you need
valgrind:  to install for fix (1) is called
valgrind:  
valgrind:    On Debian, Ubuntu:                 libc6-dbg
valgrind:    On SuSE, openSuSE, Fedora, RHEL:   glibc-debuginfo
valgrind:  
valgrind:  Cannot continue -- exiting now.  Sorry.
4

2 回答 2

1

您可以使用 C 调试的常用工具获取堆栈跟踪。例如:

  • 瓦尔格林:

    $ USE_ZEND_ALLOC=0 valgrind php -a
    
  • 广发银行:

    $ gdb php
    > r -a
    

如果您没有获得有意义的堆栈跟踪,您可能需要使用调试符号和减少优化来重新编译 PHP。您可以通过传递--enable-debug到您的./configure线路来做到这一点。

于 2012-08-28T14:24:43.697 回答
0

您可能会想要使用valgrind或类似工具来准确跟踪您的 PHP 安装在哪里是 Seg Faulting。

该错误很可能与您已加载的扩展有关,该扩展可能未编译为正确的体系结构、包含泄漏或其他原因。

于 2012-08-28T14:24:12.550 回答