php-src/sapi/phpdbg/xml.md
2019-10-19 19:19:28 +02:00

20 KiB

phpdbg XML format

Common attributes

severity

  • indicates the genre of phpdbg system output
  • usually one of these values:
  • normal
  • notice
  • error

msgout

  • text message output related to the xml data (e.g. <intro severity="normal" help="help" msgout="To get help using phpdbg type &quot;help&quot; and press enter" />)

req

  • the request id, if one was passed to the last command (via -r %d, where %d is the id) (and the output is related to that message)

file

  • refers to a filename

method

  • format classname::methodname
  • refers to a method

function

  • refers to a function

symbol

  • either function or method (is method if "::" are present)

opline

  • in hexadecimal format
  • refers to a specific pointer to a (zend_)op

opcode

  • refers to an opcode (ZEND_*)

type

  • general attribute for most errors, describes the genre of the error

General tags

intro

  • appears on startup if -q flag wasn't provided as command line arg
  • before any input possibility
  • attributes may be spread over multiple tags
  • wrapped in <intros> tag

attributes

  • version: current phpdbg version (as string)
  • help: command name for help
  • report: URL for bug reporting

phpdbg

  • general text message output from phpdbg system

stream

  • any output by PHP itself (e.g. <stream type="stdout">test</stream>)

attributes

  • type: stderr or stdout

php

  • php error output

attributes

  • msg: the error message

General error tags

command

  • general errors about commands

possible attributes

  • type
  • toomanyargs: more arguments than allowed
  • noarg: argument missing
  • wrongarg: wrong type of argument (e.g. letters instead of integer)
  • toofewargs: not enough arguments
  • notfound: command (or subcommand) doesn't exist
  • ambiguous: command was ambiguous
  • invalidcommand: command input is totally invalid
  • (nostack: should not happen: is an internal error)
  • (emptystack: should not happen: is an internal error)
  • command: passed command
  • subcommand: passed subcommand (present if the error is related to the subcommand)
  • expected: count of expected arguments
  • got: type of argument for type "wrongarg"
  • num: if possible, information about which parameter had a wrong argument

inactive

  • by type
  • op_array: nothing was yet compiled (probably because no execution context set)
  • symbol_table: no symbol table present (not yet initiailized or already destructed)
  • noexec: not in execution
  • memory_manager: using the native memory manager (malloc, free, realloc) instead of e.g. the Zend MM
  • notfound: file not found
  • nocontext: execution context was not set (or compilation had failed)
  • isrunning: command requires no running script

Commands

export

  • tag: <exportbreakpoint />
  • usually triggered by successful export command
  • may appear when cleaning to temporary store breakpoints
  • errors by type
  • openfailure: could not create file

attributes

  • count: number of exported breakpoints

break / info break

  • General tag for breakpoint creation, deletion and hits is "<breakpoint />"

possible attributes

  • id: the breakpoint id (if the leave command was executed, the id has the value "leave")

  • num: the nth opline of a function/method/file

  • add: has value "success"/"fail": a brekpoint was successfully/not added

  • pending: the breakpoint is waiting for resolving (e.g. a file opline on a not yet loaded file)

  • deleted: has value "success"/"fail": a breakpoint was successfully/not deleted

  • eval: the condition on conditional breakpoints

  • file

  • opline

  • opcode

  • symbol

  • function

  • method

  • line

  • listing breakpoints always in a container element "<breakpoints>"

  • Child nodes:

  • function

  • method

  • file

  • opline

  • methodopline

  • functionopline

  • fileopline

  • evalfunction

  • evalfunctionopline

  • evalmethod

  • evalmethodopline

  • evalfile

  • evalopline

  • eval

  • opcode

  • attributes:

  • name: name of the symbol (function/method/file/opcode)

  • disabled: empty value if enabled, non-empty if enabled

  • errors (by type)

  • exists: the breakpoint already exists

  • maxoplines: tries to break at an opline (usedoplinenum) higher than the number of present oplines (in maxoplinenum)

  • nomethod: method doesn't exist

  • internalfunction: one cannot break on an opline of an internal function

  • notregular: tries to set a breakpoint in not a regular file

  • (invalidparameter: should not happen: is an internal error)

frame

  • General tag for frames is "<frame>"
  • always has id attribute; if it only has id attribute, it just indicates current frame number, no other elements follow
  • may contain other elements (of type <arg>) when contained in <backtrace> tag
  • <arg> always contains a <stream> element, the value of the variable

