Cannoli 开源项目使用教程
项目介绍
Cannoli 是一个高性能的 QEMU 内存与指令追踪引擎,专为提高对-qemu-user 的追踪效率设计。它能够记录执行中的程序计数器(PC)和内存操作的踪迹。项目通过向 QEMU 应用小规模补丁来直接在即时编译(JIT)过程中注入代码,同时包含一个共享库,用于决定如何及何时进行仪器化处理,并有一个消费这些由 QEMU 输出流的库,以便在另一进程中进行复杂的跟踪数据分析。Cannoli 设计时考虑了最小干扰原则,确保QEMU的运行几乎不受影响,即便是处理数十亿条目标指令、多线程的qemu-user应用程序,也支持多线程并行处理跟踪数据。
项目快速启动
环境准备
首先,确保你的开发环境已安装Git、Cargo(Rust的包管理和构建工具)以及相应的编译工具链。
-
克隆Cannoli项目仓库:
git clone https://github.com/MarginResearch/cannoli.git
-
进入项目目录 并进行构建:
cd cannoli cargo build --release
-
获取并准备QEMU源码:
git clone https://gitlab.com/qemu-project/qemu.git cd qemu git checkout 78385bc738108a9b5b20e639520dc60425ca2a5a patch -p1 < ../qemu_patches/patch ./configure --target-list=mipsel-linux-user,riscv64-linux-user --extra-ldflags="-ldl" --with-cannoli=<你的cannoli项目路径> make -j4
-
运行示例:
- 在一个终端启动符号化服务:
cd examples/symbolizer cargo run --release
- 另一个终端中,使用Cannoli运行程序:
cd examples/symbolizer <你的qemu路径>/build/qemu-mipsel -cannoli <你的cannoli路径>/target/release/<你的jitter.so> /example_app
- 在一个终端启动符号化服务:
应用案例和最佳实践
Cannoli可以用于性能分析、调试、覆盖率测试等场景。以下以简单的覆盖率收集为例:
-
构建并运行覆盖率示例:
cd examples/coverage cargo run --release
-
运行你的二进制并收集覆盖率信息:
export QEMU_CANNOLI=cannoli/target/release/libcoverage.so <你的qemu路径>/build/qemu-x86_64 /usr/bin/vlc
典型生态项目
Cannoli因其特性,在虚拟化技术、安全审计、性能分析等领域找到广泛应用。尽管本说明未直接提及特定的“典型生态项目”,但结合其功能,可以想象到,任何依赖于深度系统监控或需模拟环境中精准控制执行路径的应用都能从Cannoli中获益,如安全研究者的动态分析工具,或开发者对于复杂软件的行为分析工具。
以上步骤提供了快速了解和启动Cannoli的基本指南,深入应用则需要根据具体需求实现相应的钩子函数和数据解析逻辑。