Fix #1944 add option to display complete call stack for queries

This commit is contained in:
Kijin Sung 2022-12-19 01:11:43 +09:00
parent 868dfb33e9
commit e1f98e573c
10 changed files with 59 additions and 11 deletions

View file

@ -365,6 +365,12 @@ a img {
list-style: disc;
margin: 0; padding: 0; text-indent: 0;
color: #888;
ul {
padding-left: 20px;
li {
list-style: circle;
}
}
}
}
}

View file

@ -101,6 +101,7 @@ return array(
'display_content' => array('request_info', 'entries', 'errors', 'queries'),
'display_to' => 'admin',
'query_comment' => false,
'query_full_stack' => false,
'write_error_log' => 'fatal',
'allow' => array(),
),

View file

@ -42,8 +42,10 @@ class DB
protected $_query_id = '';
protected $_errno = 0;
protected $_errstr = '';
protected $_debug_queries = false;
protected $_debug_comment = false;
protected $_debug_full_stack = false;
/**
* Transaction level.
*/
@ -130,7 +132,9 @@ class DB
$this->db_version = $this->_handle->getAttribute(\PDO::ATTR_SERVER_VERSION);
// Cache the debug comment setting.
$this->_debug_comment = config('debug.query_comment') ? true : false;
$this->_debug_queries = in_array('queries', Config::get('debug.display_content') ?: []);
$this->_debug_comment = !!config('debug.query_comment');
$this->_debug_full_stack = !!Config::get('debug.query_full_stack');
}
/**
@ -1160,13 +1164,6 @@ class DB
*/
public function getQueryLog(string $query, float $elapsed_time): array
{
// Cache the debug status to improve performance.
static $debug_queries = null;
if ($debug_queries === null)
{
$debug_queries = in_array('queries', Config::get('debug.display_content') ?: []);
}
// Compose the basic structure of the log entry.
$result = array(
'query' => preg_replace('!\n/\* .+ \*/$!s', '', $query),
@ -1183,7 +1180,7 @@ class DB
);
// Add debug information if enabled.
if ($this->_errno || $debug_queries)
if ($this->_errno || $this->_debug_queries)
{
$backtrace = debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS);
foreach ($backtrace as $no => $call)
@ -1196,7 +1193,7 @@ class DB
if (isset($backtrace[$no]))
{
$result['called_method'] = $backtrace[$no]['class'] . $backtrace[$no]['type'] . $backtrace[$no]['function'];
$result['backtrace'] = array_slice($backtrace, $no, 1);
$result['backtrace'] = $this->_debug_full_stack ? array_slice($backtrace, $no) : [];
}
else
{

View file

@ -131,6 +131,14 @@ $(function() {
description.append($('<li></li>').text("Connection: " + data.queries[i].query_connection));
description.append($('<li></li>').text("Query ID: " + data.queries[i].query_id));
description.append($('<li></li>').text("Query Time: " + (data.queries[i].query_time ? (data.queries[i].query_time.toFixed(4) + " sec") : "")));
if (data.queries[i].backtrace && data.queries[i].backtrace.length) {
backtrace = $('<ul></ul>').appendTo(description.find('li:first-child'));
for (j in data.queries[i].backtrace) {
if (data.queries[i].backtrace[j].file) {
backtrace.append($('<li></li>').text(data.queries[i].backtrace[j].file + ":" + data.queries[i].backtrace[j].line));
}
}
}
}
description.append($('<li></li>').text("Result: " + ((data.queries[i].message === "success" || !data.queries[i].message) ? "success" : data.queries[i].message)));
}
@ -149,6 +157,14 @@ $(function() {
description.append($('<li></li>').text("Connection: " + data.slow_queries[i].query_connection));
description.append($('<li></li>').text("Query ID: " + data.slow_queries[i].query_id));
description.append($('<li></li>').text("Query Time: " + (data.slow_queries[i].query_time ? (data.slow_queries[i].query_time.toFixed(4) + " sec") : "")));
if (data.queries[i].backtrace && data.queries[i].backtrace.length) {
backtrace = $('<ul></ul>').appendTo(description.find('li:first-child'));
for (j in data.queries[i].backtrace) {
if (data.queries[i].backtrace[j].file) {
backtrace.append($('<li></li>').text(data.queries[i].backtrace[j].file + ":" + data.queries[i].backtrace[j].line));
}
}
}
}
description.append($('<li></li>').text("Result: " + ((data.slow_queries[i].message === "success" || !data.slow_queries[i].message) ? "success" : ("error " + data.slow_queries[i].error_code + " " + data.slow_queries[i].message))));
}

View file

@ -99,6 +99,13 @@ Database Queries
$query_result = ($query->message === 'success') ? 'success' : $query->message;
echo sprintf('%02d. %s', ++$query_count, $query->query_string) . "\n";
echo sprintf(' - Caller: %s', $query_caller) . "\n";
foreach ($query->backtrace ?? [] as $key => $backtrace)
{
if (isset($backtrace['file']) && isset($backtrace['line']))
{
echo sprintf(' %s line %d', $backtrace['file'], $backtrace['line']) . "\n";
}
}
echo sprintf(' - Connection: %s', $query->query_connection) . "\n";
echo sprintf(' - Query ID: %s', $query->query_id) . "\n";
echo sprintf(' - Query Time: %0.4f sec', $query->query_time) . "\n";
@ -122,6 +129,13 @@ Slow Queries
$query_result = ($query->message === 'success') ? 'success' : sprintf('error %d %s', $query->error_code, $query->message);
echo sprintf('%02d. %s', ++$query_count, $query->query_string) . "\n";
echo sprintf(' - Caller: %s', $query_caller) . "\n";
foreach ($query->backtrace ?? [] as $key => $backtrace)
{
if (isset($backtrace['file']) && isset($backtrace['line']))
{
echo sprintf(' %s line %d', $backtrace['file'], $backtrace['line']) . "\n";
}
}
echo sprintf(' - Connection: %s', $query->query_connection) . "\n";
echo sprintf(' - Query ID: %s', $query->query_id) . "\n";
echo sprintf(' - Query Time: %0.4f sec', $query->query_time) . "\n";