possible attributes

  • id: the frame id, current frame has id 0 (frames with internal function calls have the same id than their called frame)

  • symbol ("{main}" is root frame)

  • file

  • line

  • internal: has value "internal" when being an internal function call (one cannot inspect that frame)

  • being an error: (by type)

  • maxnum: tried to access a frame with a number higher than existing (or < 0)

attributes on <arg>

  • variadic: has a non-empty value if the argument is variadic
  • name: variable name of parameter

info (subcommands)

break

  • See above ("break / info break")

### files ###

  • lists included files
  • <includedfileinfo num="" /> with num having an integer value, indicating the number of included files
  • <includedfile name=""/>: one per file, with name being the file path of the included file

error

  • gets last error
  • <lasterror error="" (file="" line="") />
  • error attribute contains the last error as a string, is empty if there's no last error

vars / globals

  • <variableinfo num="" /> with num having an integer value, indicating the number of (local or superglobal) variables
  • if info vars was used it'll have also one of these attributes:
  • method
  • function
  • file
  • opline
  • for each variable there is a <variable> followed by a <variabledetails> element
  • <variable address="" refcount="" type="" name="" />
  • address: pointer to zval (hexadecimal)
  • refcount: refcount of zval
  • type: the variable type (long, string, ...). If the value is "unknown", the other attributes are meaningless
  • name: the name of the variable
  • refstatus: empty if the zval is not a reference
  • class: the class the object in the zval is an instance of
  • resource: the type of the resource in the zval

literal

  • <literalinfo num="" /> with num having an integer value, indicating the number of literals, optional arguments are:
  • method
  • function
  • file
  • opline
  • for each literal there is a <literal> followed by a <stream type="stdout"> which prints the value of the literal
  • <literal id="" />: where id is the internal identifier of the literal

memory

  • Format:

    <meminfo /> <current /> <used mem="" /> <real mem="" /> <peak /> <used mem="" /> <real mem="" />

  • mem is an attribute whose value is a float. The memory is given in kilobytes (1 kB == 1024 bytes)

classes

  • <classinfo num="" /> with num having an integer value, indicating the number of loaded user-defined classes
  • Each class is enumerated with first a <class>, then an optional <parents> container and then a <classsource> element
  • The <parents> container contains the <class> elements of the parent of the last <class> element.
  • <class type="" flags="" name="" methodcount="" />
  • type: either "User" or "Internal"
  • flags: either "Interface", "Class" or "Abstract Class"
  • <classsource /> where the class was defined, if there are no attributes, location is unknown, usually defined by
  • file
  • line

funcs

  • <functioninfo num="" /> with num having an integer value, indicating the number of loaded user-defined functions
  • Each class is enumerated with first a <function> and then a <functionsource> element
  • <function name="" />
  • <functionsource /> where the function was defined, if there are no attributes, location is unknown, usually defined by
  • file
  • line

list

  • consists of <line> elements wrapped in a <list> container
  • <list file=""> is the container element with file being the filename
  • <line line="" code="" /> with value of code being the whole line of code in the line specified in the line attribute
  • current: this attribute is set to "current" if that line is the line where the executor currently is

print

without a subcommand

  • <print> elements are wrapped in a <printinfo> element
  • there may be a variable number of <print> elements with a variable count of args inside the <printinfo> element
  • possible args are:
  • readline: yes/no - readline enabled or disabled
  • libedit: yes/no - libedit enabled or disabled
  • context: current executing context
  • compiled: yes/no - are there actual compiled ops?
  • stepping: @@ TODO (meaningless for now) @@
  • quiet: on/off - should it always print the opline being currently executed?
  • oplog: on/off - are oplines logged in a file?
  • ops: number of opcodes in current executing context
  • vars: number of compiled variables (CV)
  • executing: yes/no - in executor?
  • vmret: the return value of the last executed opcode
  • default: continue
  • 1: return from vm
  • 2: enter stack frame
  • 3: leave stack frame
  • classes: number of classes
  • functions: number of functions
  • constants: number of constants
  • includes: number of included files

