记得上大学时,做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. 关于页面 reflow 和 repaint

    什么是 reflow 和 repaint 浏览器为了重新渲染部分或整个页面,重新计算页面元素位置和几何结构(geometries)的进程叫做 reflow. 当确定了元素位置.大小以及其他属性,例如颜 ...

  2. MVC Actionlink 参数说明

    Html.ActionLink用于输出链接,以下是带参数的例子: @Html.ActionLink("编辑", "Edit", new {id= "1 ...

  3. php中好用的时间函数

    //查询数据30天的数据$y=date("Y",time());$m=date("m",time());$d=date("d",time() ...

  4. Java中的字符串常量池

    ava中字符串对象创建有两种形式,一种为字面量形式,如String str = "droid";,另一种就是使用new这种标准的构造对象的方法,如String str = new ...

  5. 主机名链接数据库,无法生成 SSPI 上下文

    两台Server,环境一样,都使用同一域账号. 1的SQL Server可以通过Windows认证连接到2,但2通过Windows认证连接1时报如下错误: 目标主体名称不正确,无法生成 SSPI 上下 ...

  6. .NET高级工程师面试题之SQL篇

    1 题目 这确实是一个真实的面试题,琢磨一下吧!知识不用,就会丢掉,我太依赖各种框架和dll了,已经忘记了最基本的东西.有多久没有写过SQL了,我已经不记得了. 已知表信息如下: Department ...

  7. 通过xcode或xcodebuild进行打包

    在实际应用中需要用到debug的安装包,所以决定自己学习一下打包,打包过程中遇到了各种问题,下面记录了一下我在打包中用到的步骤,当然我还有很多不明白的地方,如果有不对的地方,希望可以大家可以指出   ...

  8. jQuery ajax - getScript() 方法

    通过 AJAX 请求来获得并运行一个 JavaScript 文件: HTML 代码: <button id="go">Run</button> <di ...

  9. java代码性能优化总结(转载)

    原文链接:http://developer.51cto.com/art/201511/496263.htm 前言 代码优化,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改 ...

  10. MVC学习地址

    http://www.cnblogs.com/n-pei/tag/Asp.net%20MVC/