跳至主要內容
Surface View 异常释放引起的 Segv Fault

背景

最近在研究通过 Rust 进行 Android Native 渲染的相关内容,基本方法是,在 Android 里创建一个 Surface View,然后在 OnSurfaceCreated 方法处,将一个 SurfaceHolder 通过 JNI 传到 Rust 层,获取 ANativeWindow 指针,同时搭配raw_window_handlerwgpu进行渲染。当然这里还有很多细节,例如 Rust 侧事件循环的设计等等,后续有时间可以单独出一篇特辑。

Bug 出现

Bug 的出现首先要从 Andoird 的刷新原理开始讲起(无特别说明,以下部分的安卓版本均为测试机版本——Android 12)


Chiichen大约 2 分钟杂谈Debug杂谈Android
解决MacOS中找不到头文件的问题

背景

在交叉编译 LVGL 的时候一直出现找不到头文件的问题,但是 Intellisense 却又能定位到头文件位置

解决方法

因为 MacOS 中的头文件不在usr/include等目录下,而是在/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/目录下,创建这个软连接后就解决了问题

sudo ln -s /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/* /usr/local/include/

Chiichen小于 1 分钟杂谈Debug杂谈MacOSDebug
基于Ninja的代码Intellisense实践

插件安装

在 VSCode 中安装 clangd 作为前端,要记得关闭 C/C++的 Intellisense

生成 compile_commands.json

在 Ninja 输出目录,以out为例,执行

ninja -C out -t  compdb cxx cc > compile_commands.json

Chiichen原创小于 1 分钟杂谈杂谈/编程杂谈
解决在VSCode里刷Leetcode的重定义问题

背景

最近刷了几道 Leetcode,感觉没有补全写得太不舒服了,所以用 Leetcode 官方插件搭配 VSCode 写,用 xmake 构建,用 clangd 提供代码补全,写起来体验很好,但是还是有一个小问题

问题

比如以下默认代码


// Definition for a binary tree node.
// struct TreeNode {
//   int val;
//   TreeNode *left;
//   TreeNode *right;
//   TreeNode() : val(0), left(nullptr), right(nullptr) {}
//   TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
//   TreeNode(int x, TreeNode *left, TreeNode *right)
//       : val(x), left(left), right(right) {}
// };

class Solution {
public:
  bool isValidBST(TreeNode *root) {}
};

Chiichen原创大约 1 分钟杂谈杂谈/编程杂谈
eBPF进阶

背景

在上一篇博客中我们跟着官方的 example 完成了一个 eBPF 应用的运行,接下来就要尝试为自己的需求编写一个 eBPF 应用了。我的需求是获取一个应用负载在内存地址空间上的访存频率。初步的想法是利用 Numa Balancing 中的 Page 标记,通过 Page-fault 计数来实现这个功能。

前期构建

首先,我们是需要知道哪个 tracepoint 可以提供给我们的 eBPF 程序来挂载。

通过命令来获取内核提供的 Tracepoint:

$ sudo  find /sys/kernel/debug/tracing/events -type d | grep page_fault
/sys/kernel/debug/tracing/events/kvmmmu/handle_mmio_page_fault
/sys/kernel/debug/tracing/events/kvmmmu/fast_page_fault
/sys/kernel/debug/tracing/events/kvm/kvm_page_fault
/sys/kernel/debug/tracing/events/iommu/io_page_fault
/sys/kernel/debug/tracing/events/exceptions/page_fault_user # 这是我们想要的
/sys/kernel/debug/tracing/events/exceptions/page_fault_kernel

Chiichen大约 2 分钟杂谈Linux内核Linux内核eBPF
eBPF开发入门

依赖安装

Rust 安装

需要安装 Nightly 版本,略

系统依赖安装

安装 bpf-linker 依赖和 bpftool 工具

sudo apt-get update
sudo apt-get install llvm clang -y
cargo install bpf-linker

Chiichen大约 6 分钟杂谈Linux内核Linux内核eBPF
Github 中配置 Cargo 项目的 Workflow

项目背景

rcc 编译器

示例

name: Rust

on: [push, pull_request]

env:
  CARGO_TERM_COLOR: always

jobs:
  check:
    runs-on: ubuntu-latest
    steps:
      - name: Check out
        uses: actions/checkout@v3
      - name: Set up cargo cache
        uses: actions/cache@v3
        with:
          path: |
            ./target
            ~/.cargo
          key: debug-${{ runner.os }}-${{ hashFiles('rust-toolchain.toml') }}-${{ hashFiles('Cargo.lock') }}
          restore-keys: |
            debug-${{ runner.os }}-${{ hashFiles('rust-toolchain.toml') }}-
            debug-${{ runner.os }}-
      - name: Install Rust
        uses: actions-rs/toolchain@v1
        with:
          profile: minimal
          toolchain: nightly
          override: true
          components: rustfmt, clippy
      - name: Lint
        run: |
          cargo fmt --all -- --check
          cargo clippy -- -D warnings
      - name: Install cargo check tools
        run: |
          cargo install --locked cargo-deny || true
          cargo install --locked cargo-outdated || true
          cargo install --locked cargo-udeps || true
          cargo install --locked cargo-audit || true
          cargo install --locked cargo-pants || true
      - name: Rustfmt
        run: cargo fmt --all -- --check
      - name: Check
        run: |
          cargo deny check
          cargo outdated
          cargo udeps
          rm -rf ~/.cargo/advisory-db
          cargo audit
          cargo pants
      - name: Test
        run: cargo test
      - name: Build
        run: cargo build --verbose

Chiichen小于 1 分钟杂谈编程杂谈Github Workflow
记一次 GP Debug 的心路历程

背景

背景是在重构完 Signal 之后,一开始用我们自己的 libc 测试 signal 功能没有问题,但是在用 relibc 测试的时候出问题了,出错的原因就是一个 Userland 的 General Protection(GP),这个东西是一个硬件异常,通常是由于汇编指令出错或者内存访问出错导致,比如把一个未对齐的内存地址作为某个指令的操作数,而这个指令要求这个内存地址是 8/16 对齐的。

初步分析

在查看 GP 的 RIP ,反汇编了用户空间的测试程序之后,看到了对应的汇编代码是

movapd %XMM0 0xe0(rsp)

Chiichen大约 7 分钟杂谈Debug杂谈General ProtectionDebug