For Programmers: Free Programming Magazines  


Home > Archive > PHP Programming > April 2007 > debug_backtrace and FILE/LINE indices









You are viewing an archived Text-only version of the thread. To view this thread in it's original format and/or if you want to reply to this thread please [click here]

 

Author debug_backtrace and FILE/LINE indices
Taras_96

2007-04-24, 6:59 pm

Hi all,

I've been using debug_backtrace() for a while to provide stack traces
for a custom logging function. Today was the first time I've got the
following error:

"Notice: Undefined index: file in E:\webroot\lib\errors.php on line
341

Notice: Undefined index: line in E:\webroot\lib\errors.php on line
341"

related to the following code:

$vDebug = debug_backtrace();
$vFiles = array();
for ($i=0;$i<count($vDebug);$i++) {
// skip the first one, since it's always this func
if ($i==0) { continue; }
$aFile = $vDebug[$i];
var_dump($aFile);
$vFiles[] = '('.basename($aFile['file']).':'.
$aFile['line'].')';
} // for
return implode(',',$vFiles);

I checked the PHP documentation for this function, and to my surprise
found that:

"The *possible* returned elements are as follows:", ie: 'file' and
'line' wont always be returned. When are these elements returned, so
that I can make the function do something useful when file/line isn't
returned?

Thanks

Taras

Thomas Mlynarczyk

2007-04-24, 6:59 pm

Also sprach Taras_96:

> $vDebug = debug_backtrace();
> $vFiles = array();
> for ($i=0;$i<count($vDebug);$i++) {
> // skip the first one, since it's always this func
> if ($i==0) { continue; }
> $aFile = $vDebug[$i];
> var_dump($aFile);
> $vFiles[] = '('.basename($aFile['file']).':'.
> $aFile['line'].')';
> } // for
> return implode(',',$vFiles);
>
> I checked the PHP documentation for this function, and to my surprise
> found that:
>
> "The *possible* returned elements are as follows:", ie: 'file' and
> 'line' wont always be returned. When are these elements returned, so
> that I can make the function do something useful when file/line isn't
> returned?


A workaround: If 'file' and 'line' are not returned, use the respective
values from the next entry in the backtrace array. Here's what I use:

$aTrace = debug_backtrace();
// Loop backwards (!) through array
for ( $sFile = '', $iLine = 0, $i = count( $aTrace ); $i--; )
{
// Make sure all fields are set
$aTrace[$i]
= array_merge(
array(
'function' => '',
'type' => '',
'class' => '',
'object' => array(),
'args' => array(),
'file' => $sFile,
'line' => $iLine
),
$aTrace[$i]
);

// Add this for convenience
$aTrace[$i]['call']
= $aTrace[$i]['class']
. $aTrace[$i]['type']
. $aTrace[$i]['function'];

// Missing file or line? Copy from previous item
$sFile = $aTrace[$i]['file'];
$iLine = $aTrace[$i]['line'];
}

// Remove first item ("this function")
array_shift( $aTrace );

This way, all possible fields are set to useful values. If you're only
interested in file and line, you can optimize the code of course.

Greetings,
Thomas



Taras_96

2007-04-28, 3:59 am

Thanks Thomans, I'll try out your suggestion and see how it goes :).

Taras

On Apr 25, 5:01 am, "Thomas Mlynarczyk" <tho...@mlynarczyk-
webdesign.de> wrote:
> Also sprach Taras_96:
>
>
>
>
>
>
> A workaround: If 'file' and 'line' are not returned, use the respective
> values from the next entry in the backtrace array. Here's what I use:
>
> $aTrace = debug_backtrace();
> // Loop backwards (!) through array
> for ( $sFile = '', $iLine = 0, $i = count( $aTrace ); $i--; )
> {
> // Make sure all fields are set
> $aTrace[$i]
> = array_merge(
> array(
> 'function' => '',
> 'type' => '',
> 'class' => '',
> 'object' => array(),
> 'args' => array(),
> 'file' => $sFile,
> 'line' => $iLine
> ),
> $aTrace[$i]
> );
>
> // Add this for convenience
> $aTrace[$i]['call']
> = $aTrace[$i]['class']
> . $aTrace[$i]['type']
> . $aTrace[$i]['function'];
>
> // Missing file or line? Copy from previous item
> $sFile = $aTrace[$i]['file'];
> $iLine = $aTrace[$i]['line'];
> }
>
> // Remove first item ("this function")
> array_shift( $aTrace );
>
> This way, all possible fields are set to useful values. If you're only
> interested in file and line, you can optimize the code of course.
>
> Greetings,
> Thomas



Sponsored Links







Also available: Server administration forum archive | Web Design forum archive | Software forum archive | Hardware reviews archive

Copyright 2008 codecomments.com