# Introduction V8 has support for debugging the JavaScript code running in it. There are two API's for this a function based API using JavaScript objects and a message based API using a JSON based protocol. The function based API can be used by an in-process debugger agent, whereas the message based API can be used out of process as well. **> The message based API is no longer maintained. Please ask in v8-users@googlegroups.com if you want to attach a debugger to the run-time.** The debugger protocol is based on [JSON](http://www.json.org/)). Each protocol packet is defined in terms of JSON and is transmitted as a string value. All packets have two basic elements `seq` and `type`. ``` { "seq" : , "type" : , ... } ``` The element `seq` holds the sequence number of the packet. And element type is the type of the packet. The type is a string value with one of the following values `"request"`, `"response"` or `"event"`. A `"request"` packet has the following structure: ``` { "seq" : , "type" : "request", "command" : "arguments" : ... } ``` A `"response"` packet has the following structure. If `success` is true `body` will contain the response data. If `success` is false `message` will contain an error message. ``` { "seq" : , "type" : "response", "request_seq" : , "command" : "body" : ... "running" : "success" : "message" : } ``` An `"event"` packet has the following structure: ``` { "seq" : , "type" : "event", "event" : body : ... } ``` # Request/response pairs ## Request `continue` The request `continue` is a request from the debugger to start the VM running again. As part of the `continue` request the debugger can specify if it wants the VM to perform a single step action. ``` { "seq" : , "type" : "request", "command" : "continue", "arguments" : { "stepaction" : <"in", "next" or "out">, "stepcount" : } } ``` In the response the property `running` will always be true as the VM will be running after executing the `continue` command. If a single step action is requested the VM will respond with a `break` event after running the step. ``` { "seq" : , "type" : "response", "request_seq" : , "command" : "continue", "running" : true "success" : true } ``` Here are a couple of examples. ``` {"seq":117,"type":"request","command":"continue"} {"seq":118,"type":"request","command":"continue","arguments":{"stepaction":"out"}} {"seq":119,"type":"request","command":"continue","arguments":{"stepaction":"next","stepcount":5}} ``` ## Request `evaluate` The request `evaluate` is used to evaluate an expression. The body of the result is as described in response object serialization below. ``` { "seq" : , "type" : "request", "command" : "evaluate", "arguments" : { "expression" : , "frame" : , "global" : , "disable_break" : , "additional_context" : [ { "name" : , "handle" : }, { "name" : , "handle" : }, ... ] } } ``` Optional argument `additional_context` specifies handles that will be visible from the expression under corresponding names (see example below). Response: ``` { "seq" : , "type" : "response", "request_seq" : , "command" : "evaluate", "body" : ... "running" : "success" : true } ``` Here are a couple of examples. ``` {"seq":117,"type":"request","command":"evaluate","arguments":{"expression":"1+2"}} {"seq":118,"type":"request","command":"evaluate","arguments":{"expression":"a()","frame":3,"disable_break":false}} {"seq":119,"type":"request","command":"evaluate","arguments":{"expression":"[o.a,o.b,o.c]","global":true,"disable_break":true}} {"seq":120,"type":"request","command":"evaluate","arguments":{"expression":"obj.toString()", "additional_context": [{ "name":"obj","handle":25 }] }} ``` ## Request `lookup` The request `lookup` is used to lookup objects based on their handle. The individual array elements of the body of the result is as described in response object serialization below. ``` { "seq" : , "type" : "request", "command" : "lookup", "arguments" : { "handles" : , "includeSource" : , } } ``` Response: ``` { "seq" : , "type" : "response", "request_seq" : , "command" : "lookup", "body" : "running" : "success" : true } ``` Here are a couple of examples. ``` {"seq":117,"type":"request","command":"lookup","arguments":{"handles":"[1]"}} {"seq":118,"type":"request","command":"lookup","arguments":{"handles":"[7,12]"}} ``` ## Request `backtrace` The request `backtrace` returns a backtrace (or stacktrace) from the current execution state. When issuing a request a range of frames can be supplied. The top frame is frame number 0. If no frame range is supplied data for 10 frames will be returned. ``` { "seq" : , "type" : "request", "command" : "backtrace", "arguments" : { "fromFrame" : "toFrame" : "bottom" : } } ``` The response contains the frame data together with the actual frames returned and the toalt frame count. ``` { "seq" : , "type" : "response", "request_seq" : , "command" : "backtrace", "body" : { "fromFrame" : "toFrame" : "totalFrames" : "frames" : } "running" : "success" : true } ``` If there are no stack frames the result body only contains `totalFrames` with a value of `0`. When an exception event is generated due to compilation failures it is possible that there are no stack frames. Here are a couple of examples. ``` {"seq":117,"type":"request","command":"backtrace"} {"seq":118,"type":"request","command":"backtrace","arguments":{"toFrame":2}} {"seq":119,"type":"request","command":"backtrace","arguments":{"fromFrame":0,"toFrame":9}} ``` ## Request `frame` The request frame selects a new selected frame and returns information for that. If no frame number is specified the selected frame is returned. ``` { "seq" : , "type" : "request", "command" : "frame", "arguments" : { "number" : } } ``` Response: ``` { "seq" : , "type" : "response", "request_seq" : , "command" : "frame", "body" : { "index" : , "receiver" : , "func" : , "script" :