记得上大学时,做C语言的程序都是用sdb来调试的;再后来有了gdb,同sdb差不多,不过就好用了很多。但终究还是有点遗憾。比如,程序里设计了几个函数,如果想测试下它们,就不得不再编写个测试函数,用各种可能的输入进行调用;测试完后,一般会删掉这段测试代码,如果是保留着,那下次修改了函数的参数接口,编译器就开始抱怨了,只好坚持维护那一段测试代码。当时我就在想,要是有个SHELL界面,让我直接运行那些函数就好了。这样就不用费尽写些测试代码,更别说维护了!

工作后,很多时候是做嵌入式系统,那丫可没有GDB,或者说GDB没那么容易用上。当然,更直接的挑战是,已经上线运行的系统,GDB就不用考虑了!除非我们提前考虑到哪些需要在CLI里提供debug信息,其它一切就都是黑盒子了!此外,客户可能有各种各样的想法,要求我们预制各类开关。通过CLI调整这些开关值当然可行,但总不是那么方便。我以前给电信做移动电话程控交换机,全国应用了数百套设备,每套设备都有自己的特殊配置。

怎么办才能做好呢?程序行为跟某个全局变量有关,但却没法查看那个变量当前的值;程序出错了,因为忘了某个初始化函数。这种时候,我们需要一个CSHELL接口,让程序里所有的全局变量,函数变得可以查看,修改和运行。当然,这一切都是自动完成的,准确点说,只要make就有了!

下载地址:

http://files.cnblogs.com/files/hhao020/cshell_prj.re0.001.rar
请解压后在Linux系统下编译(需要perl环境)。

CSHELL涉及Lex,Yacc,ELF解析等技术,以下为其实现过程:
1,编写cshell.l词法文件, cshell.y语法文件;
2, 使用Lex和Bison(Yacc)生成SHELL输入的解释文件(C源代码);
3,Make编译并第一次链接生成.out文件(符号表为空);
4,使用p_readelf.pl(调用readelf)生成符号表源文件;
5,Make第二次链接生成.out文件(含符号表);
注:CSHELL符号表并非ELF文件的符号表,具体可参见c_sym_table.c文件。

应用开发者,只需要链接CSHELL库和符号表,并在其程序中提供CSHELL的输入接口,就能够获得CSHELL的一切功能。
链接中的CSHELL运行起来,会是这个样子:

cshell_prj $ bin/linux.i64/user.exe 
$7/> DemoVar1;
= 10 (0x620000000A) <SYM_DATA : size=4>

$11/> DemoCall2("my int var", 5);
input my int var=5
= 0 (0x0) <FUNCALL : size=0>

-><cmd/test.cmd
...............

CSHELL语法是C语言编程的一个子集,只help里的内置命令除外。使用有几个技巧:
1,函数调用最多支持10个参数,多了会被丢弃,结果嘛,呵呵~当然,可以改cshellfuns.c来调整;
2,调用时,少给了几个参数,会被默认为0,好好利用这个特性,比如打印实例函数!
3,可以添加变量,比如x=123;
4,可以多个表达式写一行,用分号;隔开;
5,可以将函数结果赋值给变量,如x=functioncall(...),当然,这时候的x必须先存在或是创建好;
6,可以批量运行,执行<script即可,比如执行链接里的脚本 <cmd/test.cmd

对于CSHELL希望作些定制的朋友,可以阅读cshellfuncs.c。原理很简单,就是将输入编程一个二叉树,左孩子右兄弟;实现时,考虑的细节还是蛮多的,必须的,要不就不好玩了!看明白这个cshellfuncs.c,又弄明白编译过程的朋友,可以留言索取lex词法文件和yacc语法文件。没上传,不影响任何使用,CSHELL是个开源代码,我不想被某个公司据为己有,你可以用,但不能剥夺别人用的权利。

当然,凡事有利必有害。CSHELL给你方便的同时,也让你的程序空间暴露在外,遇到恶意调用修改,则会让程序出错,或是行为变得不可测。哥建议你自己给CSHELL加个鉴权,如果CSHELL有幸被放入某个产品中去的话。

