By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
438,746 Members | 1,924 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 438,746 IT Pros & Developers. It's quick & easy.

debug_backtrace and FILE/LINE indices

P: n/a
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

Apr 24 '07 #1
Share this Question
Share on Google+
2 Replies


P: n/a
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

Apr 24 '07 #2

P: n/a
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.dewrote:
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

Apr 28 '07 #3

This discussion thread is closed

Replies have been disabled for this discussion.