with a subcommand

  • introduced by <printinfo num="" /> (except for print opline) with num being the number of opcodes and one of these args:
  • file
  • method
  • function
  • class (then also type and flags attributes, see info classes command for their meanings)
  • symbol (also type and flags attributes; here the value of flags is either "Method" or "Function")
  • if there is a class method, the methods are all wrapped in a <printmethods> container
  • then comes a <printoplineinfo type="" /> where type is either "User" or "Internal"
  • the <printoplineinfo> has either a method or a function attribute
  • if the type is "Internal"
  • there are no oplines, it's an internal method or function
  • if the type is "User"
  • it has these attributes
    • startline: the first line of code where the method or function is defined
    • endline: the lastt line of code where the method or function is defined
    • file: the file of code where the method or function is defined
  • is followed by the oplines of that method or function (<print> elements)
  • <print line="%u" opline="%p" opcode="%s" op="%s" />
  • in case of print opline it emits a single <opline line="" opline="" opcode="" op="" file="" />

exec

  • command executing and compiling a given file
  • <exec type="unset" context="" />: indicates unsetting of the old context
  • <exec type="unsetops" />: indicates unsetting of the old compiled opcodes
  • <exec type="unchanged" />: same execution context chosen again
  • <exec type="set" context="" />: indicates setting of the new context
  • errors by tag
  • <compile>
  • openfailure: couldn't open file
  • compilefailure: The file indicated in context couldn't be compiled
  • <exec>
  • invalid: given context (attribute) is not matching a valid file or symlink
  • notfound: given context (attribute) does not exist

run / <stop> tag

  • runs the script (set via exec command)
  • <stop type="end" />: script execution ended normally
  • (error) <stop type="bailout" /> the VM bailed out (usually because there was some error)
  • compile failures see under exec, errors, <compile>

step

  • steps by one line or opcode (as defined via set stepping) default is one line
  • returns back to the executor

continue

  • returns back to the executor

until

  • temporarily disables all the breakpoints on that line until that line was left once
  • returns back to the executor

finish

  • temporarily disables all the breakpoints until the end of the current frame
  • returns back to the executor

leave

  • temporarily disables all the breakpoints past the end of the current frame and then stops
  • returns back to the executor

back

  • prints backtrace
  • see frame command

ev

  • eval()uates some code
  • output wrapped in <eval> tags

sh

  • executes shell command
  • still pipes to stdout ... without wrapping <stream> !!! (@@ TODO @@)

source

  • executes a file in .phpdbginit format
  • errors by type
  • notfound: file not found

register

  • registers a function to be used like a command
  • <register function="" />: successfully registered function
  • errors by type
  • notfound: no such function
  • inuse: function already registered

quit

  • quits phpdbg
  • if successful connection will be closed...

clean

  • cleans environment (basically a shutdown + new startup)
  • <clean> tags wrapped in a <cleaninfo> container
  • possible attributes of <clean> tag
  • classes: number of classes
  • functions: number of functions
  • constants: number of constants
  • includes: number of included files

clear

  • removes all breakpoints
  • <clear> tags wrapped in a <clearinfo> container
  • possible attributes of <clear> tag (value is always the number of defined breakpoints of that type)
  • files
  • functions
  • methods
  • oplines
  • fileoplines
  • functionoplines
  • methodoplines
  • eval

watch

  • watchpoints generally are identified by a variable (one may need to switch frames first...)
  • <watch variable="" />, <watchrecursive variable="" /> and <watcharray variable="" /> (normal, array, recursive)
  • <watch> if error, by type:
  • undefined: tried to set a watchpoint on a not (yet) defined variable
  • notiterable: element which is tried to be accessed as an object or array is nor array nor object
  • invalidinput: generally malformed input
  • <watchdelete variable="" />: when "watch delete" was used on a watchpoint
  • (error) <watchdelete type="nowatch" />: that watchpoint doesn't exist, so couldn't be deleted
  • for hit watchpoints etc., see Other tags, <watch*>
  • when using watch list, <watchvariable> elements are wrapped in a <watchlist> container
  • <watchvariable variable="" on="" type="" />
  • variable: watched variable (may be a variable of another scope!)
  • on: values are array or variable, depending on what is watched
  • type: values are recursive or simple, depending on whether the watchpoint is checked recursively or not

set

  • a general error is type="wrongargs" where a wrong argument was passed to a subcommand; tag is then <set*>

prompt

  • without other args, a <setpromt str="" /> tag is emitted where the value of the str attribute is the value of the prompt
  • when there is another arg, the prompt is changed to that arg, no further xml answer