C编程风格的人机交互 -- CSHELL (提供源码下载)的更多相关文章

  1. 玩转控件:重绘DEVEXPRESS中DateEdit控件 —— 让DateEdit支持只选择年月 (提供源码下载)

      前言 上一篇博文<玩转控件:重绘ComboBox —— 让ComboBox多列显示>中,根据大家的回馈,ComboBox已经支持筛选了,更新见博文最后最后最后面.   奇葩 这两天遇到 ...

  2. EasyMvc--让MVC区域开发更Easy(提供源码下载)

    核心: 主要利用MVC的区域功能,实现项目模块独立开发和调试. 目标: 各个模块以独立MVC应用程序存在,即模块可独立开发和调试. 动态注册各个模块路由. 一:新建解决方案目录结构 如图: 二:Eas ...

  3. 重磅来袭,开源Asp.Net MVC网上商城BrnShop正式发布,提供源码下载(转)

    BrnShop网上商城是以Asp.Net mvc3为基础开发的网上商城,源代码完全开源(企业版的源代码目前还没有完全整理完成,一旦整理完成也全部开源). 啥话也不说了,直接上源码:下载源码(由于公司服 ...

  4. 最新版本的Struts2+Spring4+Hibernate4三大框架整合(截止2014-10-15,提供源码下载)

    一. 项目名称:S2316S411H436 项目原型:Struts2.3.16 + Spring4.1.1 + Hibernate4.3.6 + Quartz2.2.1 源代码下载地址: 基本版:ht ...

  5. WPF WebBrowser+TabControl MVVM模式 简单应用 提供源码下载

    源代码下载 这个程序是TabControl和Webbrowser的练手小程序 可达到练手目的有: MVVM设计模式的基本使用 Binding(包括相对源[RelativeSource]绑定)的基本使用 ...

  6. Android 上实现像微信一样的用Fragment来实现的Tab切页效果 提供源码下载

    网有不少的例子,但是要么是像微信一样可是没有使用Fragment实现,要么是只实现了一个很简单的切换,没有下面的菜单页.这个例子有实现了,我觉得暂时够我用了##实现类:+ MainTabFragmen ...

  7. SpringMVC+BUI实现文件上传(附详解,源码下载)

    中午有限时间写这博文,前言就不必多说了,直奔主题吧. BUI是一个前端框架,关于BUI的介绍请看博主的文章那些年用过的一些前端框架. 下面我们开始实例的讲解! 一.效果演示: 上传成功后,会发现本地相 ...

  8. arcgis api 3.x for js 共享干货系列之二自定义 Navigation 控件样式风格(附源码下载)

    0.内容概览 自定义 Navigation 控件样式风格 源码下载 1.内容讲解 arcgis api 3.x for js 默认的Navigation控件样式风格如下图:这样的风格不能说不好,各有各 ...

  9. 卡通风格的连连看ios游戏源码

    卡通风格的连连看游戏源码,该游戏是一款韩国人做的卡通风格的ios连连看游戏源码,源码设计的效果非常漂亮的,而且运行起来感觉也很好.1.游戏采用倒计时模式2.该游戏是一款社交游戏,需要通过faceboo ...

随机推荐

  1. oracle 常见恢复

    author by :shawnloong 环境:windows 2008 r2 sp1 db:oracle 11g r2 做之前记得做个完整备份 ONFIGURE RETENTION POLICY ...

  2. 华为RH2285安装过程及经验总结

    安装测试 1.由于服务器为二手服务器,噪音相对较大,如果未经改造无法正常使用,当机器第一次运行的时候,我的血压一下升高不少. 第一步  服务器的远程端口和路由器连接在一起 第二步  设置服务器的bio ...

  3. express 手动删除session状态(即登出功能)

    在退出按钮被点击后,发送请求/logout,服务端做如下处理: app.get('/logout', function() { delete req.session.user; return res. ...

  4. Android IOS WebRTC 音视频开发总结(七一)-- H265/H264有何不同

    本文整理自自网络,非原创,喜欢相关文章请关注我们的微信公众号:blackerteam H.265 H.265是ITU-TVCEG继H.264之后所制定的新的视频编码标准.H.265标准围绕着现有的视频 ...

  5. PHP时间日期

    PHP常用的几个时间日期函数有:date(),mktime(),strtotime(); 一.string date ( string $format [, int $timestamp ] ) 函数 ...

  6. 内置对象(Session、Application、ViewState)

    内置对象:为了跨页面传值和状态保持.→HTTP的无状态性 [4.]Session:每一台电脑访问服务器,都会是独立的一套session,key值都一样,但是内容都是不一样的 以上所有内容,都跟cook ...

  7. newCachedThreadPool线程池

    public static ExecutorService newCachedThreadPool()创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们.对于执行很多短期异步任 ...

  8. C#页面前台绑定数据 <%%><%#%><%=%>

    ASP.net前台绑定用的最多,今天小小总结一下. 1:<%#Eval("")%> 2:<%#Bind("")%> 3:<%=变量 ...

  9. Ubuntu下shell脚本运行异常:bash和dash的区别

    Ubuntu下我用bash到语法写了一个shell脚本(准确的说是把书上的脚本敲进电脑),在ubuntu下,用sh test.sh来运行,但是出现了意料之外到结果,比如echo -e "\n ...

  10. OA 办公自动化系统:权限管理模块的实现原理思路

    OA系统分有许多的模块,如系统管理模块.等一些比较高级的业务操作.此类业务是不允许让普通员工来操作的,思路如下: 给系统添加角色表,每个用户对应一个角色,每个角色可以拥有多个权限, 如下:创建权限表( ...