123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669 |
- define set_ts
- set $tsrm_ls = $arg0
- end
- document set_ts
- set the ts resource, it is impossible for gdb to
- call ts_resource_ex while no process is running,
- but we could get the resource from the argument
- of frame info.
- end
- define ____executor_globals
- if basic_functions_module.zts
- if !$tsrm_ls
- set $tsrm_ls = ts_resource_ex(0, 0)
- end
- set $eg = ((zend_executor_globals*) (*((void ***) $tsrm_ls))[executor_globals_id-1])
- set $cg = ((zend_compiler_globals*) (*((void ***) $tsrm_ls))[compiler_globals_id-1])
- else
- set $eg = executor_globals
- set $cg = compiler_globals
- end
- end
- document ____executor_globals
- portable way of accessing executor_globals, set $eg
- this also sets compiler_globals to $cg
- ZTS detection is automatically based on ext/standard module struct
- end
- define print_cvs
- ____executor_globals
- set $p = $eg.current_execute_data.CVs
- set $c = $eg.current_execute_data.op_array.last_var
- set $v = $eg.current_execute_data.op_array.vars
- set $i = 0
- printf "Compiled variables count: %d\n", $c
- while $i < $c
- printf "%d = %s\n", $i, $v[$i].name
- if $p[$i] != 0
- printzv *$p[$i]
- else
- printf "*uninitialized*\n"
- end
- set $i = $i + 1
- end
- end
- define dump_bt
- set $t = $arg0
- while $t
- printf "[%p] ", $t
- set $fst = $t->function_state
- if $fst.function->common.function_name
- if $fst.arguments
- set $count = (int)*($fst.arguments)
- if $t->object
- if $fst.function.common.scope
- printf "%s->", $fst.function.common.scope->name
- else
- if !$eg
- ____executor_globals
- end
- set $known_class = 0
- if $eg
- set $handle = $t->object.value.obj.handle
- set $handlers = $t->object.value.obj.handlers
- set $zobj = (zend_object *)$eg.objects_store.object_buckets[$handle].bucket.obj.object
- if $handlers->get_class_entry == &zend_std_object_get_class
- set $known_class = 1
- if $handlers.get_class_name
- if $handlers.get_class_name != &zend_std_object_get_class_name
- set $known_class = 0
- end
- end
- if $known_class
- printf "%s->", $zobj->ce.name
- end
- end
- end
- if !$known_class
- printf "(Unknown)->"
- end
- end
- else
- if $fst.function.common.scope
- printf "%s::", $fst.function.common.scope->name
- end
- end
- printf "%s(", $fst.function->common.function_name
- while $count > 0
- set $zvalue = *(zval **)($fst.arguments - $count)
- set $type = $zvalue->type
- if $type == 0
- printf "NULL"
- end
- if $type == 1
- printf "%ld", $zvalue->value.lval
- end
- if $type == 2
- printf "%f", $zvalue->value.dval
- end
- if $type == 3
- if $zvalue->value.lval
- printf "true"
- else
- printf "false"
- end
- end
- if $type == 4
- printf "array(%d)[%p]", $zvalue->value.ht->nNumOfElements, $zvalue
- end
- if $type == 5
- printf "object[%p]", $zvalue
- end
- if $type == 6
- ____print_str $zvalue->value.str.val $zvalue->value.str.len
- end
- if $type == 7
- printf "resource(#%d)", $zvalue->value.lval
- end
- if $type == 8
- printf "constant"
- end
- if $type == 9
- printf "const_array"
- end
- if $type > 9
- printf "unknown type %d", $type
- end
- set $count = $count -1
- if $count > 0
- printf ", "
- end
- end
- printf ") "
- else
- printf "%s() ", $fst.function->common.function_name
- end
- else
- printf "??? "
- end
- if $t->op_array != 0
- printf "%s:%d ", $t->op_array->filename, $t->opline->lineno
- end
- set $t = $t->prev_execute_data
- printf "\n"
- end
- end
- document dump_bt
- dumps the current execution stack. usage: dump_bt executor_globals.current_execute_data
- end
- define printzv
- set $ind = 1
- ____printzv $arg0 0
- end
- document printzv
- prints zval contents
- end
- define ____printzv_contents
- set $zvalue = $arg0
- set $type = $zvalue->type
- printf "(refcount=%d", $zvalue->refcount__gc
- if $zvalue->is_ref__gc
- printf ",is_ref"
- end
- printf ") "
- if $type == 0
- printf "NULL"
- end
- if $type == 1
- printf "long: %ld", $zvalue->value.lval
- end
- if $type == 2
- printf "double: %f", $zvalue->value.dval
- end
- if $type == 3
- printf "bool: "
- if $zvalue->value.lval
- printf "true"
- else
- printf "false"
- end
- end
- if $type == 4
- printf "array(%d): ", $zvalue->value.ht->nNumOfElements
- if ! $arg1
- printf "{\n"
- set $ind = $ind + 1
- ____print_ht $zvalue->value.ht 1
- set $ind = $ind - 1
- set $i = $ind
- while $i > 0
- printf " "
- set $i = $i - 1
- end
- printf "}"
- end
- set $type = 0
- end
- if $type == 5
- printf "object"
- ____executor_globals
- set $handle = $zvalue->value.obj.handle
- set $handlers = $zvalue->value.obj.handlers
- if basic_functions_module.zts
- set $zobj = zend_objects_get_address($zvalue, $tsrm_ls)
- else
- set $zobj = zend_objects_get_address($zvalue)
- end
- if $handlers->get_class_entry == &zend_std_object_get_class
- set $cname = $zobj->ce.name
- else
- set $cname = "Unknown"
- end
- printf "(%s) #%d", $cname, $handle
- if ! $arg1
- if $handlers->get_properties == &zend_std_get_properties
- set $ht = $zobj->properties
- if $ht
- printf "(%d): ", $ht->nNumOfElements
- printf "{\n"
- set $ind = $ind + 1
- ____print_ht $ht 1
- set $ind = $ind - 1
- set $i = $ind
- while $i > 0
- printf " "
- set $i = $i - 1
- end
- printf "}"
- else
- echo "no properties found"
- end
- end
- end
- set $type = 0
- end
- if $type == 6
- printf "string(%d): ", $zvalue->value.str.len
- ____print_str $zvalue->value.str.val $zvalue->value.str.len
- end
- if $type == 7
- printf "resource: #%d", $zvalue->value.lval
- end
- if $type == 8
- printf "constant"
- end
- if $type == 9
- printf "const_array"
- end
- if $type > 9
- printf "unknown type %d", $type
- end
- printf "\n"
- end
- define ____printzv
- ____executor_globals
- set $zvalue = $arg0
- printf "[%p] ", $zvalue
- if $zvalue == $eg.uninitialized_zval_ptr
- printf "*uninitialized* "
- end
- set $zcontents = (zval*) $zvalue
- if $arg1
- ____printzv_contents $zcontents $arg1
- else
- ____printzv_contents $zcontents 0
- end
- end
- define ____print_const_table
- set $ht = $arg0
- set $p = $ht->pListHead
- while $p != 0
- set $const = (zend_constant *) $p->pData
- set $i = $ind
- while $i > 0
- printf " "
- set $i = $i - 1
- end
- if $p->nKeyLength > 0
- ____print_str $p->arKey $p->nKeyLength
- printf " => "
- else
- printf "%d => ", $p->h
- end
- ____printzv_contents &$const->value 0
- set $p = $p->pListNext
- end
- end
- define print_const_table
- set $ind = 1
- printf "[%p] {\n", $arg0
- ____print_const_table $arg0
- printf "}\n"
- end
- define ____print_ht
- set $ht = (HashTable*)$arg0
- set $p = $ht->pListHead
- while $p != 0
- set $i = $ind
- while $i > 0
- printf " "
- set $i = $i - 1
- end
- if $p->nKeyLength > 0
- ____print_str $p->arKey $p->nKeyLength
- printf " => "
- else
- printf "%d => ", $p->h
- end
-
- if $arg1 == 0
- printf "%p\n", (void*)$p->pData
- end
- if $arg1 == 1
- set $zval = *(zval **)$p->pData
- ____printzv $zval 1
- end
- if $arg1 == 2
- printf "%s\n", (char*)$p->pData
- end
- set $p = $p->pListNext
- end
- end
- define print_ht
- set $ind = 1
- printf "[%p] {\n", $arg0
- ____print_ht $arg0 1
- printf "}\n"
- end
- document print_ht
- dumps elements of HashTable made of zval
- end
- define print_htptr
- set $ind = 1
- printf "[%p] {\n", $arg0
- ____print_ht $arg0 0
- printf "}\n"
- end
- document print_htptr
- dumps elements of HashTable made of pointers
- end
- define print_htstr
- set $ind = 1
- printf "[%p] {\n", $arg0
- ____print_ht $arg0 2
- printf "}\n"
- end
- document print_htstr
- dumps elements of HashTable made of strings
- end
- define ____print_ft
- set $ht = $arg0
- set $p = $ht->pListHead
- while $p != 0
- set $func = (zend_function*)$p->pData
- set $i = $ind
- while $i > 0
- printf " "
- set $i = $i - 1
- end
- if $p->nKeyLength > 0
- ____print_str $p->arKey $p->nKeyLength
- printf " => "
- else
- printf "%d => ", $p->h
- end
- printf "\"%s\"\n", $func->common.function_name
- set $p = $p->pListNext
- end
- end
- define print_ft
- set $ind = 1
- printf "[%p] {\n", $arg0
- ____print_ft $arg0
- printf "}\n"
- end
- document print_ft
- dumps a function table (HashTable)
- end
- define ____print_inh_class
- set $ce = $arg0
- if $ce->ce_flags & 0x10 || $ce->ce_flags & 0x20
- printf "abstract "
- else
- if $ce->ce_flags & 0x40
- printf "final "
- end
- end
- printf "class %s", $ce->name
- if $ce->parent != 0
- printf " extends %s", $ce->parent->name
- end
- if $ce->num_interfaces != 0
- printf " implements"
- set $tmp = 0
- while $tmp < $ce->num_interfaces
- printf " %s", $ce->interfaces[$tmp]->name
- set $tmp = $tmp + 1
- if $tmp < $ce->num_interfaces
- printf ","
- end
- end
- end
- set $ce = $ce->parent
- end
- define ____print_inh_iface
- set $ce = $arg0
- printf "interface %s", $ce->name
- if $ce->num_interfaces != 0
- set $ce = $ce->interfaces[0]
- printf " extends %s", $ce->name
- else
- set $ce = 0
- end
- end
- define print_inh
- set $ce = $arg0
- set $depth = 0
- while $ce != 0
- set $tmp = $depth
- while $tmp != 0
- printf " "
- set $tmp = $tmp - 1
- end
- set $depth = $depth + 1
- if $ce->ce_flags & 0x80
- ____print_inh_iface $ce
- else
- ____print_inh_class $ce
- end
- printf " {\n"
- end
- while $depth != 0
- set $tmp = $depth
- while $tmp != 1
- printf " "
- set $tmp = $tmp - 1
- end
- printf "}\n"
- set $depth = $depth - 1
- end
- end
- define print_pi
- set $pi = $arg0
- printf "[%p] {\n", $pi
- printf " h = %lu\n", $pi->h
- printf " flags = %d (", $pi->flags
- if $pi->flags & 0x100
- printf "ZEND_ACC_PUBLIC"
- else
- if $pi->flags & 0x200
- printf "ZEND_ACC_PROTECTED"
- else
- if $pi->flags & 0x400
- printf "ZEND_ACC_PRIVATE"
- else
- if $pi->flags & 0x800
- printf "ZEND_ACC_CHANGED"
- end
- end
- end
- end
- printf ")\n"
- printf " name = "
- ____print_str $pi->name $pi->name_length
- printf "\n}\n"
- end
- define ____print_str
- set $tmp = 0
- set $str = $arg0
- printf "\""
- while $tmp < $arg1
- if $str[$tmp] > 32 && $str[$tmp] < 127
- printf "%c", $str[$tmp]
- else
- printf "\\%o", $str[$tmp]
- end
- set $tmp = $tmp + 1
- end
- printf "\""
- end
- define printzn
- ____executor_globals
- set $ind = 0
- set $znode = $arg0
- if $znode->op_type == 1
- set $optype = "IS_CONST"
- end
- if $znode->op_type == 2
- set $optype = "IS_TMP_VAR"
- end
- if $znode->op_type == 4
- set $optype = "IS_VAR"
- end
- if $znode->op_type == 8
- set $optype = "IS_UNUSED"
- end
- printf "[%p] %s", $znode, $optype
- if $znode->op_type == 1
- printf ": "
- ____printzv &$znode->u.constant 0
- end
- if $znode->op_type == 2
- printf ": "
- set $tvar = (union _temp_variable *)((char *)$eg.current_execute_data->Ts + $znode->u.var)
- ____printzv ((union _temp_variable *)$tvar)->tmp_var 0
- end
- if $znode->op_type == 4
- printf ": "
- set $tvar = (union _temp_variable *)((char *)$eg.current_execute_data->Ts + $znode->u.var)
- ____printzv *$tvar->var.ptr_ptr 0
- end
- if $znode->op_type == 8
- printf "\n"
- end
- end
- document printzn
- print type and content of znode.
- usage: printzn &opline->op1
- end
- define printzops
- printf "op1 => "
- printzn &execute_data->opline.op1
- printf "op2 => "
- printzn &execute_data->opline.op2
- printf "result => "
- printzn &execute_data->opline.result
- end
- document printzops
- dump operands of the current opline
- end
- define zbacktrace
- ____executor_globals
- dump_bt $eg.current_execute_data
- end
- document zbacktrace
- prints backtrace.
- This command is almost a short cut for
- > (gdb) ____executor_globals
- > (gdb) dump_bt $eg.current_execute_data
- end
- define zmemcheck
- set $p = alloc_globals.head
- set $stat = "?"
- set $total_size = 0
- if $arg0 != 0
- set $not_found = 1
- else
- set $not_found = 0
- end
- printf " block size status file:line\n"
- printf "-------------------------------------------------------------------------------\n"
- while $p
- set $aptr = $p + sizeof(struct _zend_mem_header) + sizeof(align_test)
- if $arg0 == 0 || (void *)$aptr == (void *)$arg0
- if $p->magic == 0x7312f8dc
- set $stat = "OK"
- end
- if $p->magic == 0x99954317
- set $stat = "FREED"
- end
- if $p->magic == 0xfb8277dc
- set $stat = "CACHED"
- end
- set $filename = strrchr($p->filename, '/')
- if !$filename
- set $filename = $p->filename
- else
- set $filename = $filename + 1
- end
- printf " %p ", $aptr
- if $p->size == sizeof(struct _zval_struct) && ((struct _zval_struct *)$aptr)->type >= 0 && ((struct _zval_struct *)$aptr)->type < 10
- printf "ZVAL?(%-2d) ", $p->size
- else
- printf "%-9d ", $p->size
- end
- set $total_size = $total_size + $p->size
- printf "%-06s %s:%d", $stat, $filename, $p->lineno
- if $p->orig_filename
- set $orig_filename = strrchr($p->orig_filename, '/')
- if !$orig_filename
- set $orig_filename = $p->orig_filename
- else
- set $orig_filename = $orig_filename + 1
- end
- printf " <= %s:%d\n", $orig_filename, $p->orig_lineno
- else
- printf "\n"
- end
- if $arg0 != 0
- set $p = 0
- set $not_found = 0
- else
- set $p = $p->pNext
- end
- else
- set $p = $p->pNext
- end
- end
- if $not_found
- printf "no such block that begins at %p.\n", $aptr
- end
- if $arg0 == 0
- printf "-------------------------------------------------------------------------------\n"
- printf " total: %d bytes\n", $total_size
- end
- end
- document zmemcheck
- show status of a memory block.
- usage: zmemcheck [ptr].
- if ptr is 0, all blocks will be listed.
- end
|