TinyOS论文06:Clairvoyant: A Comprehensive Source-Level Debugger for Wireless Sensor Networks
2015-12-03 17:21
417 查看
1、论文提出了一个“全面的“源码级传感网程序调试器Clairvoyant。全面:它能够检测到传感网程序中这些特点引发的程序bug:嵌入式、分布式、事件驱动、多跳、面向IO计算 + Clairvoyant的实现:与开发人员交互的主机端 + 程序运行的传感网器结点。
2、Clairvoyant提供了一套标准的命令来调试程序,譬如说一些普通的调试命令:break、step、watch、backtrace + Clairvoyant特制的命令。(怎么通过命令来调试程序:动态二进制指令方法,即修改目标二进制的方式))
3、最小化调试过程对网络负载、内存占用、执行速度、时钟的一致性和闪存的使命周期的影响。
Clairvoyant也视图减少在调试过程中网络负载、内存占用、执行速度、锁的一致性和结点的快速声明周期
各种调试技术的对比:
1、远程调试不适用于WSNs,应为硬件调试器很昂贵 + 这种调试很难涉及到大范围的部署和大范围的区域;
2、软件调试也很难由于WSNs程序的多跳性、资源有限和时钟依赖;
3、现有的最常见的调试方法是使用模拟器调试大规模的程序 + 使用硬件调试器来调试底层的硬件驱动。这也会有问题,因为很有bug只有在部署到真是的环境中才有可能出现bug.
论文提出了Clairvoyant:一个功能全面的源码级传感网程序调试器:
1、它能够在部署的硬件和部署的环境上操作;
2、不需要修改源码;
3、Clairvoyant提供了一套标准的调试命令:例如break、step、watch、backtrace中这专门为调试WSNs设计的专门的命令;
4、还提供了一个专门为WSNs设计的功能:访问硬件例如外部闪存和中断向量、全局命令、和为LED、RAM、外部闪存、广播打日志的能力
5、Clairvoyant能够用于调试竞争条件、栈溢出、全局状态错误和底层硬件驱动错误。
6、Clairvoyant在Maciz2传感器结点上实现。
Clairvoyant调试过程会影响程序的运行,Clairvoyant采用的方法是:动态二进制指令:通过修改目标二进制的方式实现调试命令,这是唯一的方法让程序运行在本地的MCU而不用额外的硬件或者修改源码
源码级调试器的常见的四种实现方式:
1、在处理器中内置硬件支持:使用特殊的寄存器存储端点或者变量,当访问到这些数据时,处理器停止执行而将相应的控制转移给调试器。但这种方法不适用于WSNs,因为WSNs的MCU小。
2、通过API控制运行时系统,但是大部分WSNs程序并不是运行时系统执行,可以使用虚拟机技术、软件动态转换器或者解释器,但这容易改变WSNs程序的时序特征而引入新Bug。
3、通过在线硬件模拟器来实现,这种方式需要为结点绑定额外的硬件,因此不适用于大规模部署和大规模范围的WSNs结点。
4、第四种方法是通过修改目标程序的执行来实现软件调试命令,例如:通过往的二进制可执行的程序中插入一个“trap”来实现断点。Clairvoyant就是这样实现的,并且它是第一个基于闪存平台而非内存平台的NesC源码级别的调试器。
Clairvoyant的实现还是会基于模拟器,既然是模拟器就会出现这样一个问题:不能模拟真实世界的环境,但是可以通过EmStar改善,EmStar是一种类仿真环境的模拟。EMS需要对每个结点进行实际的连接,即规模不能打、且会影响程序执行的速度,但是能很好地检测底层硬件驱动bug和竞争条件bug。
WSNs中另一种源码级的调试技术为记录和回放,在执行过程中IO会被记录,在调试的时候被回放。WSNs中的EnviroLog系统已经实现了这个技术
Clairvoyant的一个局限是需要32KB的程序内存和1KB的数据内存 + 在调试过程中Clairvoyant必须写入传感网节点程序内存中,使用Clairvoyant会缩短传感网结点的生命周周期
Clairvoyant提供标准的调试命令 + 为WSNs专门设计的命令(这些命令可以用于访问硬件、为记录变量的日志信息)
Clairvoyant命令的输入是通过类GBD终端实现的;
1、Basic Commands
Clairvoyant提供的大部分命令由GDB提供。允许开发人员:
1、远程连接或断开目标程序;
2、按步骤执行;
3、插入或者删除断点和观测点;
4、检测和修改数据值和调用函数;
5、栈框架的检测和修改;
6、源码的呈现
不是从GDB中提供的两个命令:
1、shop:是正在执行的传感网结点程序进入调试模式;
2、reset:重新启动程序。
2、硬件访问命令
Clairvoyant中为访问硬件专门设计的命令
interrupt命令:用于描述每一个使能的中断。这个命令列出了在每一个执行点使能的中断,有利于识别竞争条件bug + 也有利于识别逻辑bug
call命令:使用call命令模拟中断调用中断处理器程序,有利于调试事件驱动bug
rename和flashread命令:读取RAM或者外部闪存中的任意变量值。
3、全网命令
使用这类命令来操作全部结点 gstop, gcontinue, gde-
tach, greset, and gbreak。特别的gbreak命令:为一个结点设置断点,当到达这个断点的时候,全网结点结束执行
4、日志命令
Clairvoyant提供了一组命令用于记录特定点变量的日志信息,变量的日志信息成为logpoint。这些变量的值可以发送到LED、RAM、外部闪存、广播
变量的日志操作建立在以下四种形式之上:
1、两个变量的比较;
2、一个变量和一个常量的比较;
3、当前栈指针和常量的比较;(常用语检测栈内存溢出bug)
4、以上三种形式的and或者or的组合比较
主机端:
1、调试单元运行GDB中的命令;
2、CDB用于执行GDB中没有的特殊命令;
3、UI wrapper用于与用户交互(用户输入命令 + 打印执行结果)
4、可视化工具:允许用户扩展基于文本的GDB接口创建图形化的调试界面。
目标端(传感器节点):包含一个解释器和多个执行器
1、Clairvoyant启动之后会自动加载要调试的程序到内存中,然后通知开发人员输入命令
主机与结点的交互
Clairvoyant 使用GDB作为主机的子程序,但并不使用GDB远程协议与目标结点交互。采用的交互方式是GDB适配器,当接收到原语操作序列时,GDB适配器将他们转换成原子命令,这些原子命令能够包装成信息并且被目标节点执行
这些原子命令具有自解释性:都具有相应的格式。
Clairvoyant 命令和相应遵循的三个基本的通信模式:
1、大多数命令是从基站发出,发送到任意的结点;
2、全网命令从基站发出到所有结点;
3、相应命令从任意结点发送,发送到基站。
目标节点的执行
动态二进制插桩调试方法:例如,开发人员指定一个断点,Clairvoyant 就会修改目标二进制,当断点到达的时候就会转换控制。
转换到调试上下文
1、当到达断点的时候,应该从应用程序环境切换到调试环境。一个普遍的实现方法是将目标程序的指令块替换成jmp指令块,称为trampoline。这种方式不仅需要trampoline的实例,也需要原始指令块的实例,增大内存开销;
2、解决方式:创建一个通用的trampoline,对于所有断点实例都通用的代码块,他不是用jmp指令块替代目标程序,而是把它替换成一个调用指令,之歌指令存储的是返回地址,称之为切换指针。例如,当call命令到来的时候,trampoline保存应用程序执行上下文并且跳转到Clairvoyant ,然后Clairvoyant 向主机报告相应的状态,继续执行后跳转到trampoline执行相应的代码。
3、trampoline保存两种类型的上下文
2、Clairvoyant提供了一套标准的命令来调试程序,譬如说一些普通的调试命令:break、step、watch、backtrace + Clairvoyant特制的命令。(怎么通过命令来调试程序:动态二进制指令方法,即修改目标二进制的方式))
3、最小化调试过程对网络负载、内存占用、执行速度、时钟的一致性和闪存的使命周期的影响。
Abstract
开发人员可以通过Clairvoyant连接到无线传感器网络,并且执行标准的调试命令,例如break、step、watch、backtrace中这专门为调试WSNs设计的专门的命令。Clairvoyant也视图减少在调试过程中网络负载、内存占用、执行速度、锁的一致性和结点的快速声明周期
一、Introduce
源码级调试器:允许开发人员执行程序语句或者一段代码块,并且查看正在被执行的程序,之所以称之为源码级别的编译器是因为他们能操作源码中的符号或者语句,例如设置断点、修改活性变量、调用函数。各种调试技术的对比:
1、远程调试不适用于WSNs,应为硬件调试器很昂贵 + 这种调试很难涉及到大范围的部署和大范围的区域;
2、软件调试也很难由于WSNs程序的多跳性、资源有限和时钟依赖;
3、现有的最常见的调试方法是使用模拟器调试大规模的程序 + 使用硬件调试器来调试底层的硬件驱动。这也会有问题,因为很有bug只有在部署到真是的环境中才有可能出现bug.
论文提出了Clairvoyant:一个功能全面的源码级传感网程序调试器:
1、它能够在部署的硬件和部署的环境上操作;
2、不需要修改源码;
3、Clairvoyant提供了一套标准的调试命令:例如break、step、watch、backtrace中这专门为调试WSNs设计的专门的命令;
4、还提供了一个专门为WSNs设计的功能:访问硬件例如外部闪存和中断向量、全局命令、和为LED、RAM、外部闪存、广播打日志的能力
5、Clairvoyant能够用于调试竞争条件、栈溢出、全局状态错误和底层硬件驱动错误。
6、Clairvoyant在Maciz2传感器结点上实现。
Clairvoyant调试过程会影响程序的运行,Clairvoyant采用的方法是:动态二进制指令:通过修改目标二进制的方式实现调试命令,这是唯一的方法让程序运行在本地的MCU而不用额外的硬件或者修改源码
background and Related work
源码级别的调试器的主要目的是导致程序bug的定位(cause identification)。源码级调试器的常见的四种实现方式:
1、在处理器中内置硬件支持:使用特殊的寄存器存储端点或者变量,当访问到这些数据时,处理器停止执行而将相应的控制转移给调试器。但这种方法不适用于WSNs,因为WSNs的MCU小。
2、通过API控制运行时系统,但是大部分WSNs程序并不是运行时系统执行,可以使用虚拟机技术、软件动态转换器或者解释器,但这容易改变WSNs程序的时序特征而引入新Bug。
3、通过在线硬件模拟器来实现,这种方式需要为结点绑定额外的硬件,因此不适用于大规模部署和大规模范围的WSNs结点。
4、第四种方法是通过修改目标程序的执行来实现软件调试命令,例如:通过往的二进制可执行的程序中插入一个“trap”来实现断点。Clairvoyant就是这样实现的,并且它是第一个基于闪存平台而非内存平台的NesC源码级别的调试器。
Clairvoyant的实现还是会基于模拟器,既然是模拟器就会出现这样一个问题:不能模拟真实世界的环境,但是可以通过EmStar改善,EmStar是一种类仿真环境的模拟。EMS需要对每个结点进行实际的连接,即规模不能打、且会影响程序执行的速度,但是能很好地检测底层硬件驱动bug和竞争条件bug。
WSNs中另一种源码级的调试技术为记录和回放,在执行过程中IO会被记录,在调试的时候被回放。WSNs中的EnviroLog系统已经实现了这个技术
Clairvoyant Overview
Clairvoyant既不需要修改源码、也不需要链接类库,秩序在为每个传感器结点设置启动项即可,启动Clairvoyant 之后,就可以加载和运行应用程序Clairvoyant的一个局限是需要32KB的程序内存和1KB的数据内存 + 在调试过程中Clairvoyant必须写入传感网节点程序内存中,使用Clairvoyant会缩短传感网结点的生命周周期
Clairvoyant提供标准的调试命令 + 为WSNs专门设计的命令(这些命令可以用于访问硬件、为记录变量的日志信息)
Clairvoyant命令的输入是通过类GBD终端实现的;
1、Basic Commands
Clairvoyant提供的大部分命令由GDB提供。允许开发人员:
1、远程连接或断开目标程序;
2、按步骤执行;
3、插入或者删除断点和观测点;
4、检测和修改数据值和调用函数;
5、栈框架的检测和修改;
6、源码的呈现
不是从GDB中提供的两个命令:
1、shop:是正在执行的传感网结点程序进入调试模式;
2、reset:重新启动程序。
2、硬件访问命令
Clairvoyant中为访问硬件专门设计的命令
interrupt命令:用于描述每一个使能的中断。这个命令列出了在每一个执行点使能的中断,有利于识别竞争条件bug + 也有利于识别逻辑bug
call命令:使用call命令模拟中断调用中断处理器程序,有利于调试事件驱动bug
rename和flashread命令:读取RAM或者外部闪存中的任意变量值。
3、全网命令
使用这类命令来操作全部结点 gstop, gcontinue, gde-
tach, greset, and gbreak。特别的gbreak命令:为一个结点设置断点,当到达这个断点的时候,全网结点结束执行
4、日志命令
Clairvoyant提供了一组命令用于记录特定点变量的日志信息,变量的日志信息成为logpoint。这些变量的值可以发送到LED、RAM、外部闪存、广播
变量的日志操作建立在以下四种形式之上:
1、两个变量的比较;
2、一个变量和一个常量的比较;
3、当前栈指针和常量的比较;(常用语检测栈内存溢出bug)
4、以上三种形式的and或者or的组合比较
Clairvoyant Implementation
Clairvoyant 包括两部分:与开发人员交互的主机端 + 程序运行的传感网器结点。主机端:
1、调试单元运行GDB中的命令;
2、CDB用于执行GDB中没有的特殊命令;
3、UI wrapper用于与用户交互(用户输入命令 + 打印执行结果)
4、可视化工具:允许用户扩展基于文本的GDB接口创建图形化的调试界面。
目标端(传感器节点):包含一个解释器和多个执行器
1、Clairvoyant启动之后会自动加载要调试的程序到内存中,然后通知开发人员输入命令
主机与结点的交互
Clairvoyant 使用GDB作为主机的子程序,但并不使用GDB远程协议与目标结点交互。采用的交互方式是GDB适配器,当接收到原语操作序列时,GDB适配器将他们转换成原子命令,这些原子命令能够包装成信息并且被目标节点执行
这些原子命令具有自解释性:都具有相应的格式。
Clairvoyant 命令和相应遵循的三个基本的通信模式:
1、大多数命令是从基站发出,发送到任意的结点;
2、全网命令从基站发出到所有结点;
3、相应命令从任意结点发送,发送到基站。
目标节点的执行
动态二进制插桩调试方法:例如,开发人员指定一个断点,Clairvoyant 就会修改目标二进制,当断点到达的时候就会转换控制。
转换到调试上下文
1、当到达断点的时候,应该从应用程序环境切换到调试环境。一个普遍的实现方法是将目标程序的指令块替换成jmp指令块,称为trampoline。这种方式不仅需要trampoline的实例,也需要原始指令块的实例,增大内存开销;
2、解决方式:创建一个通用的trampoline,对于所有断点实例都通用的代码块,他不是用jmp指令块替代目标程序,而是把它替换成一个调用指令,之歌指令存储的是返回地址,称之为切换指针。例如,当call命令到来的时候,trampoline保存应用程序执行上下文并且跳转到Clairvoyant ,然后Clairvoyant 向主机报告相应的状态,继续执行后跳转到trampoline执行相应的代码。
3、trampoline保存两种类型的上下文
相关文章推荐
- Debian8 远程登录Permission Denied,please try again
- 约束4(constraints)
- http://blog.csdn.net/ryantang03/article/details/9317499/
- fdisk -l 看不到磁盘分区,当前目录可能是在raid上。
- Xcode7使用CocoaPods不工作, 在更新 Mac OS X EI Capitain之后
- IMPDP hangs, session wait “wait for unread message on broadcast channel”
- MOTION INPAINTING
- 用mocha和chai进行自动化测试(含实例)
- NSString属性声明中的copy和retain区别
- Container With Most Water
- QPainter::begin: Paint device returned engine == 0, type: 1
- tail -f 查看多个日志文件
- 构建内部邮件服务器(DNS+sendmail)
- DHCP Failover中的Filter同步
- 点滴 PUSH-PULL AND OPEN DRAIN+PULL-UP/DOWN
- LeetCode(217)Contains Duplicate
- LeetCode(217)Contains Duplicate
- 软件包 com.baidu.location
- hdu 1788 Chinese remainder theorem again
- 设计模式 职责链模式(Chain of Responsibility Pattern)