break

  • enables / disables a given breakpoint silently with no further xml answer
  • if the boolean switch is omitted, it emits current state in a <setbreak id="" active="" /> where active is on or off
  • error with type="nobreak", when no breakpoint with the given id exists

breaks

  • generally enables / disables breakpoint functionality silently with no further xml answer
  • if the boolean switch is omitted, it emits current state in a <setbreaks active="" /> where active is on or off

color

  • sets the color on prompt, error or notices
  • <setcolor type="" color="" code="" />: code is the color code of color, type is either:
  • prompt
  • error
  • notice
  • errors by type:
  • nocolor: color doesn't exist
  • invalidtype: type wasn't one of the three allowed types

colors

  • generally enables / disables colors silently with no further xml answer
  • if the boolean switch is omitted, it emits current state in a <setcolors active="" /> where active is on or off

oplog

  • sets oplog
  • (error) <setoplog type="openfailure" file="" /> when it couldn't open the passed file path
  • <setoplog type="closingold" /> is emitted when there was a previous open oplog (and a file is passed)
  • if no further argument is passed, it emits current state in a <setoplog active="" /> where active is on or off

quiet

  • generally enables / disables quietness silently with no further xml answer
  • if the boolean switch is omitted, it emits current state in a <setquiet active="" /> where active is on or off

setpping

  • sets stepping to either opcode or line (so a step command will either advance one op or one line)
  • if no further argument is passed, it emits current state in a <setoplog type="" /> where active is opcode or line

refcount

  • generally enables / disables showing of refcount in watchpoint breaks silently with no further xml answer
  • if the boolean switch is omitted, it emits current state in a <setrefcount active="" /> where active is on or off

wait

  • internally executes exec, so exec will output first (if binding to socket worked)

attributes

  • import: has value "success"/"fail"
  • missingmodule/missingextension: modules/extensions loaded in the target SAPI, but not in phpdbg

errors (by type)

  • nosocket: couldn't establish socket
  • invaliddata: invalid JSON passed to socket

dl

  • loads a module or Zend extension at a given path
  • if a relative path is passed, it's relative to the extension_dir ini setting

attributes

  • extensiontype: "Zend extension" or "module"
  • name: the extension name
  • path: the path where it was loaded

errors (by type)

  • unsupported: dynamic extension loading is unsupported

  • relpath: relative path given, but no extension_dir defined

  • unknown: general error with internal DL_LOAD() (for message see msg attribute)

  • wrongapi: wrong Zend engine version (apineeded / apiinstalled attributes give information about the API versions)

  • wrongbuild: unmatched build versions (buildneeded / buildinstalled attributes give information about the build versions)

  • registerfailure: registering module failed

  • startupfailure: couldn't startup Zend extension / module

  • initfailure: couldn't initialize module

  • nophpso: passed shared object is not a valid Zend extension nor module

  • errors may have the module or extension attribute when their name is already known at the point of failure

Other tags

<signal>

  • received caught signal

attributes

  • type: type of signal (e.g. SIGINT)

by type

  • SIGINT: interactive mode is entered...

<watch*>

  • generally emitted on hit watchpoint
  • <watchdelete variable="" />: when a variable was unset, the watchpoint is removed too
  • <watchhit variable="" />: when ever a watched variable is changed, followed by a <watchdata> container
  • <watchdata> may contain
  • for watchpoints on variables:
  • each of these <watch*> tags contains a type attribute whose value is either "old" or "new")
  • <watchvalue type="" inaccessible="inaccessible" />: old value is inaccessible
  • <watchvalue type=""> may contain a <stream> element which indicates the old/new (type attribute) value of the variable
  • <watchrefcount type="" refcount="" isref="" />: old/new (type attribute) refcount and isref, both numbers
  • isref: if the value is 0, it's not a reference, else it is one
  • for watchpoints on arrays:
  • <watchsize> inspects size variations of an array (the sum):
  • removed: number of elements removed
  • added: number of elements added
  • <watcharrayptr>: if this tag appears, the internal pointer of the array way changed

<signalsegv>

  • generally emitted when data couldn't be fetched (e.g. by accessing inconsistent data); only used in hard interrupt mode
  • it might mean that data couldn't be fetched at all, or that only incomplete data was fetched (e.g. when a fixed number of following attributes are fetched, this tag will mark a stop of fetching if none or not all tags were printed)