cmake 构建工具中 CMAKE_BUILD_TYPE 变量支持下面四种构建类型:

  • Debug:调试版本,没有优化,开启断言,最全调试信息。
  • Release:正式版本,最高优化,没有调试信息,关闭断言。
  • RelWithDebInfo:既优化又能调试的版本,关闭断言。
  • MinSizeRel:最小体积版本,目的在于优化体积而不是优化速度。
阅读全文 »

dyninst-12.3.0 最新版存在的问题

dyninst-12.3.0 版本中 README 和 Building Dyninst 部分的说明不准确,可能官方更新版本后,未及时更新文档,导致关于依赖库的版本介绍有错,比如 elfutils 需要 1.8.6 而不是 0.173,Boost 需要 1.70.0 而不是 1.61.0,另外 Intel Thread Building Blocks (TBB) 最新版 2021.8 编译完并不识别。

阅读全文 »

若想实现 dyninst 离线安装,只需要把源码目录下 cmake/packages.cmake 依赖包的下载规则改下,把 URL 改成 SOURCE_DIR。然后在对应的路径下放上解压的依赖源码。

阅读全文 »

为了解决内存碎片化问题,充分利用物理内存资源,Linux 提供了虚拟内存功能,并建立虚拟地址和物理地址直接的映射关系。进程无法直接访问物理地址,而是通过虚拟地址间接访问。一般虚拟地址都要比物理地址范围大,虚拟地址和物理地址并非总是一一对应关系,有时候虚拟地址尚未映射的物理地址,而只是一个空壳。当访问到尚未映射的虚拟地址时,就会触发缺页中断机制。

阅读全文 »

call、ret、jump 指令介绍

  • call 用于调用子程序,在调用前会保存返回地址(x86 架构下,段内跳转时只保存 EIP;段间跳转还会保存 CS)。ret 会返回到 call 指令的下一行,也就是跳转前已保存的返回地址。通常在函数调用时,callret 都是成对出现的。

  • jmp 会直接进行跳转,不会保存返回地址,jmp 之后的指令如果跟了 ret,那就直接退出到上一个 call 指令对应的下一行。

阅读全文 »

单步调试原理

单步调试可以让程序运行一条指令 / 语句后就停下。GDB 中常用的命令有 next, step, nexti, stepi。单步跟踪又常分为语句单步 (next, step) 和指令单步 (如 nexti, stepi)。

在 Linux 上,指令单步可以通过 ptrace 来实现。通过系统调用 ptrace (PTRACE_SINGLESTEP,pid,…) 可以使被调试的进程在每执行完一条指令后就触发一个 SIGTRAP 信号,让 GDB 运行。

阅读全文 »

coroutine 协程库简介

协程有时候被称为轻量级线程,它由程序员进行调度(切换),而不像线程那样需要内核参与,同时也避免内核进行线程切换的开销。因为协程切换保留的是当前上下文环境,也就是函数调用栈和当前的寄存器,而线程切换需要陷入内核态,改变线程对象状态。

go 把协程作为基础设施提供语言级的支持,cpp 没有提供语言级的支持,而是通过准标准库 boost coroutine2 库(boost coroutine 已经废弃,建议使用 boost coroutine2)为 cpp 提供的协程支持。

协程分为对称协程(symmetric)和非对称协程(asymmetric),对称协程需要显式指定将控制权 yeild 给谁,非对称协程可以隐式的转移控制权给它的调用者,boost coroutine2 实现的是非对称协程。

阅读全文 »
0%