精华内容
下载资源
问答
  • 注1:调试过程如果客户端和服务端都不熟悉的话最好由个人完成 注2:本文只是对以下链接内容的完善及其解释 注3:本文是基于OKHttp上进行的代码调试 注4:本文是自签名证书,属于测试代码,并没有在正式环境上...

    注1:调试过程如果客户端和服务端都不熟悉的话最好由一个人完成
    注2:本文只是对以下链接内容的完善及其解释
    注3:本文是基于OKHttp上进行的代码调试
    注4:本文是自签名证书,属于测试代码,并没有在正式环境上使用
    注5:建议读者仔细尝试过相关链接后再进行阅读本文
    注6:可能会使用到startup.bat命令启动tomcat

    相关链接:
    《基于Java的https双向认证,android上亦可用》
    http://blog.csdn.net/lmj623565791/article/details/48129405
    《Android Https相关完全解析 当Okhttp遇上Https》
    https://my.oschina.net/jjface/blog/339144

    第一步:搭建服务器,服务器搭建仅仅需要一个tomcat ,配置很简单,可以百度一下

    第二步:通过《基于Java的https双向认证,android上亦可用》一文中的命令行进行证书生成,无需更改命令,最终生成的证书有client.cer,client.p12,client.truststore,server.cer,server.keystore这五个文件。

    第三步:参考《Android Https相关完全解析 当Okhttp遇上Https》一文中的方式下载portecle-1.9.zip文件并解压,然后点击portecle.jar文件,打开GUI界面,然后通过《Android Https相关完全解析 当Okhttp遇上Https》一文中的操作方式将client.p12转换成client.bks文件

    第四步:将server.cer和client.bks复制进Android项目的assets文件夹下,参考如下代码即可进行修改
    (以下代码参考https://github.com/hongyangAndroid/okhttputils ):

    InputStream server = null;
    InputStream client = null;
    try {
        server = getAssets().open("server.cer");
        client = getAssets().open("client.bks");
    }catch (IOException e){
        e.printStackTrace();
    }
    //设置可访问所有的https网站
    HttpsUtils.SSLParams sslParams = HttpsUtils.getSslSocketFactory(new InputStream[]{server}, client, "123456");
    OkHttpClient okHttpClient =  new OkHttpClient.Builder().
            sslSocketFactory(sslParams.sSLSocketFactory, sslParams.trustManager)
            .hostnameVerifier(new UnSafeHostnameVerifier())
            //其他配置
            .build();
    OkHttpUtils.initClient(okHttpClient);
    }
    public class UnSafeHostnameVerifier implements 
    HostnameVerifier{
    @Override
    public boolean verify(String hostname, SSLSession session)
    {
        HostnameVerifier hv =  HttpsURLConnection.getDefaultHostnameVerifier();
        return hv.verify("www.itjoyee.com", session);
    }
    }
    

    第五步:启动或重新启动服务器(tomact),启动成功后,运行Android程序,顺利的话就可以看到tomact的首页源码或者自己设置的成功标志

    附:以下是可能出现的异常
    1、
    该异常出现的原因是该使用server.cer的地方使用错误,导致出现这个错误。如,证书和服务器所使用的证书不一致。如,使用的是其他文件,不是server.cer,总之证书不正确导致的该错误

    2、
    该异常出现的原因是没有对证书进行验证或者是验证了错误域名,如出现此种错误请仔细阅读第五步操作

    3、
    异常信息
    可能会因为bcprov-jdk16-146.jar文件导致Android项目构建失败,删除即可。当重新生成证书的时候再把该文件复制到原有的位置,然后生成证书,重启tomcat等流程

    4、
    如果出现其他错误请仔细阅读文档或留言

    展开全文
  • DeepLab v2及调试过程

    千次阅读 2018-03-24 00:00:00
    图像语义分割,简单而言就是给定一张图片,对图片上的每个像素点分类。 图像语义分割,从FCN把深度学习引入这个任务到现在,个通用的框架已经大概确定了。即前端使用FCN全卷积网络输出粗糙的label map,后端...
        

    今天我们开始说说语义分割第二个系列,DeepLab V2。说这个之前,我们先说说FCN的一些简单知识。

    图像语义分割,简单而言就是给定一张图片,对图片上的每一个像素点分类。 


    图像语义分割,从FCN把深度学习引入这个任务到现在,一个通用的框架已经大概确定了。即前端使用FCN全卷积网络输出粗糙的label map,后端使用CRF条件随机场/MRF马尔科夫随机场等优化前端的输出,最后得到一个精细的分割图。

    640?wx_fmt=png&wxfrom=5&wx_lazy=1

    上图示基于区域的全卷积框架图,而且这也是第一次用于目标检测的全卷积网络,最后的效果得到了很好的效果

    640?wx_fmt=png&wxfrom=5&wx_lazy=1

    图像语义分割,从FCN把深度学习引入这个任务到现在,一个通用的框架已经大概确定了。即前端使用FCN全卷积网络输出粗糙的label map,后端使用CRF条件随机场或者MRF马尔科夫随机场等优化前端的输出,最后得到一个精细的分割图。

    640?wx_fmt=png

    我们为什么需要FCN?    

    分类网络通常会在最后连接几层全连接层,它会将原来二维的矩阵(图片)压扁成一维的,从而丢失了空间信息,最后训练输出一个标量,这就是我们的分类标签。    

    而图像语义分割的输出需要是个分割图,且不论尺寸大小,但是至少是二维的。所以,流行的做法是丢弃全连接层,全部换上全卷积层,而这就是全卷积网络了。

    具体定义请参看论文:《Fully Convolutional Networks for Semantic Segmentation》  

    FCN结构    

    在FCN论文中,作者的FCN主要使用了三种技术:  

    • 卷积化(Convolutional) 

    • 上采样(Upsample) 

    • 跳层连接(Skip Layer)    

    卷积化即是将普通的分类网络,比如VGG16,ResNet50/101等网络丢弃全连接层,换上对应的卷积层即可。

    640?wx_fmt=png

    上采样即是反卷积(Deconvolution)。当然关于这个名字不同框架不同,Caffe和Kera里叫Deconvolution,而tensorflow里叫conv_transpose,在信号与系统这门课上,我们学过反卷积有定义,不是这里的上采样。

    所以叫conv_transpose更为合适。   

    众所诸知,池化会缩小图片的尺寸,比如VGG16 五次池化后图片被缩小了32倍。为了得到和原图等大的分割图,我们需要上采样/反卷积。反卷积和卷积类似,都是相乘相加的运算。只不过后者是多对一,前者是一对多。而反卷积的前向和后向传播,只用颠倒卷积的前后向传播即可。所以无论优化还是后向传播算法都是没有问题。上池化的实现主要在于池化时记住输出值的位置,在上池化时再将这个值填回原来的位置,其他位置填0。图解如下:

    640?wx_fmt=png

    但是,虽然文中说是可学习的反卷积,但是作者实际代码并没有让它学习,可能正是因为这个一对多的逻辑关系。代码如下:

    layer {  name: "upscore"  type: "Deconvolution"  bottom: "score_fr"  top: "upscore"  param {    lr_mult: 0  }  convolution_param {    num_output: 21    bias_term: false    kernel_size: 64    stride: 32  } }

    可以看到lr_mult被设置为了0.    

    跳层连接的作用就在于优化结果,因为如果将全卷积之后的结果直接上采样得到的结果是很粗糙的,所以作者将不同池化层的结果进行上采样之后来优化输出。具体结构如下:

    640?wx_fmt=png

    不同上采样得到的结果对比如下:

    640?wx_fmt=png

    当然,你也可以将pool1, pool2的输出再加上采样作为输出。不过,作者说了这样得到的结果提升并不大。FCN是深度学习应用于图像语义分割的开山之作,所以得了CVPR2015的最佳论文。但是,还是有一些处理比较粗糙的地方,具体和后面对比就知道了。


    DeepLab V2

    DeepLab: Semantic Image Segmentation with Deep Convolutional Nets, Atrous Convolution, and Fully Connected CRFs

    深度卷积网络用于语义分割的三个挑战:  

    • 特征分辨率下降。主要由于重复池化和下采样造成,作者移除了最后几个最大池化层下采样操作,并对滤波器进行上采样,在非零的滤波器值之间加入空洞,称为atrous卷积。  atrous卷积示意图为:

    640?wx_fmt=png

    • 多尺度目标。一般将不同尺度的图像输入DCNN,但计算量增加。作者根据SPP的思想,在给定特征层使用不同的采样率进行重采样,使用具有不同采样率的平行atrous卷积层实现,称为atrous SPP(ASPP)。atrous SPP方法示意图如下图所示:

    640?wx_fmt=png

    • DCNN的不变性,导致定位准确率下降。基于对象的分类器要求对形变不变,影响了分割准确性,hpyer-column有被用来消除这个问题。作者使用全连接的条件随机场(CRF)获取细节信息。CRF被广泛用于语义分割,通过组合多路低层次分类器的信息,如边缘,superpixels等。CRF用于增强边缘信息示意图:

    640?wx_fmt=png

    DeepLab模型的结构如下图所示:

    640?wx_fmt=png

    对VGG-16,ResNet-101进行一些改动用于语义分割:  

    1. 所有的全连接层变为卷积层  

    2. 使用atrous卷积层提高特征分辨率,这样可以每8个像素计算一个特征响应,之后双向性插值上采样8倍到原始图像分辨率,输入到CRF精修分割结果。  

    实验结果

    使用不同的技巧对结果的增强

    640?wx_fmt=png

    与其他方法在VOC2012上的比较

    640?wx_fmt=png

    PASCAL-Context的结果:

    640?wx_fmt=png

    城市景观结果

    640?wx_fmt=png

    PASCAL-Person-Part  

    人体六个部位Head, Torso,Upper/Lower Arms and Upper/Lower Legs分割

    640?wx_fmt=png

    但是本方法也有产生错误的情况,如下:

    640?wx_fmt=png

    出的模型无法捕捉物体的精细边界,例如自行车和椅子。我们假设有些文献的编解码结构可以通过利用解码器路径中的高分辨率特征映射来缓解这一问题。




    640?wx_fmt=gif

    640?wx_fmt=jpeg


    展开全文
  • 调试机制

    千次阅读 2016-08-15 00:48:50
    支持调试HTML、CSS和JavaScript代码是游览器或者渲染引擎需要提供的项十分重要的功能,这里调试包括两类型:其是功能,其二是性能。功能调试能够帮助HTML开发者使用单步调试等技术来查找代码中问题,性能调试...

    支持调试HTML、CSS和JavaScript代码是游览器或者渲染引擎需要提供的一项十分重要的功能,这里调试包括两种类型:其一是功能,其二是性能。功能调试能够帮助HTML开发者使用单步调试等技术来查找代码中问题,性能调试能够采集JavaScript代码、网络等性能瓶颈,这只是对于HTML开发者来说,对于性能来说,问题可能存在域HTML代码,也可能是游览器本身的问题,为此Chromium开发出另一套机制-“tracing”技术,它能够收集Chromium内部代码的工作方式和性能瓶颈,以帮助定位Chromium本身的问题

    Web Inspector

    基本原理

    Chromium开发者工具被用来帮助了解渲染引擎和游览器被狗的原理,这一工具实际上是基于WebKit的Web Inspector技术开发出来的,它的功能丰富,下图是Chromium游览器的开发者工具调试页面的示例图:
    这里写图片描述
    图中上半部分表示需要被调试的网页,下半部分表示调试其的界面,该界面由WebKit提供,也就是说,使用WebKit的内核就可以看到类似的界面,不同点在于Chromium使用了多进程架构,根据WebKit中的定义,上面的部分称为后端(Backend),下面的部分被称为前端(Frontend),下图还有一个特点就是掉时期的界面本身也是使用HTML、CSS和JavaScript技术来编写。Chromium开发者工具提供了众多的功能,主要包括一下几种:

    • 元素审查(Elements):该功能能够帮助开发者查看每一个DOM元素,如“body”元素,同样可以查看它的样式信息
    • 资源(Resources):该功能能够帮助开发者查看各种资源信息,如内部存储、Cookie、离线缓存等
    • 网络(Network):该功能能够帮助开发者了解和诊断网络功能和性能
    • JavaScript代码(Sources):就是调试JavaScript代码,同其他语言的调试器一样,它能够设置断点、单步调式JavaScript语句等
    • 事件序列(Timeline):该功能能够按照时间次序来手机网页消耗的内存、绘制的帧数和生成各种事件,帮助开发者分析网页性能
    • 性能收集器(Profiles):它能够手机JavaScript代码使用CPU的情况、JavaScript堆栈、CSS选择器等信息,以版主开发者分析网页的运行行为
    • 诊断器(Audits):这是帮助开发者分析网页可能存在的问题或者可以改善的地方
    • 控制台(Console):该控制台可以输入JavaScript语句,由JavaScript引擎计算出结果
    协议

    调试机制的前端和后端通过使用一定格式的数据来进行通信,这些数据使用JSON格式来表示,具体到如何理解数据的内容,那就是Web Inspector使用的特殊调试协议,该协议定义了如何理解双方发送的数据内容,在WebKit中,协议被定义在Inspector.json文件中,而遵照该协议传输的数据同样使用JSON格式,下图定义Web Inspector的前端和后端交互信息的协议,如上所说,该协议使用的是一个JSON格式的文档,从全局来看,协议中主要包括两个属性,一个是“version”,用来表示协议的版本号,Web Inspector有多个版本,需要注意的是版本的兼容性问题,下图中显示的是版本1.0,另一个是“domains”,它定义了多个协议细节,并包含了多个“domain”,一个“domain”通常是一类功能,如“memory”、“CSS”等:

    {
      "version":{"major":"1", "minor":"0"},
      "domains":[
      {
        "domain":"CSS",
        "hidden":"true",
        "description":"...",
        "types":[
        {
          "id":"StyleSheetId",
          "type":"string"
        },
        ...
        ],
        "commands":[
        {
           "name":"toggleProperty",
           "parameters":[
           { "name": "styleId", "$ref":"cssStyleId"},
           { "name": "propertyIndex", "type":"integer"},
           { "name": "disable", "type": "boolean"}
           ],
           "returns":[
             { "name": "style", "$ref": "cssstyle", "description": "..."}
           ],
           "description":"..."
        },
        ],
        "events": [
        {
          "name": "styleSheetChanged",
          "parameters": [
            { "name": "styleSheetId", "$ref": "StyleSheetId" }
          ],
          "description": "..."
        },
        ]
      }
      ]
    }

    一个”domain“包括6个属性,下面介绍后三个比较难以理解的属性:

    • 第一个是”types“,它有点像预先定义的类型,这些类型表示一些特定的数据,在后面的定义中可以声明使用这些类型来表示一定的数据结构,图中定义的”id“为”StyleSheetId“,它表示的是一个字符串
    • 第二个属性是”commands“定义“domain”中包含的所有命令,这些命令类似于远程过程调用,表示前端和后端之间发送请求并响应的方式
    • 最后一个属性是“events”,它是用来描述事件的,同样可以包含一个或者多个事件,主要是向对方发送当前的一些状态信息,域命令不同的是,它没有也不需要返回值

    WebKit内部机制

    对于前端调试器,调试器界面本身也是使用Web技术来实现的,前面介绍的所有功能都是使用最新HTML5技术来完成的,目前有两个接口需要具体WebKit移植的实现,第一是发送消息到后端的接口,第二个从对方接收消息后将消息派发给调试器,下图是WebInspector前端的主要结构和基础设施:
    这里写图片描述
    最上层的是Inspector.html,为读者看到的调试器主界面,采用HTML5,因为调试器包含众多的功能,所以它实际上使用了各种功能的JavaScript代码,在其典型的三个JavaScript文件中,首先是InspectorFrontendAPI,它是前端的公共接口,被上层的调试器包含的JavaScript代码使用,同时该类也包括公共的派发消息的接口;然后是inspector.js,它是一个总的入口,包括所有主要对象的创建,而InspectorBackend.js是一个背后的具体实现类,它能够提供接口来将消息发送到被调试的页面,也就是后端,调试器主要需要两个能力,一是发送消息给前端,而是接收后端的消息,这两个接口在WebInspector框架中被定义,图中左边是发送消息给前端的过程,Web INspector使用一个称为InspectorFrontendHost的类作为接口,当然它本身没有具体实现,在一般的情况下,InspectorFrontendHost是一个使用C++编写的接口类,它通过V8的绑定机制来实现,最后会调用到InspectorFrontendHost,之后就依赖于具体移植的实现,另外一个接口就是定义了派发消息的JavaScript接口,也就是InspectorFrontApi.js定义的派发消息的两个接口,在Web Inspector中,一个默认的实现是InspectorClient类中有一个静态方法,该方法使用ScriptController类,将通过C++代码获得的消息传入JavaScript代码,这样整个前端依赖的两个本地接口就得到了完美的实现,不仅如此,该结构还能很好的满足之后的远程调试的需求。下面来看后端,下图描述了后端所需要的主要类和它们的关系,同前端不一样的是,后端的的主要功能都是使用C++代码来完成的,其中最重要的类是InspectorController,它控制着后端的所有动作及其和被调试网页之间的联系,InspectorController类包含一个InspectorClient对象,该对象负责实现基本功能,如情况缓存、高亮等,同时它包含一个主要的对外接口,那就是dispatcheMessageFromFrontend类,它有WebKit移植将前端的消息传递给后端的时候被调用,这些消息都是由InspectorBackendDispatcherImpl这个自动生成类处理的,这个类能够处理所有的请求消息,并解析这些消息,然后转换成相应的C++对象和函数的调用,具体做法是每个“domain”都会有相应的称为CommandHandle的类,如图中的CSSCommandHandler类,每个类的对象都会注册到InspectorBackendDispatcherImple对象中,该对象很容易知道调用的“domain”、命令或者事件等,InspectorBackendDispatcherImpl类也能够同V8等JavaScript引擎交互,典型的应用就是审查(Inspect)一个元素,用户单机一个元素的时候(可以从后端的被调式我那工业中单击),JavaScript引擎接收到事件,然后处理并调用该类来处理,本身CommandHandler类包含一些接口,以图中CSSCommandHandler类为例,它的具体实现类是InspectorCSSAgent,借助于一些其他设施类,它能够知道被调试网页有关CSS方面的消息,如借用InspectorStyleSheet类:
    这里写图片描述
    图中的InspectorBaseAgent是支持所有功能的子类,由于Web Inspector需要众多的功能,如前面介绍的CSS、内存、性能等,所有这些功能都是基于该类实现的,这些类的对象使用一个注册类来管理,如图中的InspectorAgentRegistry类。以域CSS相关的Agent为例,该类被调用后能够做正确的处理并按需分那会相应的结构,但是这里不进行消息的编码,而是使用一个InspectorFrontend自动生成类来帮助这些C++对象和数据转换成JSON格式的数据。另外一方面就是后端发送消息到前端,WebKit定义了一个抽象接口就是InspectorFrontendChannel类,它是一个传输通道,所有后端到前端的消息都是从它传出的,消息本身不做任何转换,只是传输数据,InspectorFrontend是一个自动生成的类,这里是一个模拟前端的工具类,由于它是一个根据协议自动生成的类,后端调用协议中定义的方法和事件,而该类提供这些接口并将调用转变成JSON格式,包括命令的名称、参数等消息,转换后的JSON字符串通过通道传输,从而完成了消息的发送过程,因为WebKit的特殊性,WebCore只是提供框架,具体实现交由移植来完成,下图是基本的通信框架:
    这里写图片描述
    图中左边是前端,右边是后端,通信框架主要定义前后端的一些用来双向通信的基础类和提供的接口,这些接口需依赖实际的通信机制才能完成,设想一下如果前后端都工作在一个进程中,那么非常简单,只需将消息传递到另一线程中即可,不需要复杂的机制,不过这里它只是定义了抽象接口,而没有定义通信方面的具体规定,这位跨进程的调试机制和圆仓调试提供了可能。

    Chromium开发者工具

    Chromium开发者工具(通常称为DevTools)是基于Web Inspector机制的一套跨进程的调试工具,因为Chromium的多进程架构,后端中被调试的网页是一个Rednerer进程,前端的网页同样也是一个Renderer进程,根据前面Web Inspector的架构,Chromium所要做的是将前后端的通信机制连接起来,由于Chromium架构的特殊性,消息的传递实际上经过了一个中转站Browser进程,也就是说这两个Renderer进程不是直接通信的,而是将消息传递给Browser进程,由它派发给相应的Renderer进程,下图描述了Chromium支持多进程调试的整个架构,上半部分是前端和后端两个Renderer进程,而下半部分是Browser进程,整个架构可以说非常简洁明确,首先是看前端的接收和发送消息是如何被支持的,首先是Chromium对前端发送消息到后端的支持,WebKit中的基类InspectorFrontHost类其实是调用InspectorFrontendClient类发送消息的,而WebKit的Chromium移植做了一个具体的实现类InspectorFrontendClientImpl类,该类会调用WebDevToosFrontendImpl类,最后的跨进程通信类是content::DevToosClient,该类是Chromium项目中用于开发者工具的进程间通信类,然后是Chromium对前端接收来自后端消息的支持,当WebDevToosFrontendImpl类接收到content::DevToosClient传递过来消息的时候,它直接通过V8提供的机制调用InspectorFrontendAPI.js的dispatcheMessage方法,经过这一过程,Chromium已经将WebInspector的两个用于传递消息的接口实现了,接下来是Browser进程,每个前端进程都有一个相应的DevToolsFrontendHost对象,当前端的一个消息到达时,如果找到相应的后端是通过DevToosManagerImpl类,它管理了所有的“前后端对”,实际上包含了两个哈希表,第一个是从前端到后端的映射,第二个是相反的映射,有了这两个哈希表,Browser进程只是将前端的消息根据映射关系找到后端并传递给它,相反方向也是一样,最后是后端进程的工作过程,content::DevToosAgent也是负责同Browser进程交互消息的具体实现类,包括接收和发送,在这之上主要的WebKit的Chromium移植提供的接口,其具体的实现是通过WebDevTOosAgentImpl类,它会将接收的消息传递给InspectorController,至此,Chromium连接上WebKit中后端接收消息的处理机制,而对于发送消息,WebDevToosAgentImpl是InspectorFrontendChannel的子类,会实现sendMessageToFrontend接口,这样双向过程完整的得到了支持:
    这里写图片描述

    远程调试

    远程调试是指前端和后端在不同的有了拿起实例中,但这两个实例可能在同一个环境中,也可能在不同的环境中,例如两台机器甚至网络上的两个设备。根据前面描述的Web Inspector机制,本身Web Inspector机制没有定义通信的方式,而且前后端只是通过JSON消息和一定的协议来交互的,所以理论上来讲,远程调试也只是需要建立一定的通信方式就能够支持远程调试,好消息是现在已经得到实现,Web Inspector没有提供或者规定圆仓调试的方式,在Chromium中,远程调试得到了比较好的支持,具体做法如下:

    • 首先在后端所在的游览器中需要建立一个HTTP服务器,在桌面系统上,建立和打开TCP监听一个端口,如9222,然后在另外一个Chromium游览器中输入“http://localhost:9222”就可以看到被调试的网页,目前,这种方式并不支持网络上的不同及其,可能是实现着考虑到安全性问题,如果调试Android平台上的Chrome游览器中的网页,首先需要将Android设备通过USB连接上开发机器,这时候用户可以在Android上Chrome游览器的设置中打开远程调试开关,这一操作实际上创建了一个Unix Domain Socket,此时,开发者在Linux系统中只要打开Chrome游览器,并在地址栏输入“chrome://respect”就能够看到需要调试的网页了
    • 建立连接之后,通过HTTP协议将被调试网页的HTML、CSS和JS等资源文件从被调试网页所在的游览器传输到前端调试器所在的网页中
    • 当开始调试时,前端调试器会尝试使用Web Sokcet建立前端和后端传输消息的通道,这是一种基于 Web的新技术,能够建立类似域套接字的数据传输通道

    下图描述了使用WebSocket技术来传输调试消息的远程调试机制,根据前面介绍的WebKit中前端和后端传输消息的机制,主要是InspectorFrontendHost(前端使用)和InspectorFrontendChannel(后端使用)这两个类,它们具体的实现由子类来完成,在远程调试中,通信的基础设施是由HTML5的WebSocket技术来支撑的,Chromium将InspectorFrontendHost接口同时暴露到JavaScript中,当本地代码需要发送消息的时候,通过调用InspectorFrontendHost类的本地接口,而这个本地接口已经同JavaScript中的实际发送接口连接起来,这样本地代码中的消息就能够使用WebSocket技术来发送了:
    这里写图片描述
    下面代码是Chromium中连接本地代码和JavaScript代码发送消息的部分代码节选:

    WebInspector.loader = function() {
      // 首先构建ws,这个是WebSocket的URL,下面是创建WebSokcet对象
      if (ws) {
        WebInspector.socket=new WebSocket(ws);
        // 接收对方过来的消息,直接交给相应的模块去处理
        WebInspector.socket.onmessage=function(message){
          InspectorBackend.diapatch(message.data);  }
        WebInspector.socket.onerror=function(error) {console.error(error);}
        WebInspector.socket.onopen=function(){
          // 当连接打开后,就将InspectorFrontendHost的发送消息
          InspectorFrontendHost.sendMeesageToBackend =                                      WebInspector.socket.send.bind(WebInspector.socket);
          WebInspector.doLoadedDone();
        }
        ...
      }
    }

    这个代码是前端的代码,而对于接收消息,同样比较简单,Chromium将WebSocket的onMessage事件同后端的消息派发函数连接起来,对于后端而言,它使用C++代码来完成WebSocket的连接,原理类似。Weinre是一个支持圆仓调试功能的开源项目,它除了能够支持WebInspector协议,还能够支持Firebug(Firefox的调试工具)的协议,其原理也是类似的。

    Chromium Tracing机制

    Chroimum开发和工具能偶帮助Web开发者理解网页运行过程中的行为并帮助分析一些性能问题,但是如果出现问题,特别是绘制网页的时候,开发者非常希望了解为什么Chromium会使用如此多的时间,同时,对于Chromium的开发者来说,如果需要分析Chromium自身问题,就需要相应的工具来帮助分析,在Chromium中,chrome://tracing这个诊断工具能够满足上面的要求。这是一个基于事件收集的分析工具,它能够版主诊断一些WebKit和Chromium内部代码在绘制网页过程中存在的问题,其中最主要的还是同图形相关的操作。这一机制的实现采用的思想非常简单,Tracing机制在Chromium代码韩总插入相应的跟踪代码,然后计算开始和结束之间的时间差,虽然简单,但是非常有用,如下:

    TRACE_EVENT_BEGIN0("SUBSYSTEM", "Something happen");
    toDoSomething()
    TRACE_EVENT_END0("SUBSYSTEM", "Something happen");

    Tracing机制在某个动作执行前加入“开始事件”代码,然后在动作结束后加入“结束事件”代码,机制中的TRACE_EVENT宏自动计算获得该动作执行的事件,当然,一般典型的例子是在函数或者一段代码开始的时候加入TRACE_EVENT0,在函数退出时候该事件自动记录下结束的时间,这是使用对象的自动析构机制来完成的,这样Tracing机制就能够计算出该函数运行所需要的时间,而不再需要额外插入结束代码,如下面代码所示的三个记录点,下述下面首先在函数入口出创建Tracing对象并记录时间点,在该函数退出时,对象析构前就能够自动记录整个函数执行的总时间,然后在第一个if语句中,又加入了一个记录点记录了这种条件下的时间消耗:

    bool ThreadProxy::CompositeAndReadback(void* pixels, gfx::Rect rect) {
      TRACE_EVENT0("cc", "ThreadProxy::CompositeAndReadback");
      DCHECK(IsMainThread());
      DCHECK(layer_tree_host_);
      if (defer_commits_) {
        TRACE_EVENT0("cc", "CompositeAndReadback_DeferCommit");
        return false;
      }
    
      if (!layer_tree_host_->InitializeOutputSurfaceIfNeeded()) {
        TRACE_EVENT0("cc", "CompositeAndReadback_EarlyOut_LR_Uninitialized");
        return false;
      }
      ...
    }

    实践–基础和性能调试

    Chromium开发者工具基本上沿用了Web Inspector的功能,其主要包括两个部分,基础功能部分的调试和性能部分的调试

    基础调试

    基础部分的调试大致可以分成DOM元素的修改等访问、CSS样式值修改、日志和控制台信息,以及JavaScript代码单步调试、断点设置等部分功能,开启或者关闭开发者工具的快捷键是F12或者在游览器地址最右侧的按钮中调用开发者工具即可,还有一个直接的方法为右键单击一个HTML元素,然后右键菜单中能够找到“Inspect Element”选项,那就是审查该元素,这种方式也可以打开开发者工具,当开发者工具被打开后,开发者就会发现在“Elements”标签下显示的其实是被调试页面的源代码,同时,Chromium游览器会高亮被审查元素的源代码,这一做法可以帮助开发者获悉当前的元素的源代码,右侧下方是当前元素的CSS属性值,包括经过WebKit计算之后应用在该元素上的属性值和支持获得这些属性值的规则等信息,这对开发者而言非常方便,开发者工具的方便之处在于开发者可以任意修改源代码或者CSS属性值,而且这些修改都是及时显示在网页的渲染结果中的。同时为了查看网页的DOM结构和网页中的各种对象,开发者工具提供了命令形式的控制台,开发者可以一次查看任何DOM中的节点和各种对象甚至可以执行JavaScript语句,下图为查看“window”对象下所有的其他对象:
    这里写图片描述
    控制台的另外一个功能就是能够显示所有的JavaScript代码执行的日志信息和错误信息,调试JavaScript代码的一种方式是使用日志打印出一些值来帮助确定代码的正确性,常用的是console.log函数,该函数的输出可以在控制台中看到。代码的调试是每个调试器必须支持的功能,在网页中就是对JavaScript代码的调试功能,包括单步、设置或取消断点、调用栈、变量信息等,这些都在“Sources”标签中得到了支持,下图为开发者工具中的JavaScript代码调试器:
    这里写图片描述
    左侧是当前网页的所有包含JavaScript代码的文件,中间是当前代码和调试的位置,开发者可以单击左侧的函数设置或者取消断点,网页就能够在执行到该行的时候停下来,右侧最上面的是控制执行的各种按钮,包括继续执行、单步执行、进入内部、跳出等,下面则是各种信息,包括查看的变量值、调用栈,当前作用域中的变量值、断点信息等。

    性能调试

    除了修改网页的DOM结构和CSS样式,以及调试JavaScript代码之外,开发者工具还能够帮助网页开发者改善性能和内存等方面的问题,性能方面包括网络资源的加载性能、网页绘制的性能,甚至包括根据网页加载和渲染过程给出一些优化建议,内存方面主要是网页使用的总内存、JavaScript引擎堆栈内存使用情况等方面的信息。首先看性能方面,这其中网络资源加载的分析和网页绘制支持开发者可能需要解决的一部分问题,开发者工具还提供了一种能够手机整个网页工作过程中的一段时间内各个JavaScript代码消息时间的分布情况,开发者显示选择“Profiles”标签,然后选择“Collect JavaScript CPU profile”按钮,此时开发者工具将收集被调试网页重新加载的整个过冲CPU消耗在各个JavaScript模块的分布,如下:
    这里写图片描述
    其中“(program)”是住网页的HTML文件所消耗的时间,因为HTML文件中内嵌了很多JavaScript代码,所以它占据了绝大部分时间,而其他的一些JavaScript文件则占用了很少的时间。还有一个非常有用的能力,就是使用开发者工具中的“Audits”功能,下图是“Audits”分析一个网页所生成的结果,它明确了哪些方面的问题可以进行优化,这对改善网站性能来说是一个极大的福音:
    这里写图片描述
    其次来看关于内存性能方面功能,如上所述,开发者工具不仅提供了网页整体使用内存的情况,也提供了分析JavaScript引擎内部堆上的内存使用情况,下图显示单击开始按钮之后,重新加载网页所收集的内存使用情况,它是按照时间轴来显示的:
    这里写图片描述
    可以看出,在某个时间点之后内存的使用了突然增大,这是因为在前面一小段的时间内,由于还没有开始重新加载网页,所以没有出现内存答复增长的情况,在单击“开始”按钮和重新加载网页,WebKit在等待网络响应之后才会逐渐增加对内存的需求,当网络下载数据完成时,WebKit使用内存量也在增加,而WebKit完成渲染之后,解释过程中的某些结构不在需要,这些不需要接口被销毁后内存就会降低到一个稳定的过程。

    展开全文
  • 然后想调试一下看看运行过程,接着设置个断点,然后就是F5了,发现每次运行到行代码的时候就提示Source not found下面还有个按钮“Edit Source Lookup Path”。现象就是下面这样的 当然这个时候如果我继续按F5...

    菜鸟今天按照书上的代码在eclipse上敲了一个程序,运行没有问题。然后想调试一下看看运行过程,接着设置一个断点,然后就是F5了,发现每次运行到一行代码的时候就提示Source not found下面还有一个按钮“Edit Source Lookup Path”。现象就是下面这样的


    当然这个时候如果我继续按F5的话呢,程序又会接着正常运行了。到这里那就是说程序本身是没有问题,肯定是哪个地方没弄好的原因,然后菜鸟就开始到网上去google了,找了一些资料,最后终于知道原因了,原来就是我用的那行代码是系统库里的,但是呢每次运行到那一行的时候总是找不到源代码,所以就提示Source not found。

    既然知道问题了,那就好办了。没有源码那就关联源码呗,关联源码之后问题完美解决。以后每次调试到这一行的时候就会跳到这个源码中,继续程序的调试过程。

    关联源码程序的几种方式:

    1.直接点击下面的小按钮”Edit Source Lookup Path“,得到如下的界面








    添加完了之后,点击OK按钮,以后调试就不会弹出那些烦人的Source not found了。

    2.第二种方法就是看看你的函数在哪个jar文件里,然后向相应的jar文件关联源码。

    首先,按住Ctrl键用鼠标点击哪个类,那么在左边的Package Explorer中看到你的类,当然那个双向箭头要按下去。


    这里我要找的是Scanner类,那么我在左侧就找到了这个类在rt.jar这个文件中,如下所示


    那么我们就可以对这个jar文件进行关联源码了,

    开始我们如下图所示,右击项目,




    点击Edit按钮,然后弹出的界面设置如下所示。


    添加完了以后的效果图如下所示:


    到这里我们就结束了,OK了。



    参考资料:http://blog.csdn.net/longyuhome/article/details/8497505

    展开全文
  • ITM,(英文:Instrumentation Trace Macrocell,指令跟踪宏单元),是一种针对MCU进行跟踪调试的新方法,与打断点(Breakpoint)不同,ITM方法不需要暂停程序运行,可以在程序全速运行的过程中实时输出变量的数值...
  • 、在服务器环境下通过IP访问 首先搭建个服务器环境或者下载现成的程序集成包(比如phpstudy、jspstudy等)。 确保服务器和手机连接在同一网段。如果是笔记本的话,手机和笔记本直接连接在同一wifi下,如果是台式...
  • 采用MATLAB的DSP调试方法

    千次阅读 2012-08-12 11:45:28
    本文结合具体例证,介绍基于MATLAB 的DSP 应用程序调试方法。 MATLAB 具有强大的分析、计算和可视...数字信号处理器(DSP)作为一种可编程专用芯片,是数字信号处理理论实用化过程的重要技术工具,在语音处理、图像处
  • MQTT双向认证
  • C++: 实现双向链表(例题讲解)

    千次阅读 2016-03-24 19:34:14
    这道题和我们之前做的单向链表是同一种类型的,只是这一次是双向链表,需要实现的操作较多,可能产生的bug也比之前多。我个人觉得,打出这道题的代码不难,难是难在调试。(入门链表的可以参照我以前的一篇文档入门:...
  • 在本文中我将向大家解释关于调试器是如何在机器码中寻找C函数以及变量的,以及调试器使用了何数据能够在C源代码的行号和机器码中来回映射。 调试信息 现代的编译器在转换高级语言程序代码上做得十分出色,...
  •  本文基于作者的实际项目经历,介绍了一种采用得比较多的单元测试方法。 一、软件模块概述 在实际的软件系统中,各个模块之间的关系可以用错综复杂来形容。根据模块之间有无消息交互,可以将软件模块划分为以下...
  • IIC通讯调试

    千次阅读 热门讨论 2018-07-31 11:46:31
    IIC总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息。 主器件用于启动总线传送数据,并产生时钟以开放传送的器件,此时任何被寻址的器件均被认为...
  • 、基本概念和意图 ()区块链自治规则 “区块链自治规则”是指建立在区块链上的去中心化自治组织系统的运行方式和策略安排等规则,为了叙述方便,简称为此。 区块链自治规则是由计算机代码实现,由区块链协议...
  • 【无人机组装与调试】 第章 概述 【无人机组装与调试】 第二章 关于新西达30A电调说明书的问题 【无人机组装与调试】 第三章 舵机安装与调整 【无人机组长与调试】 第四章 F450四轴装机实例-选择机型、需要的...
  • 你将看到在Ubuntu中, 我们选用 mosquitto 作为 MQTT broker,介绍了 MQTT 协议相关的原理性知识和工作流,以及按步骤来描述如何搭建个基于 SSL/TLS 的 MQTT broker,同时演示了订阅端和发布端该如何操作,并附上...
  • 最近运营反馈了个问题:谷歌浏览器打开第三方储值平台,使用谷歌浏览器自带的翻译功能后,选择商品没有计算总额。首先可以肯定的是这不是bug,这个平台已经兼容了13语言,只是运营没有通过语言栏切换语言,而是...
  • JPDA(Java Platform Debugger Architecture) 是 Java 平台调试体系结构的缩写,通过 JPDA 提供的 API,开发人员可以方便灵活的搭建 Java 调试应用程序。JPDA 主要由三个部分组成:Java 虚拟机工具接口(JVMTI),...
  • Java调试那点事

    千次阅读 2015-12-17 12:50:02
    来自阿里内部流出的篇技术文章,关于java调试的心得。
  • GPIO模拟I2C操作调试注意事项

    千次阅读 2016-04-14 10:37:01
    I2C作为板级串行数据总线,其规格相对简单,但调试过程中的一些细节问题容易被忽视,产生意想不到的时序错误。写这边文章为了记录我在调试I2C过程中遇到的问题,以便今后查阅并作为经验与大家分享。
  • 调试器工作原理之三——调试信息

    千次阅读 2013-10-31 23:50:39
    在本文中我将向大家解释关于调试器是如何在机器码中寻找C函数以及变量的,以及调试器使用了何数据能够在C源代码的行号和机器码中来回映射。 调试信息 现代的编译器在转换高级语言程序代码上做得十分出色,能够将...
  • 纯新手DSP编程--5.18--调试

    万次阅读 2012-05-17 15:36:52
    这一节适用所有使用 Code Composer Studio IDE 的平台。然而,不是所有器件都能权限 使用所有本节所讨论的工具。用户如果想知道可供使用的工具列表,可查看在线帮助和 Code ...为了实现成功调试调试环境
  • 本文主要介绍了基于Internet联网的一种报警主机硬件电路设计,系统主要介绍了系统的详细设计过程,系统主要包括Atmega128外围电路,ENC28J60以太网接口电路,键盘/显示接口部分,电源部分,主机通信的串口部分,调试...
  • 句话概括该软件:SymmetricDS是个文件和数据库同步软件,开源的,支持多主复制,同步时过滤和在异构的网络环境中进行数据转换传输。它支持单向和双向上的多个订阅者,异步的数据复制。  以下是从CSDN专栏...
  • 单向关联和双向关联

    千次阅读 2019-10-22 22:44:48
    单向和双向关联的区别 单向和双向关联的区别就在于,两个类是否需要互相知道。 如果类A需要知道类B,而类B也需要知道类A,那么这两个类就应该是双向关联的;...其中的个类作为另个类的方...
  • 使用vistualbox建立kgdb调试环境

    千次阅读 2012-10-24 19:05:11
    好吧,我不得不承认没有一种调试技术是万能呢,昨天刚说了UML调试linux内核,今天就又要用kgdb调试了……kgdb吧,是linux内核的私生子,他被linux内核细心的呵护和照顾着,用kgdb调试内核确实是比较主流的一种做法。...
  • 双向可控硅控制电磁铁实验

    千次阅读 2017-07-17 17:06:44
    图1 实际应用中出现这种情况,rc有漏电流产生导致在双向可控硅关断时,电磁铁有微弱振动现象,交流电压有24V,手放在电磁铁振动器能感觉到明显振动,解决方案是在lo与火线L端加个继电器,在开始工作的时候,继电器...
  • AngularJS数据的双向绑定

    千次阅读 2016-07-20 17:13:41
    数据的双向绑定 Angular实现了双向绑定机制。所谓的双向绑定,无非是...个最简单的示例就是这样: ng-controller="CounterCtrl"> ng-bind="counter"> ng-click="counter++">increase function CounterCt
  • Windows下的TCP/UDP网络调试工具-NetAssist以及Linux下的nc网络调试工具、Windows下的网络调试工具-NetAssist1.TCP服务端和客户端测试2.UDP服务端和客户端测试Linux下的网络调试命令工具-`nc`什么是ncnc的作用在...
  • 嵌入式系统编程和调试技巧

    千次阅读 2014-09-17 21:47:54
    本文描述了嵌入式系统开发中编程调试的一些技巧,如何预防BUG出现,如何设置BUG陷阱,及时发现问题和定位问题,提高开发效率。
  • [转] memcache分析调试

    千次阅读 2008-08-25 20:02:00
    [ 2007/03/13 22:04 | by... 个星期时间的工作,不可能对memcache有很深刻的分析.文档本身的目的在于为以后的研究准备个总结资料.刚接触memcache时,对其设计分布式的思路感到十分欣喜,因为在中间层以极小的代价实现

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 36,236
精华内容 14,494
关键字:

一种双向调试的过程