首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

有没有比使用backtrace()找到调用堆栈深度更便宜的方法?

有一种比使用 backtrace() 找到调用堆栈深度更便宜的方法,那就是使用 get_caller_info() 函数。

get_caller_info() 函数可以获取到函数的调用者信息,包括调用者的文件名、行号、函数名等信息。这个函数比 backtrace() 更加轻量级,因为它只需要获取当前函数的调用者信息,而不需要递归地获取整个调用堆栈。

以下是一个简单的示例,展示了如何使用 get_caller_info() 函数:

代码语言:php
复制
function get_caller_info() {
    $trace = debug_backtrace();
    $caller = $trace[2];
    return $caller;
}

function foo() {
    $caller_info = get_caller_info();
    echo "Caller info: ";
    var_dump($caller_info);
}

function bar() {
    foo();
}

bar();

在这个示例中,get_caller_info() 函数使用 debug_backtrace() 函数获取到了调用堆栈信息,然后从中提取出了第三个调用者的信息。这个信息包括了调用者的文件名、行号、函数名等信息。

需要注意的是,get_caller_info() 函数只能获取到调用者的信息,而不能获取到整个调用堆栈。如果需要获取整个调用堆栈,还是需要使用 backtrace() 函数。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

.NET 依赖库libunwind

目前有三种靠谱且普遍编程方法来获取调用堆栈: gcc编译器自带宏:__builtin_return_address:这是一种非常粗糙,底层方式。这个宏将获得堆栈上每个帧上函数返回地址。...因此需要额外处理来获得函数名称。 glibcbacktracebacktrace_symbols:可以获取调用堆栈上函数实际符号名称。 使用libunwind。...在三者之间,.NET 使用 libunwind库,因为它是最时髦,最广泛和最方便解决方案。 它也第二种方法backtrace更灵活,可以够提供额外信息,例如每个堆栈CPU寄存器值。...此外,在系统编程中,libunwind是最接近你现在可以获得“官方词汇”。 例如,gcc可以使用libunwind实现零成本C++异常捕捉(当实际抛出异常时需要堆栈展开)[^1]。...大名鼎鼎LLVM还在libc++中重新实现了libunwind接口,该接口用于在基于此库LLVM工具链中展开调用堆栈

