使用 cmusee 快速理解复杂 C/C++ 代码
当开发者需要查看程序的内部运行过程时(例如程序出现 bug 时,或者需要理解他人编写的代码时),一般使用以下两种方法:
-
单步调试器(gdb 等),但是单步调试器需要麻烦且复杂的操作,才能定位到需要查看的代码,如果错过需要查看的位置,还要从头开始;
-
打 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/
浙公网安备 33010602011771号