2

php -aコマンドラインで入力して、PHPをインタラクティブに使用しています。SWIGを使用して構築した拡張モジュールをロードするように/etc/php5/cli/php.iniを変更しました。

インタラクティブセッションを終了すると、セグメンテーション違反が発生します。

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デバッグ用の通常のツールを使用してスタックトレースを取得できます。例えば:

  • Valgrind:

    $ USE_ZEND_ALLOC=0 valgrind php -a
    
  • GDB:

    $ gdb php
    > r -a
    

意味のあるスタックトレースが得られない場合は、デバッグシンボルを使用して最適化を減らしてPHPを再コンパイルする必要があります。--enable-debugあなたはあなたのラインに渡すことによってそうすることができます./configure

于 2012-08-28T14:24:43.697 に答える
0

valgrindPHPのインストールがSegFaultingである場所を正確に追跡するために、または同様に使用することをお勧めします。

ほとんどの場合、エラーはロードした拡張機能に関連している可能性があります。これは、適切なアーキテクチャにコンパイルされていないか、リークなどが含まれている可能性があります。

于 2012-08-28T14:24:12.550 に答える