debug_backtrace()
には、通話の回線番号が含まれていないことがあります。これが何であるのか、それを訂正する何らかの理由はありますか?debug_backtrace()に行番号が含まれないのはなぜですか?
ありがとうございます。
P.S.そして、はい、行番号を省略した呼び出しは、自分のコードであり、内部のPHPコードではありません。
debug_backtrace()
には、通話の回線番号が含まれていないことがあります。これが何であるのか、それを訂正する何らかの理由はありますか?debug_backtrace()に行番号が含まれないのはなぜですか?
ありがとうございます。
P.S.そして、はい、行番号を省略した呼び出しは、自分のコードであり、内部のPHPコードではありません。
は、私は、ファイル名やスクリプトを呼び出す LINENOを示し、これはPHP Bug
デバッグバックトレースとして表示されていると思います。内部で 関数が呼び出された場合 内部関数(コールバックの可能性あり) ファイル名とlinenoは設定されていません。
そのリンクを追跡してくれてありがとう。私はコードが内部関数によって呼び出されているとは思わないが、私はチェックするだろう。 – MikeSchinkel
以下のコードを検討:
<?
class BtTest
{
public function getTheItem()
{
var_dump(debug_backtrace(false));
$bt = debug_backtrace(false);
return $bt[1];
}
public function __call($methodName, $methodArgs)
{
return $this->getTheItem();
}
}
$o = new BtTest();
$bti = $o->test();
assert('array_key_exists("function", $bti)');
assert('array_key_exists("line", $bti)');
assert('array_key_exists("file", $bti)');
上記の例の実行は次のような出力を生成:
array(3) {
[0]=>
array(6) {
["file"]=>
string(53) "/somewhere/in/the/filesystem/tests/bt-test-so.php"
["line"]=>
int(13)
["function"]=>
string(10) "getTheItem"
["class"]=>
string(6) "BtTest"
["type"]=>
string(2) "->"
["args"]=>
array(0) {
}
}
[1]=>
array(4) {
["function"]=>
string(6) "__call"
["class"]=>
string(6) "BtTest"
["type"]=>
string(2) "->"
["args"]=>
array(2) {
[0]=>
&string(4) "test"
[1]=>
&array(0) {
}
}
}
[2]=>
array(6) {
["file"]=>
string(53) "/somewhere/in/the/filesystem/tests/bt-test-so.php"
["line"]=>
int(18)
["function"]=>
string(4) "test"
["class"]=>
string(6) "BtTest"
["type"]=>
string(2) "->"
["args"]=>
array(0) {
}
}
}
PHP Warning: assert(): Assertion "array_key_exists("line", $bti)" failed in /somewhere/in/the/filesystem/tests/bt-test-so.php on line 21
PHP Warning: assert(): Assertion "array_key_exists("file", $bti)" failed in /somewhere/in/the/filesystem/tests/bt-test-so.php on line 22
最初のバックトレース項目(インデックス0)line
とfile
項目を(間接的に言います)getTheItem
メソッドが__call
メソッドから呼び出されたことを示します。
二バックトレース項目(指標1)__call
メソッドは(line
とfile
項目を欠落している)どこかから呼び出されたことを述べています。
第3のバックトレース項目(インデックス2)は、test
メソッドがスクリプトのグローバルスコープから呼び出されたことを示します。
__call
メソッド呼び出しの場所は、おそらくPHPインタープリタコードのどこかのメソッド解決コードにあります。それを固定するには2つの可能性があります。 2番目の項目はインタプリタのソースコードファイルと行を参照するか、2番目と3番目のバックトレース項目は1つにマージする必要があります。私は個人的にはインタープリタの内部が私にとって興味深いものではないので、第二の解決策を好むでしょう(これはPythonのトレースバックでやっているようです)。しかし、時には最初の解決策がより明確なトレースを提供することを理解しています。内部から呼び出される)。
debug_backtrace
関数のコードを担当する(または少なくとも維持している)開発者は、それをバグとして認識していないか、簡単に修正できないようです。 line
とfile
の項目にいくつかのプレースホルダ値(例:<unknown-file>
と0
、さらにはヌル)を入力して、ドキュメントで強調してください。 誰かがそれを成功させることに成功しない限り、あなたのコードで特別なケースを処理するだけで済みます。
私は機能の奇妙な振る舞いについて私の理解を共有するためだけに書いた。誰かが少し良い世界のために戦うために意欲を持っている場合は、ここではいくつかの関連するバグレポートへのリンクは以下のとおりです。
__FILE__
, __LINE__
最も古いレポートは2003年のものなので、速い修正をしてください:)
詳細な回答ありがとうございました。優れた仕事! – MikeSchinkel
「バグ」、「機能」にかかわらず、PHPを維持している人が何と言っても、debug_backtrace()は期待通りに動作しません。ここで
は、私の解決策は、(それは醜いですが、それは私のために動作します)です:
function dbg($msg="")
{
ob_start();
debug_print_backtrace(0,1);
$_ = ob_get_clean();
list($ignore,$line_number) = explode(':', $_);
$line_number += 0;
$backtrace = debug_backtrace(0);
extract($backtrace[1]);
echo "<pre>$class::$function($msg) : $line_number</pre>";
}
PHP関数debug_print_backtrace(0,1);このような何かを生成します:のみトレースエコーそれ以来
#0 dbg->ピング(290)[/path/to/filename.php:290]
で呼ばれるが、私は)(ob_get_cleanする必要がありますそれは文字列として。それから私はそれを解析する。
私の実装では、クラス、関数、行番号、およびオプションで、呼び出し関数からの文字列メッセージを知りたいだけです。 debug_backtrace()はクラスと関数を正しく提供しますが、行番号は正しくありません。そのため、debug_print_backtrace()関数から行番号を取得する必要があります。
ボーナスポイントについて.... debug_print_backtrace()関数は行番号を "知っている"のですが、debug_backtrace()[時々]はそうではありません。 ...それは謎です...
面白いです。あなたは例を投稿できますか? – deceze
例外、クロージャ、評価コード、ティック関数、エラーハンドラ(基本的には通常の実行スタックから動作するコード)の中にあるのでしょうか?それ以外に、なぜあなたは行番号を得られないのか分かりません(少なくとも例はありません)。 – ircmaxell
@deceze - コードは例を投稿するにはあまりにも複雑です。私はできることを望むが、投稿するのに十分な単純なものを特定するのに数時間以上かかりそうだし、その時間を費やすのはそれほど大きな問題ではない。 – MikeSchinkel