上一篇文章《在Linux程序中输出函数调用》,讲述了在Linux中如何利用backtrace获取调用,本篇文章主要介绍一下获取函数调用的原理,并给出相应的实现方式。 要了解调用,首先需要了解函数的调用过程,下面用一段代码作为例子: #include <stdio.h> int add(int a, int b) { int result = 0; resu
参考:http://home.ustc.edu.cn/~hchunhui/linux_sched.htmlhttps://www.tiehichi.site/2020/10/22/Linux进程空间大小/实验环境:os: centos8.5 / kernel: 4.18.0 / gcc: 8.5.0 / arch: x86-641. 的概念数据结构上,是一个特殊的数组,数组的头和尾分别为
以前面试的时候,碰到过一个问题。函数的调用过程是怎样的?听到问题的时候有点懵,这算是问题吗。马上胡乱诌了一通。说完以后面试官看我的表情 ﹁_﹁。多年以后看到了一些文章,发现应该从汇编角度解释这个问题,更容易理解。值得记下来。 函数调用过程需要用函数调用来解释。函数调用是程序运行时一段连续的内存区域,是后进先出的数据结构。内存的生长方向是从低地址向高地址,而是相反的,从高地址向低地
在头文件"execinfo.h"中声明了三个函数用于获取当前线程的函数调用堆栈。#include <execinfo.h> int backtrace(void **buffer, int size); char **backtrace_symbols(void *const *buffer, int size); void backtrace_symbols_fd(void *con
转载 8月前
91阅读
## iOS 获取函数调用 在开发iOS应用程序时,我们经常需要了解函数的调用顺序或者查找bug的根源。为了实现这个目的,可以通过获取函数调用来帮助我们更好地理解代码执行过程。在iOS开发中,我们可以通过一些方法来获取函数调用信息。 ### 获取函数调用的方法 #### 1. 使用NSThread 我们可以使用`NSThread`类中的`callStackSymbols`方法来获取
原创 2024-05-17 06:38:48
153阅读
根据不同的操作系统,一个进程可能被分配到不同的内存区域去执行。但是不管什么样的操作系统、什么样的计算机架构,进程使用的内存都可以按照功能大致分为以下4个部分:  (1)代码区:这个区域存储着被装入执行的二进制机器代码,处理器会到这个区域取指并执行。  (2)数据区:用于存储全局变量等。  (3)堆区:进程可以在堆区动态地请求一定大小的内存,并在用完之后归还给堆区。动态分配和回收是堆区的特点。  (
转载 2023-08-24 21:37:25
141阅读
当集中精力看一个问题的时候,时间久了就会有这样一个状态,天空飘来五个字,那都不算事ceph源码庞大的体量以及复杂的设计让很多
原创 2022-11-04 11:31:02
97阅读
# 如何实现iOS backtrace ## 一、流程 为了实现iOS backtrace,我们可以按照以下步骤进行操作: ```mermaid erDiagram 确定问题 --> 获取堆栈信息 --> 解析堆栈信息 --> 显示堆栈信息 ``` ## 二、具体步骤 1. **确定问题**:首先需要确定需要调试的问题,比如程序崩溃或者出现了异常情况。 2. **获取堆栈信息*
原创 2024-05-01 06:13:12
58阅读
glibc提供了backtrace这个库函数,可以用来打印call stack。比如我们可以在程序中注册常见的一些signal,比如SIGSEGMENT, SIGPIPE,然后在这些信号的回调函数中,利用backtrace打印出call stack,这样debug就非常的方便。backtrace的使用很简单,使用man手册中的Example代码即可,例如: 1 #include 2 #include 3 #include 4 #include 5 #include 6 7 #define SIZE 100 8 9 void dump_stack()10 {11...
转载 2010-12-09 17:09:00
521阅读
2评论
如果要获取当前线程的调用,可以直接使用现有API:[NSThread callStackSymbols]。但是并没有相关API支持获取任意线程的调用,所以只能自己编码实现。1. 基础结构一个线程的调用是什么样的呢?我的理解是应该包含当前线程的执行地址,并且从这个地址可以一级一级回溯到线程的入口地址,这样就反向构成了一条链:线程入口执行某个方法,然后逐级嵌套调用到当前现场。(图片来源于维基百科
转载 2023-07-18 11:56:22
298阅读
转自:https://blog.csdn.net/littlefang/article/details/42295803 有四种方法可以获得Linux的函数调用堆栈,参见CALL STACK TRACE GENERATION。 在这里简单罗列一下文中提到的四个方案: 方法1 GCC内置函数__bui
转载 2018-12-29 14:24:00
379阅读
2评论
由于我们在上面回溯线程调用拿到的是一组地址,所以这里进行符号化的输入输出应该分别是地址和符号,接口设计类似如下:- (NSString *)symbolicateAddress:(uintptr_t)addr;不过在实际操作中,我们需要依赖于dyld相关方法和数据结构:/* * Structure filled in by dladdr(). */ typedef struct dl_inf
原创 2022-08-06 00:26:24
216阅读
backtrace:查看函数的调用顺序(函数调用的信息)frame N (实际上是上下文跳转的命令):切换到编号为N的上下文中info frame:查看当前函数调用帧信息。所谓帧就是与函数调用相关的上的消息什么是帧信息  深入info命令命令 功能说明 info registers 查看当前寄存器的值 info args
转载 2023-06-01 12:46:32
189阅读
探究iOS线程调用及符号化概念调用,也称为执行栈、控制、运行时与机器,是计算机科学中存储运行子程序的重要的数据结构,主要存放返回地址、本地变量、参数及环境传递,用于跟踪每个活动的子例程在完成执行后应该返回控制的点。 一个线程的调用如上图所示,它分为若干帧(frame),每个帧对应一个函数调用,如蓝色部分是DrawSquare函数的帧,它在运行过程中调用了DrawLin
前言老规矩了,上篇博客我说到了执行上下文和可执行代码,变量提升,但我也只讲到了这些基础的部分,比如执行怎么执行?在哪里执行?整个执行流程是咋样的?一般来说,js代码有这三种情况js执行全局代码的时候,编译全局代码并创建全局执行上下文,而且在整个页面的生存周期内,全局上下文只有1份调用一个函数时,函数体内的代码又会被编译,并且创建函数执行上下文,一般情况下,函数执行完之后,这个函数的函数执行上下文会
# iOS 获取主线程的函数调用 作为一名经验丰富的开发者,我很高兴能帮助你了解如何在 iOS获取主线程的函数调用获取调用在调试时非常有用,尤其是在追踪崩溃和性能问题时。接下来我将详细介绍整个流程、所需的代码,以及代码的具体功能。 ## 整体流程 在实现这个功能之前,我们首先需要明确整个实现流程。以下是获取主线程调用的基本步骤: | 步骤 | 描述
原创 10月前
47阅读
梳理一下苹果登录的逻辑, 这一篇是Go版本的,之前我整理了一篇Kotlin版本的,Kotlin与Java兼容,可以互相调用,方法也都可以找到,如果需要Java版本可以先看这一篇。apple登录有两种校验方式,分别是id_token 和 code校验。方式一: id_token校验方式二 code校验:第一种方式是由客户端直接发起登录拿到id_token和userInfo,服务端只进行一个简单的to
转载 2023-10-19 19:56:10
64阅读
# 实现iOS打印调用 ## 介绍 作为一名经验丰富的开发者,我将会教你如何在iOS中打印调用。这是一个很有用的技巧,可以帮助你快速定位问题,并进行调试。下面我会详细介绍整个过程以及每一步需要做的事情。 ## 流程 首先,让我们来看一下整个实现iOS打印调用的流程: | 步骤 | 操作 | | ------ | ------ | | 1 | 获取当前 Thread 的调用 | | 2
原创 2024-05-08 07:28:56
115阅读
# iOS打印调用iOS开发中,调用是一个非常重要的概念。调用是用来跟踪代码执行路径的一种数据结构,它记录了程序中每个函数的调用关系。通过打印调用,我们可以更容易地定位程序出现问题的地方,从而更快地解决bug。 ## 什么是调用调用是一个先进后出的数据结构,它用于存储函数调用的信息。每当一个函数被调用时,相关信息(如函数名、参数等)会被压入调用;当函数执行完毕时,这些信
原创 2024-02-28 05:30:01
171阅读
  • 1
  • 2
  • 3
  • 4
  • 5