1.7K50
  • C语言不支持重载,多种main()如何实现呢?

    但是,作为一个开发老油条,也仅仅知道是这样做,当看到二哥提出这个问题时候,第一反应是重载,但是大家都知道C语言是不支持重载,那么有没有可能使用是默认参数呢?...断点调试 为了能够清晰理解main()函数执行过程,写了一个简单代码,通过gdb查看堆栈信息,代码如下: int main() { return 0; } 编译之后,我们通过gdb进行调试,...main()调用堆栈信息,而这种main()在栈顶方式显然不足以解答我疑问。...于是,查阅了相关资料后,发现可以通过其它方式打印出详细堆栈信息。...popl %esi、movl %esp, %ecx:装载器把用户参数和环境变量压栈,实际上按照压栈方法,栈顶元素就是argc,接着其下就是argv和环境变量数组。

    44120

    addr2line 动态库

    不过相比addr2line,GDB需要将BUG现象重现一遍,所以对于不好重现BUG,或是随机重现BUG来说,使用addr2line就可以直接从backtrace找到对应代码行,不需要重现现象,GDB...使用起来简单。...,它有三个文件组成分别是backtrace.c、dump.c、add.c,其中add.c提供了对一个数值进行加一方法,我们在它执行过程中故意使用了一个空指针并为其赋值,这样人为造成段错误发生;dump.c...要得到一个函数入口地址我们多种途径和方法,比如生成查看程序map文件;使用gccnm、readelif等命令直接对libadd.so分析等。...在这里我们只介绍生成查看程序map文件方法,其他方法可通过查看gcc手册和google找到

    2.5K20

    backtrace打印函数调用

    异常调用栈信息可以在系统日志中查询。通常我会使用journalctl -n xxx 来查询日志打印。...在glibc头文件"execinfo.h"中声明了backtrace用于获取当前线程函数调用堆栈 int backtrace(void **buffer,int size) 该函数用于获取当前线程调用堆栈.../* 使用 glibc backtrace 函数打印调用栈信息 */ #include uword clib_backtrace (uword * callers, uword.../a.out() [0x8048741] Aborted (core dumped) 总结 本文简单介绍了定位vpp异常一点思路,可以通过journalctl -n xxx 来找到异常调用站信息来定位...当然journalctl命令还是很强大。查看所有内核和应用日志,并且提供了很多可以检索参数。 你们关于定位异常有什么高效方法,欢迎交流

    1.5K30

    Android Native内存泄漏检测方案详解

    介绍检测 Android Native 内存泄露基本思路和包含缓存逻辑示例代码。 介绍获取 Android Native 堆栈方法,用于记录分配内存时调用栈。...所以我们还遗留了一个问题:应该如何记录分配内存时调用栈呢?最后一节我们就来阐述获取Android Native堆栈方法。...,capture_backtrace函数使用_Unwind_Backtrace函数获取堆栈信息,然后我们使用dladdr函数获取到函数所在SO库基地址(info.dli_fbase),然后计算出函数相对地址...这时,需使用其他方法获取堆栈信息,如手动遍历栈帧或使用第三方库。...这种方法提供了一种在不使用_Unwind_Backtrace情况下获取堆栈信息方式,有助于我们更好地理解和调试程序。

    6210

    PThread OOM 终局之战 | 吹爆Matrix

    so时候,会根据ELF来定位到具体so内函数调用,那么通过这种机制,我们就可以用这套机制来将so内方法替换成我们中间方法就可以做到代码hook了。...类似之前做iocanary功能,当时是通过xhook替换io打开读写关闭方法来做到监控,而这次则是要找到线程创建点就行了,然后获取到对应堆栈,之后在收集一些别的相关我们就可以完成我们想要功能了...这部分代码我其实没看(主要也是看不懂,这部分我是真的菜),但是我在使用过程中发现对这部分堆栈数据进行信任。...pthread hook 是在native 内存中先收集好每一次线程创建情况,以及使用线程数量信息以及调用堆栈等,当触发dump之后会开始基于native内存数据,生成对应json文件,之后写入到文件中...,比较简单传入文件路径,之后调用jni方法,之后基本就会生成对应json文件,完成反序列化操作。

    1.1K20

    arm上backtrace分析与实现原理

    利用gdb还原死机现场 一般来讲,这三种方法都有一定优缺点。...第一种可以不用讲,现在主要讲一下backtrace。 01 backtrace简介 backtrace就是回溯堆栈,简单说就是可以列出当前函数调用关系。...02 backtrace过程详解 当程序出现异常或者死机时候,我们可以读取当前寄存器状态,找到当前pc指针情况,但是这些往往还不能说明问题,我们有时需要跟踪函数执行过程。...一般来说,我们使用unwind优势使用apcs更好,因为采用apcs时,会产生更多代码指令,对性能有影响,但是使用unwind方式只会产生一个额外段空间,并不会影响性能,所以大多数情况下,使用unwind...基本原理就是加上-mpoke-function-name后,在每段代码段后面,都会附加一个函数符号,我们需要使用时候,就根据函数pc指针,然后找到相关偏移量,之后将这个代码段符号获取到了。

    6.5K30

    PHP中调试函数debug_backtrace使用示例代码

    前言 如果我们想知道某个方法被谁调用了? debug_backtrace可以解决。debug_backtrace() 可以打印出一个页面的调用过程 , 从哪儿来到哪儿去一目了然。...有时候我们想知道这个函数或方法调用堆栈,也就是它是如何一级一级是被调用,可以用 PHP debug_backtrace 函数打印,就像这样: 示例代码 public function update...MYSQL建议使用5.7以上版本】/【尽量使用一键安装脚本,要么自己做,要么网上下载或使用我博客,把时间用在更多地方,少做重复劳动事情】/preview); $request->merge([...; } 你可以控制需要回溯堆栈层级数量,其中 debug_backtrace 第一个参数默认是一个常量 DEBUG_BACKTRACE_PROVIDE_OBJECT,表示显示这个对象信息,第二个参数用于控制回溯堆栈数量...效果如图所示,调用层级关系一目了然:

    46030

    Android Native Crash 收集

    Java Crash 不知道麻烦多少倍。 今天跟大家讲一下,我最近掉了几百根头发写出来一个 Native Crash 收集功能(脱发已经越来越严重了)。...第四种:使用 Google breakpad,这是所有 C/C++堆栈获取权威方案,基本上业界都是基于这个库来做。...下面以第一种为例讲一下实现: 核心方法使用库提供一个方法_Unwind_Backtrace()这个函数可以传入一个函数指针作为回调,指针指向函数有一个重要参数是_Unwind_Context...可以使用_Unwind_GetIP()函数将当前函数调用栈中每个函数绝对内存地址(也就是上文中提到 pc 值),写入到_Unwind_Context结构体中,最终返回是当前调用全部函数地址了,...而capture_backtrace()返回就是当前我们获取到调用栈中内容数量。

    2.2K10

    Android 平台 Native 代码崩溃捕获机制及实现

    信号机制是进程之间相互传递消息一种方法,信号全称为软中断信号。 2.信号机制 函数运行在用户态,当遇到系统调用、中断或是异常情况时,程序会进入内核态。信号涉及到了这两种状态之间转换。 ?...下面是Google Breakpad流程图,在新进程中DoDump,使用ptrace解析crash进程堆栈,同时信号处理程序等待子进程完成任务后,再调用信号处理函数。父子进程使用管道通信。...,高版本安卓源码中也使用了libunwind作为解堆栈工具,并针对安卓做了一些适配。...下面是使用libunwind解堆栈主循环,每次循环解一层堆栈。...* backtrace_symbols); (2) dladdr 通用方法是通过dladdr获得函数名字。

    5.5K116

    如何全面监控 iOS 千奇百怪崩溃

    handleSignalException 里通过 backtrace_symbols 方法就能获取到当前堆栈信息。...通常情况下,我们分析崩溃日志时最先看是异常信息,分析出问题是哪个线程,在线程回溯里找到那个线程; 然后,分析方法调用栈,符号化后方法调用栈可以完整地看到方法调用过程,从而知道问题发生在哪个方法调用上...方法调用栈顶,就是最后导致崩溃方法调用。完整崩溃日志里,除了线程方法调用栈还有异常编码。异常编码,就在异常信息里。 一些被系统杀掉情况,我们可以通过异常编码来分析。...App崩溃在不通过系统版本、设备、版本.png 有了全局大盘信息,一旦出现大量崩溃,你就需要明白是哪些方法调用出现了问题,需要根据影响用户数量按照从大到小顺序排列出来,优先解决影响面大问题...有了崩溃方法调用堆栈后,大部分问题都能够通过方法调用堆栈,来快速地定位到具体是哪个方法调用出现了问题。

    2.1K20

    ARM Cortex-M 系列 MCU错误代码自动追踪库使用经验分享

    大家在用STM32时候有没有遇到过HardFault问题呢: ? 之前有一段时间被这个问题困扰了很久,下面针对这个问题做个小总结。...其产生原因大概有如下几类: (1)数组越界操作; (2)内存溢出,访问越界; (3)堆栈溢出,程序跑飞; (4)中断处理错误; 针对HardFault问题定位,网上有几种方法,大概都是围绕着:在debug...模式下,查看一些地址,分析寄存器、函数调用栈等,这是很让人头疼事情。...这里分享一种简单、直观HardFault错误定位方法使用开源库:CmBacktrace 。这个库之前已经有介绍过了,这篇笔记我们来实践一下。...那是因为有些预处理宏没有找到,打开、修改cmb_cfg.h文件内容。cmb_cfg.h文件默认内容为: ? 我们修改后cmb_cfg.h内容变为: ?

    1.1K20

    ARM Cortex-M 系列 MCU错误代码自动追踪库使用

    大家在用STM32时候有没有遇到过HardFault问题呢: ? 下面针对这个问题做个小总结。...其产生原因大概有如下几类: ​ (1)数组越界操作; ​ (2)内存溢出,访问越界; ​ (3)堆栈溢出,程序跑飞; ​ (4)中断处理错误; 针对HardFault问题定位...,网上有几种方法,大概都是围绕着:在debug模式下,查看一些地址,分析寄存器、函数调用栈等,这是很让人头疼事情。...这里分享一种简单、直观HardFault错误定位方法使用开源库:CmBacktrace 。这个库之前已经有介绍过了,这篇笔记我们来实践一下。...那是因为有些预处理宏没有找到,打开、修改cmb_cfg.h文件内容。cmb_cfg.h文件默认内容为: ? 我们修改后cmb_cfg.h内容变为: ?

    1.3K21

    GDB入门教程之如何使用GDB启动调试

    要使得 C 和 C++ 程序能在 GDB 下正常进行调试,必须在程序编译期间把基本调试信息(如变量名、函数名、函数调用堆栈等)添加到可执行文件中。...二、GDB调试运行中程序 使用GDB调试正在运行程序时,必须先找到该程序运行在操作系统中进程号 (PID)。...三、GDB调试core文件 当程序在 Linux 系统下发生异常崩溃(如段错误)时,内核会将该应用程序在崩溃发生时内存数据、程序调用堆栈等核心信息转存到磁盘,这种功能称之为 core dump,中文可翻译为...GDB 正常加载 core 文件后,便可以使用 backtrace (缩写形式 bt) 显示程序异常退出时刻函数堆栈情况,再使用 frame、 print、 up、 down、 where 等命令对异常现场进行详细分析...关于 GDB 调试程序和 core 文件具体方法和命令 文章详情:GDB PS:使用 quit (缩写形式 q) 可退出 GDB。

    4.2K10

    iOS 堆栈获取异常分析

    ,很多同学说用backtrace就可以了,其实backtrace有局限性,一是backtrace只能获取当前线程堆栈,如果我们需要监控主线程状态时,需要用一个子线程进行堆栈获取操作(比如主线程卡顿、...,还可以知道上一个栈帧运行完,返回地址,依次类推,就可知道所有栈帧运行完返回方法地址,即我们要所谓方法调用链”,即我们需要堆栈” 参考文章: https://blog.csdn.net/jasonblog...,kscrash等 通过三个知识点,现在,我们可以做到:获取某个线程——获取堆栈——获取堆栈里面所有的方法地址——翻译所有地址——展示出翻译后堆栈 (翻译堆栈时注意:Xcode 调试输出不稳定,有时候存在调用...问题到这里似乎结束了,但并没有根本解决,因为,出现异常栈帧原因并没有找到, 是不是我们获取堆栈方式还是有死角?...inline为了解决一些频繁调用小函数大量消耗栈空间(栈内存)问题, inline 使用是有所限制,inline 只适合涵数体内代码简单涵数使用,不能包含复杂结构控制语句例如 while、switch

    80830
    领券