zoukankan      html  css  js  c++  java
  • javascript调试原理(一)(转)

    我们先看一下C/C++和java的调试原理

    C/C++调试原理:目前比较流行的调试工具是 GDB 和微软的 Visual Studio 自带的debugger,在这种 debugger 中,首先,需要编译一个“ debug ”模式的程序,将调试语句编译到该程序中。其次,在调试过程中,debugger 将会深层接入程序的运行,掌握和控制运行态的一些信息,并将这些信息及时返回。

    Java调试原理:Java的调试使用Java 虚拟机工具接口(Java Virtual Machine Tool Interface,JVMTI)提供的调试接口。包括进入一个函数,进入一个语句的事件,得到当前上下文的API等等,你只要注册了这些事件,调用这些API即可。

    从上面可以看出,调试的方式主要有两种,一种是自己写编辑,在目标文件中加入调试代码,由调试代码来做调试工作,另一种是运行该语言的容器本身提供了调试接口。

    我们再来看javascript的调试。

    目前的javascript调试工具也是用的第二种调试方式,IE和firefox分别提供了javascript的调试接口。

    以firefox为例,它提供的调试接口是:jsdIDebuggerService,我们可以向它注入一些调试的钩子,来实现调试,它提供的调试钩子主要有:

    钩子类 说明
    breakpointHook Called when the engine encounters a breakpoint.
    debuggerHook Called when the engine encounters the debugger keyword.
    debugHook Called when the errorHook returns false.
    errorHook Called when an error or warning occurs.
    functionHook Called before and after a function is called.
    interruptHook Called before the next PC is executed.
    scriptHook Called when a jsdIScript is created or destroyed.
    throwHook Called when an exception is thrown (even if it will be caught.)
    topLevelHook Called before and after a toplevel script is evaluated.

    包括firebug,venkman,ATF,aptana等调试工具都是实现这些钩子类来做调试的,譬如要做错误定位,就要实现errorHook,errorHook有一个方法

    onError(message, fileName, lineNo, pos, flags, errnum, exc)就给出了错误信息,错误文件,行号,位置,等信息。只要向jsdIDebuggerService上注册errorHook,firefox发生js错误时就会调用该方法。

    这种调试技术目前已经成熟,但是却都是只能在单个浏览器上调试,我们要在其它浏览器上调试还是比较困难的。

    开源项目Javascript Debug Toolkit用另一种原理做了跨浏览器调试javascript的工具,和C/C++的调试一样,它先把javascript编译为带调试代码的目标文件,在浏览器中运行,只要这些调试代码能够做到跨浏览器,整个调试工具就能跨浏览器了。

    我们看一下Javascript Debug Toolkit是如何工作的。来看一个例子。

    源代码

    function test(a,b){

        var c = a + b;

        return c;

    }

    目标调试代码

    jsdebug("test.js",1);function test(a,b){

    jsdebug("test.js",2);    var c = a + b;

    jsdebug("test.js",3);    return c;

    jsdebug("test.js",4);}

    这样在每一行代码执行前都会调用jsdebug函数,该函数可以向调试服务器发调试通知,可以把当前的context传给调试服务器,调试服务器与调试代码进行交互(通过ajax技术),包括单步执行,跟进,跟出等都会可以实现。

    这种技术的最大好处就是跨浏览器,目前已经能够在ie,firefox,safari,chrome,opera以及一些掌机浏览器上调试javascript。相信这种技术也会很快被使用起来,会有更多跨浏览器的javascript调试工具出现。

  • 相关阅读:
    HDU-2502-月之数
    C语言的位运算的优势
    HDU-1026-Ignatius and the Princess I
    HDU-1015-Safecracker
    HDU-1398-Square Coins
    HDU-1028-Ignatius and the Princess III
    背包的硬币问题
    HDU-1527-取石子游戏
    HDU-1996-汉诺塔VI
    css中的选择器
  • 原文地址:https://www.cnblogs.com/gdutbean/p/2352581.html
Copyright © 2011-2022 走看看