PHP 打印调用函数入口地址(堆栈),方便调式

今天网站出现一个BUG,然后直接在数据库类里面写日志,看是哪条SQL出了问题,SQL语句到是找到了,但是不知道这条SQL语句来自何处,于是就想啊,如果能有一个办法,查看当前正在运行的这个方法是被哪个方法调用的,以及上一个方法又是哪个方法调用的,以此类推,找到入口地址多好啊。不过以前自己也想过,也在网上去搜过,就是没有找到相关的办法,今天一同事(前辈)说JAVA里面这种调试用得很普遍,叫这种堆栈调试,我是就在网上搜PHP堆栈。居然被我找到了,然后把自己的办法写出来。

//调用堆栈函数,查找调用函数的源头,方便调试
function print_stack_trace()
{
    $array =debug_backtrace();
  //print_r($array);//信息很齐全
   unset($array[0]);
   foreach($array as $row)
    {
       $html .= $row['file'].':'.$row['line'].'行,调用方:'.$row['function']."<p>";
    }
    return $html;
}

 

我在我的数据库的核心查询函数里面调用这个方法,打印结果如下:

D:\wamp\www\meilele\includes\cls_mysql.php:471行,调用方法:query
D:\wamp\www\meilele\includes\cls_mysql.php:507行,调用方法:getAll
D:\wamp\www\meilele\includes\lib_common.php:732行,调用方法:getAllCached
D:\wamp\www\meilele\includes\init.php:113行,调用方法:load_config
D:\wamp\www\meilele\index.php:4行,调用方法:include_once

 

一目了然,一直找到了入口,太强悍了。以后调试又多了一种办法

时间: 2024-09-17 17:48:02

PHP 打印调用函数入口地址(堆栈),方便调式的相关文章

c-小白关于调用函数的问题

问题描述 小白关于调用函数的问题 请问下例如要测试多组数据的大小排列可以在int main 一点一点比较 也可以在外面创建个函数比较后调用 请问这两种方法哪个方法在运行的时候更加省时间呢? 求指教谢谢了 解决方案 时间基本上没啥明显区别 正常的带参数的函数,一般有以下几步: 1. 用push指令将参数入栈,如果是基本类型,有几个参数就需要几条push指令 2. call指令进入被调用函数,先保存IP寄存器的值,再将函数入口地址存入IP 3. 被调用函数将返回地址和基址EBP压入栈,并分配栈空间需

如何通过函数指针调用函数(实现代码)_C 语言

说明:指针可以不但可以指向一个整形,浮点型,字符型,字符串型的变量,也可以指向相应的数组,而且还可以指向一个函数. 一个函数在编译的时候会被分配给一个入口地址.这个函数入口地址称为函数的指针.可以用一个指针变量指向函数,然后通过该指针变量调用此函数. 定义指向函数的指针变量的方法是: 复制代码 代码如下: int (*p) (int ,int ); int[指针变量p指向的函数的类型] (*p)[p是指向函数的指针变量] ( int,int )[p所指向的形参类型]; 与函数的原型进行比较 复制

函数堆栈,共享库,打印出被调用函数【笔记】

函数堆栈,共享库,打印出被调用函数, 此文转自Linux man手册,仅做学习笔记使用 DL_ITERATE_PHDR(3) Linux Programmer's Manual DL_ITERATE_PHDR(3) NAME dl_iterate_phdr - walk through list of shared objects SYNOPSIS #define _GNU_SOURCE /* See feature_test_macros(7) */ #include <link.h> in

link如何提高堆栈运算的效率,是不是少调用函数,堆栈运算会提高?

问题描述 link如何提高堆栈运算的效率,是不是少调用函数,堆栈运算会提高? link如何提高堆栈运算的效率,是不是少调用函数,堆栈运算会提高? 解决方案 理论上是这样,但是调用函数的开销是很小的.

函数调用-如何调用函数打印出数组

问题描述 如何调用函数打印出数组 我已经编写了函数itob(n,s,d),将整数n转换为以b为底的数,并将转换结果以字符形式保存到字符串s中.请问既然函数的返回值不能是数组,那么如何在main 函数中调用这个itob函数打印出字符串s?(刚入门的新手,很多函数没有学) 解决方案 void main() { char buf[50]; int num=100; itob(num,buf,8);//你设计的函数形参s应该是个指针,这样在函数内部转换完,在main函数就可以打印. printf("%s

2012-08-02 15:07 VC++ 往输出窗口打印调试信息调用函数

VC++提供了一个叫输出窗口的窗口,在调试程序和生成是可以看到输出信息,这个信息如果是MFC程序可以用TRACE宏来打印,在控制台程序里就没有了.所以我们直接调用API来实现上面的功能. 首先在程序中引入头文件windows.h或winbase.h 调用函数有两种版本 ANSI和UNICODE OutputDebugStringA OutputDebugStringW 自动版本 OutputDebugString 输出方法 OutputDebugString(_T("字符串")); O

link中发射调用函数的变量,在内存中究竟是怎么存放的?是静止不变的么?

问题描述 link中发射调用函数的变量,在内存中究竟是怎么存放的?是静止不变的么? link中发射调用函数的变量,在内存中究竟是怎么存放的?是静止不变的么? 解决方案 反射调用方法,和正常调用没有区别,只是正常调用编译器就直接将跳转到方法的指令写在程序中了,而反射多一个获取方法地址的操作. 如果是局部变量,还是在堆栈上的,并且在方法结束后回收.

调用函数-关于二叉排序树的构建问题

问题描述 关于二叉排序树的构建问题 #include #include using namespace std; struct BitTree{ int data; BitTree *lchild,*rchild; }; void InsertBST(BitTree *T,int k) { if (T == NULL) { T = new BitTree; (*T).data = k; (*T).lchild = NULL; (*T).rchild = NULL; } else if (k ==

js html-在线等,急(大神帮帮忙):js动态嵌入html代码,代码中调用函数,当传参为字符串时,函数没有响应

问题描述 在线等,急(大神帮帮忙):js动态嵌入html代码,代码中调用函数,当传参为字符串时,函数没有响应 <!DOCTYPE html> <br> function insert()<br> {<br> var a="jioho";<br> var str="<table><tr><button type='button' onclick='test("+ a+"