使用 cmusee 快速理解复杂 C/C++ 代码

当开发者需要查看程序的内部运行过程时(例如程序出现 bug 时,或者需要理解他人编写的代码时),一般使用以下两种方法:

  1. 单步调试器(gdb 等),但是单步调试器需要麻烦且复杂的操作,才能定位到需要查看的代码,如果错过需要查看的位置,还要从头开始;

  2. 打 log,但是可以获得的信息较少,并且程序需要重新编译,如果插入的语句不足以找到关键问题,还需要继续插入代码然后重新编译;

    这两种常用的方法都是麻烦且低效的,如果需要理解整个程序的运行过程(例如在理解他人编写的代码时),则需要花费大量时间。

cmusee 可以完美解决这些问题

工作原理

简单来说,cmusee 在程序运行时,记录所有运行时信息,在查看时,可以像翻书一样翻到任意一页

省去了打 log 或操作调试器的过程

在理解开源代码,或者同事的代码,或者找自己的 bug 时,可以省掉大量时间

下载安装

在 [https://veefuse.com/zh-CN/cmusee/download) 下载

按官方说明,把 bin 目录加入 PATH 变量就可以了,当然不加直接解压使用也可以

编译项目

在原有编译指令前加上 cmbuild --

例如: cmbuild -- make -j10

或者,用 cmc 直接代替 gcc

例如 gcc test.c -o test

改为 cmc test.c -o test

用 cmc++ 直接代替 g++

cmc++ test.cpp -o test

以这段简单的代码为例:

复制代码
// test.c
#include <stdio.h>

int main(){
  puts("hello world");
  return 0;
}

运行编译指令,可以编译出 test 可执行文件

运行

使用命令 cmusee -- ./test 运行

输出结果

复制代码
hello world
Server is running on:
  http://127.0.0.1:8890

第一行是程序的输出结果

用浏览器打开 http://127.0.0.1:8890 即可查看程序的运行过程

图形界面

用上面的命令,可以输出这个图形界面:

在左边的栈视图,点击每个帧,就可以跳转到对应函数,显示出参数和返回值

查询内存

例如这个 argv, 是一个字符串数组

那么,在详情区的 argv 的第一个下拉按钮应该选择 A ,就是数组,然后数组长度要自己填,这里填 2

第二个下拉按钮选择 S, 就是字符串

快捷键

复制代码
Alt + . : 切换视图

在编辑区(实际上不可编辑),把光标移动到某个函数调用,就可以用这几个快捷键

复制代码
Alt + UpArrow : 切换到上一个帧
Alt + DownArrow : 切换到下一个帧
Alt + LeftArrow : 切换到父帧
Alt + RightArrow : 进入帧

内存消耗

那么,用这东西会不会非常消耗内存呢

对于大部分调试需求,128MB的内存是足够的

结语

以上这些就是基本用法了,很简单

想进一步了解 cmusee, 可以访问官网 https://veefuse.com/zh-CN/cmusee/