Gray

Beijing, China
Gray

iOS 调用栈回溯

前言 在做「大内存分配监控系统」时,我深入学习了一下堆栈回溯相关的底层原理,以及符号化相关的知识。这篇文章是当时记下的学习笔记。 调用栈回溯的目的是追踪某个函数的调用链。比如函数 A 调用了函数 B,函数 B 又调用了函数 C,调用链就是 A → B → C。调用栈回溯拿到的一般是函数的内存地址信息,无法看到函数名,需要再做一次符号化操作。 本文参考: App LibcArm DeveloperProcessor_registerDive into System CPU 寄存器 CPU 寄存器是 CPU 芯片上数据存储的小型区域,位于内存结构的顶部,具有最快的数据访问速度,用来暂时存放参与运算的数据和运算结果。 ARM64 指令集提供了下列用于调用栈的寄存器: x0~x30 通用寄存器负责的功能如下: * x0~x7: 参数寄存器,用于把参数传递给函数并返回结果。可以用作临时寄存器或调用者保存的寄存器变量,可以在调用其他函数之间的函数内保存中间值。

By Gray

Python 零食铺

终端相关 输入输出 清理终端用户输入缓冲区的数据 如果希望在调用 input 前清理输入缓存区的数据,可以使用如下代码: import termios termios.tcflush(sys.stdin, termios.TCIFLUSH) input('your input prompt') 函数功能描述如下: termios.tcflush(fd, queue): 丢弃文件描述符fd中的数据队列。变量queue表示具体待处理的队列,如TCIFLUSH表示输入队列,TCOFLUSH表示输出队列,TCIOFLUSH同时表示输入输出队列。 参考:https://blog.csdn.net/u010158659/article/details/50829950 命名规范 类别 规范 示例 模块名 小写字母,单词之间用下划线_分割 my_script.

By Gray

Swift Concurrency 异步感染问题

Swift Concurrency 异步感染问题 当我们在一个非 async 的方法 A 里面调用 async 的方法 B 时,Xcode 会提示我们无法这么做: 'async' call in a function that does not support concurrency,并且引导我们给 A 加上 async 标识。 ⬆️ 这就是异步感染问题,async 方法的调用方在不知不觉中也变成了 async 方法。 为了避免 async 向上一直感染,可以使用 Task 方式调用 async 方法: func A() { Task { await B() } } func

By Gray

利用 memgraph 文件追踪 App 内存信息

memgraph 文件导出方法 1. 在 App 调试状态下点击 View Memory Graph Hierarchy 或者点击这里 2. 生成 memgraph 文件后,点击 File → Export Memory Graph memgraph 文件可以用 Xcode 直接打开,但是直接打开查看的话,信息比较混杂,难以查找到自己想要的信息。下面就介绍一些在终端利用 memgraph 文件查看各种内存信息的指令。 使用 vmmap 查看虚拟内存信息 拿到 memgraph 文件后,在终端输入下面指令可以获取 App 进程占用的虚拟内存信息: vmmap filename.memgraph > output_vmmap.txt 输出文件中,首先展现的是不可写的内存区域,比如一些 framework,

By Gray

C++ 零食铺

类型修饰符 decltype 类型指示符 decltype 即 declare type,译为“声明类型“。decltype 是为了解决这样的场景:根据表达式的类型推断出想要定义的变量的类型,但并不使用表达式的值去初始化这个变量,即灵活定义变量的类型。 例如, const int ci = 0, &cj = ci; decltype(ci) x = 0; // x 的类型是 const int decltype(cj) y = x; // y 的类型是 const int&, 并且 y 绑定到变量 x decltype(cj) z; // 错误用法。z 和 y

By Gray