首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏hank

    【分享】使用GNU backtrace打印当前的函数调用关系(backtrace

    在Linux应用程序中,也可以打印当前的函数调用关系(backtrace),GNU为此提供了backtrace ( )和backtrace_symbols( )。 以前曾经测试过,发现没有生效,backtrace ( )返回0。 最近测试,发现backtrace ( )能返回大于0的数,说明工作正常。 GNU backtrace 代码 GNU关于生成函数调用关系(backtrace)的文章在GNU backtrace。 -MMD -MP -MF"src/gnu_print_backtrace.d" -MT"src/gnu_print_backtrace.o" -o "src/gnu_print_backtrace.o /gnu_backtrace/Debug/ -mcpu=cortex-a72 -rdynamic -o "gnu_backtrace_test.elf" .

    2.2K20编辑于 2022-05-09
  • 来自专栏owent

    C++的backtrace

    unwind.h和_Unwind_Backtrace 第三种是用POSIX的 unwind.h: _Unwind_Backtrace。这个虽然MinGW里有,但是返回的数据是空的。 Linux下使用backtrace g++ -Wall test_backtrace.cpp -O0 -g -ggdb -rdynamic -o test_backtrace.exe clang++ - Wall test_backtrace.cpp -O0 -g -ggdb -rdynamic -o test_backtrace.exe 命令和输出: . -O0 -g -ggdb -o test_backtrace.exe clang++ -Wall test_backtrace.cpp -O0 -g -ggdb -o test_backtrace.exe 命令和输出: test_backtrace.exe Frame 00: (test_backtrace!

    7.8K40发布于 2018-08-01
  • 来自专栏sofu456

    StackWalker和Backtrace进行堆栈分析

    StackWalker windows堆栈信息跟踪,程序异常退出时,生成dumpbin的堆栈信息可分析定位 github源码:https://github.com/JochenKalmbach/StackWalker Backtrace

    1.2K10发布于 2020-07-16
  • 来自专栏DPDK VPP源码分析

    backtrace打印函数调用栈

    在glibc头文件"execinfo.h"中声明了backtrace用于获取当前线程的函数调用堆栈 int backtrace(void **buffer,int size) 该函数用于获取当前线程的调用堆栈 下面是vpp代码中clib_backtrace函数的定义,。 /* 使用 glibc backtrace 函数打印调用栈信息 */ #include <execinfo.h> uword clib_backtrace (uword * callers, uword /a.out /*这里打印具体的函数名和代码行*/ file:backtrace.c,Line:52,fuc:trace_3 . /a.out() [0x8048741] /*这里是系统assert的打印如下*/ a.out: backtrace.c:77: main: Assertion `0' failed. .

    2.2K30编辑于 2023-03-07
  • 来自专栏老高的技术博客

    使用debug_backtrace()做PHP调试

    主角 debug\_backtrace()和debug\_print\_backtrace()两兄弟。 主要功能:他们保存了函数的调用栈信息,一个不输出以数组形式保存,另一个直接输出调用栈,调试的时候一般使用debug\_print\_backtrace()。 debug\_backtrace()使用print_r显示如下: Array ( [0] => Array ( [file] => D:\phpnow\vhosts 直接使用debug\_print\_backtrace()看看: #0 load_textdomain(crayon-syntax-highlighter, D:\phpnow\vhosts\wordpress.com 高级应用 请参考此篇 PHP debug_backtrace的胡思乱想

    87910编辑于 2022-12-27
  • 来自专栏嵌入式iot

    arm上backtrace的分析与实现原理

    第一种可以不用讲,现在主要讲一下backtrace。 01 backtrace简介 backtrace就是回溯堆栈,简单的说就是可以列出当前函数调用关系。 在理解backtrace之前我们需要理解一下函数执行过程的中的压栈过程。 1.1 寄存器与汇编指令 ARM微处理器共有37个寄存器,其中31个为通用寄存器,6个为状态寄存器。 02 backtrace的过程详解 当程序出现异常或者死机的时候,我们可以读取当前寄存器的状态,找到当前pc指针的情况,但是这些往往还不能说明问题,我们有时需要跟踪函数的执行过程。 04 总结 对于arm32体系架构的backtrace基本原理可以参考如上的描述,其中最核心的部分是每个函数的栈中寄存器地址指向的是上个函数的地址,所以利用这个特性,就可以一级一级的跟踪下去,从而实现栈的回溯功能

    7.8K30发布于 2020-03-17
  • 来自专栏coderhuo

    arm平台根据栈进行backtrace的方法

    本文主要介绍在arm平台回溯函数调用栈(backtrace)的方法。 一、 背景 嵌入式设备开发过程中,难免会遇到各种死机问题。这类问题的定位一直是开发人员的噩梦。 死机问题常见定位手段如下: 根据打印/日志信息梳理业务逻辑,排查代码; 设备死机的时候输出函数调用栈(backtrace),结合符号文件表/反汇编文件定位问题; 输出死机时的内存镜像(coredump) 不过大部分嵌入式实时操作系统(RTOS)不支持生成coredump,下面主要介绍backtrace。 二、 backtracebacktrace最方便的就是使用gcc自带的backtrace功能,编译的时候加上-funwind-tables选项(该选项对性能无影响但是会使可执行文件略微变大),异常处理函数中调用相关函数即可输出函数调用栈 下面介绍一种不依赖于第三方工具,不依赖编译工具链的backtrace方法。 1. 栈帧 函数调用过程是栈伸缩的过程。调用函数的时候入参、寄存器和局部变量入栈,栈空间增长,函数返回的时候栈收缩。

    6.8K20发布于 2018-08-29
  • 来自专栏嵌入式iot

    STM32上的backtrace原理与分析

    STM32上的backtrace原理与分析 1.说明 2.cortex-m上的栈布局 2.1 cortex-m上的寄存器 2.2 cortex-m上的自动压栈 2.3 cortex-m上的函数执行流程 对于这种情况,backtrace是十分必要的。可以在离线的状态下分析系统的关键信息,通过函数的栈回溯,从而找到出错的对应的执行函数,然后结合程序设计,基本上大部分的bug基本上也可以找到。 我之前写过一篇文章arm上backtrace的分析与实现原理。分析了在cortex-a上的分析情况。 3.cmbacktrace原理分析 在做cortex-m上的backtrace的时候,查阅了一些资料,其中发现一个CmBacktrace。 但是如果想要分析其他的线程的栈的backtrace,则需要注意操作系统的压栈问题。 例如在rt-thread中,进行线程切换的时候,会调用pendsv进行自动压栈一次,然后在手动压栈其他的寄存器。

    3.1K62发布于 2020-10-30
  • 来自专栏Greenplum

    使用 backtrace_functions 对 Postgres 错误进行堆栈跟踪

    nothere; ^ LOCATION: parserOpenTable, parse_relation.c:1452 但我上周在电话会议期间也刚刚了解到了backtrace_functions 也就是说,只有当一个函数(以逗号分隔的值命名 backtrace_functions)是日志的来源函数。 因此,我们可以将backtrace_functions设置为 parserOpenTable 并重新加载 Postgres 配置。 postgres=# ALTER SYSTEM SET backtrace_functions='parserOpenTable'; ALTER SYSTEM postgres=# SELECT pg_reload_conf 84985] ERROR: relation "nothere" does not exist at character 15 2025-07-31 13:46:42.657 EDT [84985] BACKTRACE

    29710编辑于 2025-09-11
  • 来自专栏Rust语言学习交流

    【Rust日报】2022-11-01 async-backtrace 发布

    async-backtrace 发布 tokio 官方团队近日发布了 async-backtrace 的初个版本,旨在让开发者能够高效地追踪应用中异步任务的状态。 使用步骤如下: 首先将该 crate 加入到 Cargo.toml 文件中: [dependencies] async-backtrace = "0.2" 使用 #[async_backtrace::framed ("{}", async_backtrace::taskdump_tree(true)); } }; } #[async_backtrace::framed] async fn backtrace/examples/multiple.rs:22:1 └╼ multiple::bar::{{closure}} at backtrace/examples/multiple.rs :27:1 └╼ multiple::baz::{{closure}} at backtrace/examples/multiple.rs:32:1 需要注意的是,async-backtrace

    56420编辑于 2022-11-28
  • 来自专栏技术派

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

    debug_backtrace可以解决。debug_backtrace() 可以打印出一个页面的调用过程 , 从哪儿来到哪儿去一目了然。 有时候我们想知道这个函数或方法的调用堆栈,也就是它是如何一级一级是被调用到的,可以用 PHP 的 debug_backtrace 函数打印,就像这样: 示例代码 public function update (Request $request, $id) { dd(debug_backtrace()); $getGameID = function ($request) { if (! ; } 你可以控制需要回溯的堆栈层级数量,其中 debug_backtrace 第一个参数默认是一个常量 DEBUG_BACKTRACE_PROVIDE_OBJECT,表示显示这个对象的信息,第二个参数用于控制回溯的堆栈数量

    78230发布于 2021-07-06
  • 来自专栏陶士涵的菜地

    debug_backtrace()可以获取到代码的调用路径追踪

    查看代码的时候,看到有使用这个函数,测试一下 1.debug_backtrace()可以获取到代码的调用追踪,以数组形式返回 2.debug_print_backtrace() — 打印一条回溯,直接打印出来 php class Test{ public function __construct(){ $ts=debug_backtrace(); var_dump($ts); debug_print_backtrace(); } public function load($class

    1K20发布于 2019-09-10
  • 来自专栏wenzi嵌入式软件

    STM32 在 keil 环境下如何使用 cm_backtrace进行错误追踪

    image-20210306101326283 紧接着,我们来看下 cm_backtrace的源代码: ? image-20210306101659128 上述中,cm_backtrace文件夹中存放的是源代码,我们需要将其全部复制到我们的工程目录,demos是使用的例子,里面分为有操作系统和无操作系统两种类型 image-20210306102919999 至此,cm_backtrace的源代码就添加完了,我们来编译一下。编译结果如下所示: ? { /*初始化USART 配置模式为 115200 8-N-1,中断接收*/ USART_Config(); /* CmBacktrace initialize */ cm_backtrace_init image-20210306105719377 然后,我们找到 cm_backtrace文件夹下的tools工具,将其复制到USART.axf所在的目录,复制之后的文件夹目录如下所示: ?

    2.6K21发布于 2021-03-22
  • 来自专栏全栈程序员必看

    addr2line 动态库[通俗易懂]

    char **strings; nptrs = backtrace(buffer, BACKTRACE_SIZE); printf("backtrace() returned %d addresses $ gcc -g -rdynamic backtrace.c add.c dump.c -o backtrace zoulm@zoulm-VirtualBox:/home/share/work/backtrace /backtrace(add1+0x1a) [0x400a3e] [04] ./backtrace(add+0x1c) [0x400a71] [05] . -o backtrace 其中参数 -L. 然后执行backtrace程序结果如下: zoulm@zoulm-VirtualBox:/home/share/work/backtrace$ .

    3.4K20编辑于 2022-11-15
  • 来自专栏硬核项目经理的专栏

    PHP打印跟踪调试信息

    function a_test($str) { echo "Hi: $str", PHP_EOL; var_dump(debug_backtrace()); } var_dump(debug_backtrace debug_backtrace() 的函数声明是: debug_backtrace ([ int $options = DEBUG_BACKTRACE_PROVIDE_OBJECT [, int $limit = 0 ]] ) : array 其中 \$options 是有两个常量可以定义,DEBUG_BACKTRACE_PROVIDE_OBJECT 表明是否填充 "object" 的索引;DEBUG_BACKTRACE_IGNORE_ARGS debug_backtrace() 以及下面要介绍的 debug_print_backtrace() 方法都是支持 require/include 文件以及 eval() 中的代码的,在嵌入文件时,会输出嵌入文件的路径 debug_print_backtrace() 这个方法从名称也可以看出,它会直接打印回溯内容,它的函数声明和 debug_backtrace() 是一样的,不过 $options 默认是 DEBUG_BACKTRACE_IGNORE_ARGS

    2.5K30发布于 2020-07-06
  • 来自专栏CodeTime

    回溯算法的经典应用 - 排列与组合

    假设是走迷宫,这个回溯算法的模板应该是这样: def backtrace(path,depth,length): if depth==length: #路径结束(走到头),验证结果 我们定义的回溯方法backtrace包含2个参数,参数i表示当前的起始数字,作为可选数字的下限,i之前的数字表示已经选择过,不再重复选择,所以j从i开始遍历;参数arr是一个临时数组,用于存储一个组合的结果 def combine(self, n: int, k: int) -> List[List[int]]: res=[] def backtrace(i,arr): if (j+1,arr),进入回溯仍然从j开始,backtrace(j,arr,t+candidates[j])。 (j,...)或backtrace(j+1,...)

    1.5K40编辑于 2023-03-29
  • 来自专栏全栈程序员必看

    sigaction检测段错误示例[通俗易懂]

    #endif extern void dump_backtrace(void); #include "common.h" void dump_backtrace(void) { int j, nptrs ; void *buffer[32]; char **strings; nptrs = backtrace(buffer, ARRAY_SIZE(buffer) ); printf("backtrace () returned %d addresses:\n", nptrs); strings = backtrace_symbols(buffer, nptrs); if (NULL == strings ) { perror("backtrace_symbols"); exit(-1); } for (j = 0; j < nptrs; j++) { printf(" void * context) { LOG("Signal Number: %d\n", signum); LOG("Address: %p\n", siginfo->si_addr); dump_backtrace

    1.2K20编辑于 2022-09-01
  • 来自专栏IOT物联网小镇

    【粉丝问答18】linux下查看函数被那些函数调用过?

    char** backtrace_symbols (void *const *buffer, int size); 函数功能:将从backtrace函数获取的信息转化为一个字符串数组。 参数:buffer:从backtrace函数获取的数组指针。size:是该数组中的元素个数(backtrace函数的返回值)。返回值:是一个指向字符串数组的指针,它的大小同buffer相同。 2、backtrace_symbols生成的字符串都是malloc出来的,最后需要free该块内存。 void backtrace_symbols_fd (void *const *buffer, int size, int fd) 功能:backtrace_symbols_fd与backtrace_symbols (array, size); char ** stacktrace = backtrace_symbols(array, stack_num); backtrace_symbols_fd(array

    2K20发布于 2021-05-13
  • 来自专栏linux驱动个人学习

    如何快速定位 Linux Panic 出错的代码行

    () dump_backtrace()会打印整个回调,例如: [<001360ac>] (unwind_backtrace+0x0/0xf8) from [<00147b7c>] (warn_slowpath_common 如果要在应用中获取Backtrace,可以参考Generating backtraces。 其例子如下: #include <execinfo.h> #define BACKTRACE_SIZ 64 void show_backtrace (void) { void * array[BACKTRACE_SIZ]; size_t size, i; char **strings; size = backtrace(array , BACKTRACE_SIZ); strings = backtrace_symbols(array, size); for (i = 0; i < size; i++)

    1.6K40编辑于 2023-09-10
  • 来自专栏知识同步

    回溯模板

    public: set<vector<int>> res; vector<vector<int>> permuteUnique(vector<int>& nums) { backtrace 0,nums.size()-1, nums); return vector<vector<int>>(res.begin(), res.end()); } void backtrace ; } for(int i=index;i<=n;i++){ swap(nums[i], nums[index]); backtrace int>> permute(vector<int>& nums) { vector<vector<int>> res; vector<int> ans; backtrace (nums, res, ans); return res; } void backtrace(vector<int>& nums, vector<vector<int>>

    41120编辑于 2022-12-26
领券