php-internal-docs
8.4.8
Unofficial docs for php/php-src
Loading...
Searching...
No Matches
debug_gdb_scripts.c
Go to the documentation of this file.
1
/*
2
* Generated by debug_gdb_scripts_gen.php.
3
*
4
* This inlines .gdbinit and php_gdb.py into the .debug_gdb_scripts
5
* section of the binary, so that they can be found by gdb.
6
*
7
* See https://sourceware.org/gdb/current/onlinedocs/gdb.html/dotdebug_005fgdb_005fscripts-section.html#dotdebug_005fgdb_005fscripts-section
8
*/
9
asm
(
10
".pushsection \".debug_gdb_scripts\", \"MS\",%progbits,1\n"
11
".byte 4 /* Python Text */\n"
12
".ascii \"gdb.inlined-script\\n\"\n"
13
".ascii \"gdb.execute('''\\n\"\n"
14
".ascii \"define set_ts\\n\"\n"
15
".ascii \" set $tsrm_ls = $arg0\\n\"\n"
16
".ascii \"end\\n\"\n"
17
".ascii \"\\n\"\n"
18
".ascii \"document set_ts\\n\"\n"
19
".ascii \" set the ts resource, it is impossible for gdb to\\n\"\n"
20
".ascii \" call ts_resource_ex while no process is running,\\n\"\n"
21
".ascii \" but we could get the resource from the argument\\n\"\n"
22
".ascii \" of frame info.\\n\"\n"
23
".ascii \"end\\n\"\n"
24
".ascii \"\\n\"\n"
25
".ascii \"define ____executor_globals\\n\"\n"
26
".ascii \" if basic_functions_module.zts\\n\"\n"
27
".ascii \" set $tsrm_ls = _tsrm_ls_cache\\n\"\n"
28
".ascii \" set $eg = ((zend_executor_globals*) (*((void ***) $tsrm_ls))[executor_globals_id-1])\\n\"\n"
29
".ascii \" set $cg = ((zend_compiler_globals*) (*((void ***) $tsrm_ls))[compiler_globals_id-1])\\n\"\n"
30
".ascii \" set $eg_ptr = $eg\\n\"\n"
31
".ascii \" else\\n\"\n"
32
".ascii \" set $eg = executor_globals\\n\"\n"
33
".ascii \" set $cg = compiler_globals\\n\"\n"
34
".ascii \" set $eg_ptr = (zend_executor_globals*) &executor_globals\\n\"\n"
35
".ascii \" end\\n\"\n"
36
".ascii \"end\\n\"\n"
37
".ascii \"\\n\"\n"
38
".ascii \"document ____executor_globals\\n\"\n"
39
".ascii \" portable way of accessing executor_globals, set $eg\\n\"\n"
40
".ascii \" this also sets compiler_globals to $cg\\n\"\n"
41
".ascii \" ZTS detection is automatically based on ext/standard module struct\\n\"\n"
42
".ascii \"end\\n\"\n"
43
".ascii \"\\n\"\n"
44
".ascii \"define print_cvs\\n\"\n"
45
".ascii \" if $argc == 0\\n\"\n"
46
".ascii \" ____executor_globals\\n\"\n"
47
".ascii \" set $cv_ex_ptr = $eg.current_execute_data\\n\"\n"
48
".ascii \" else\\n\"\n"
49
".ascii \" set $cv_ex_ptr = (zend_execute_data *)$arg0\\n\"\n"
50
".ascii \" end\\n\"\n"
51
".ascii \" set $cv_count = $cv_ex_ptr.func.op_array.last_var\\n\"\n"
52
".ascii \" set $cv = $cv_ex_ptr.func.op_array.vars\\n\"\n"
53
".ascii \" set $cv_idx = 0\\n\"\n"
54
".ascii \" set $callFrameSize = (sizeof(zend_execute_data) + sizeof(zval) - 1) / sizeof(zval)\\n\"\n"
55
".ascii \"\\n\"\n"
56
".ascii \" printf \\\"Compiled variables count: %d\\\\\\\\n\\\\\\\\n\\\", $cv_count\\n\"\n"
57
".ascii \" while $cv_idx < $cv_count\\n\"\n"
58
".ascii \" printf \\\"[%d] \\\\'%s\\\\'\\\\\\\\n\\\", $cv_idx, $cv[$cv_idx].val\\n\"\n"
59
".ascii \" set $zvalue = ((zval *) $cv_ex_ptr) + $callFrameSize + $cv_idx\\n\"\n"
60
".ascii \" printzv $zvalue\\n\"\n"
61
".ascii \" set $cv_idx = $cv_idx + 1\\n\"\n"
62
".ascii \" end\\n\"\n"
63
".ascii \"end\\n\"\n"
64
".ascii \"\\n\"\n"
65
".ascii \"document print_cvs\\n\"\n"
66
".ascii \" Prints the compiled variables and their values.\\n\"\n"
67
".ascii \" If a zend_execute_data pointer is set this will print the compiled\\n\"\n"
68
".ascii \" variables of that scope. If no parameter is used it will use\\n\"\n"
69
".ascii \" current_execute_data for scope.\\n\"\n"
70
".ascii \"\\n\"\n"
71
".ascii \" usage: print_cvs [zend_execute_data *]\\n\"\n"
72
".ascii \"end\\n\"\n"
73
".ascii \"\\n\"\n"
74
".ascii \"define dump_bt\\n\"\n"
75
".ascii \" set $ex = $arg0\\n\"\n"
76
".ascii \" while $ex\\n\"\n"
77
".ascii \" printf \\\"[%p] \\\", $ex\\n\"\n"
78
".ascii \" set $func = $ex->func\\n\"\n"
79
".ascii \" if $func\\n\"\n"
80
".ascii \" if $ex->This->value.obj\\n\"\n"
81
".ascii \" if $func->common.scope\\n\"\n"
82
".ascii \" printf \\\"%s->\\\", (char*)$func->common.scope->name->val\\n\"\n"
83
".ascii \" else\\n\"\n"
84
".ascii \" printf \\\"%s->\\\", (char*)$ex->This->value.obj->ce.name->val\\n\"\n"
85
".ascii \" end\\n\"\n"
86
".ascii \" else\\n\"\n"
87
".ascii \" if $func->common.scope\\n\"\n"
88
".ascii \" printf \\\"%s::\\\", (char*)$func->common.scope->name->val\\n\"\n"
89
".ascii \" end\\n\"\n"
90
".ascii \" end\\n\"\n"
91
".ascii \"\\n\"\n"
92
".ascii \" if $func->common.function_name\\n\"\n"
93
".ascii \" printf \\\"%s(\\\", (char*)$func->common.function_name->val\\n\"\n"
94
".ascii \" else\\n\"\n"
95
".ascii \" printf \\\"(main\\\"\\n\"\n"
96
".ascii \" end\\n\"\n"
97
".ascii \"\\n\"\n"
98
".ascii \" set $callFrameSize = (sizeof(zend_execute_data) + sizeof(zval) - 1) / sizeof(zval)\\n\"\n"
99
".ascii \"\\n\"\n"
100
".ascii \" set $count = $ex->This.u2.num_args\\n\"\n"
101
".ascii \" set $arg = 0\\n\"\n"
102
".ascii \" while $arg < $count\\n\"\n"
103
".ascii \" if $arg > 0\\n\"\n"
104
".ascii \" printf \\\", \\\"\\n\"\n"
105
".ascii \" end\\n\"\n"
106
".ascii \"\\n\"\n"
107
".ascii \" set $zvalue = (zval *) $ex + $callFrameSize + $arg\\n\"\n"
108
".ascii \" set $type = $zvalue->u1.v.type\\n\"\n"
109
".ascii \" if $type == 1\\n\"\n"
110
".ascii \" printf \\\"NULL\\\"\\n\"\n"
111
".ascii \" end\\n\"\n"
112
".ascii \" if $type == 2\\n\"\n"
113
".ascii \" printf \\\"false\\\"\\n\"\n"
114
".ascii \" end\\n\"\n"
115
".ascii \" if $type == 3\\n\"\n"
116
".ascii \" printf \\\"true\\\"\\n\"\n"
117
".ascii \" end\\n\"\n"
118
".ascii \" if $type == 4\\n\"\n"
119
".ascii \" printf \\\"%ld\\\", $zvalue->value.lval\\n\"\n"
120
".ascii \" end\\n\"\n"
121
".ascii \" if $type == 5\\n\"\n"
122
".ascii \" printf \\\"%f\\\", $zvalue->value.dval\\n\"\n"
123
".ascii \" end\\n\"\n"
124
".ascii \" if $type == 6\\n\"\n"
125
".ascii \" ____print_str (char*)$zvalue->value.str->val $zvalue->value.str->len\\n\"\n"
126
".ascii \" end\\n\"\n"
127
".ascii \" if $type == 7\\n\"\n"
128
".ascii \" printf \\\"array(%d)[%p]\\\", $zvalue->value.arr->nNumOfElements, $zvalue\\n\"\n"
129
".ascii \" end\\n\"\n"
130
".ascii \" if $type == 8\\n\"\n"
131
".ascii \" printf \\\"object[%p]\\\", $zvalue\\n\"\n"
132
".ascii \" end\\n\"\n"
133
".ascii \" if $type == 9\\n\"\n"
134
".ascii \" printf \\\"resource(#%d)\\\", $zvalue->value.lval\\n\"\n"
135
".ascii \" end\\n\"\n"
136
".ascii \" if $type == 10\\n\"\n"
137
".ascii \" printf \\\"reference\\\"\\n\"\n"
138
".ascii \" end\\n\"\n"
139
".ascii \" if $type > 10\\n\"\n"
140
".ascii \" printf \\\"unknown type %d\\\", $type\\n\"\n"
141
".ascii \" end\\n\"\n"
142
".ascii \" set $arg = $arg + 1\\n\"\n"
143
".ascii \" end\\n\"\n"
144
".ascii \"\\n\"\n"
145
".ascii \" printf \\\") \\\"\\n\"\n"
146
".ascii \" else\\n\"\n"
147
".ascii \" printf \\\"??? \\\"\\n\"\n"
148
".ascii \" end\\n\"\n"
149
".ascii \" if $func != 0\\n\"\n"
150
".ascii \" if $func->type == 2\\n\"\n"
151
".ascii \" printf \\\"%s:%d \\\", (char*)$func->op_array.filename->val, $ex->opline->lineno\\n\"\n"
152
".ascii \" else\\n\"\n"
153
".ascii \" printf \\\"[internal function]\\\"\\n\"\n"
154
".ascii \" end\\n\"\n"
155
".ascii \" end\\n\"\n"
156
".ascii \" set $ex = $ex->prev_execute_data\\n\"\n"
157
".ascii \" printf \\\"\\\\\\\\n\\\"\\n\"\n"
158
".ascii \" end\\n\"\n"
159
".ascii \"end\\n\"\n"
160
".ascii \"\\n\"\n"
161
".ascii \"document dump_bt\\n\"\n"
162
".ascii \" dumps the current execution stack. usage: dump_bt executor_globals.current_execute_data\\n\"\n"
163
".ascii \"end\\n\"\n"
164
".ascii \"\\n\"\n"
165
".ascii \"define printzv\\n\"\n"
166
".ascii \" set $ind = 1\\n\"\n"
167
".ascii \" ____printzv $arg0 0\\n\"\n"
168
".ascii \"end\\n\"\n"
169
".ascii \"\\n\"\n"
170
".ascii \"document printzv\\n\"\n"
171
".ascii \" prints zval contents\\n\"\n"
172
".ascii \"end\\n\"\n"
173
".ascii \"\\n\"\n"
174
".ascii \"define ____printzv_contents\\n\"\n"
175
".ascii \" set $zvalue = $arg0\\n\"\n"
176
".ascii \" set $type = $zvalue->u1.v.type\\n\"\n"
177
".ascii \"\\n\"\n"
178
".ascii \" # 15 == IS_INDIRECT\\n\"\n"
179
".ascii \" if $type > 5 && $type < 12\\n\"\n"
180
".ascii \" printf \\\"(refcount=%d) \\\", $zvalue->value.counted->gc.refcount\\n\"\n"
181
".ascii \" end\\n\"\n"
182
".ascii \"\\n\"\n"
183
".ascii \" if $type == 0\\n\"\n"
184
".ascii \" printf \\\"UNDEF\\\"\\n\"\n"
185
".ascii \" end\\n\"\n"
186
".ascii \" if $type == 1\\n\"\n"
187
".ascii \" printf \\\"NULL\\\"\\n\"\n"
188
".ascii \" end\\n\"\n"
189
".ascii \" if $type == 2\\n\"\n"
190
".ascii \" printf \\\"bool: false\\\"\\n\"\n"
191
".ascii \" end\\n\"\n"
192
".ascii \" if $type == 3\\n\"\n"
193
".ascii \" printf \\\"bool: true\\\"\\n\"\n"
194
".ascii \" end\\n\"\n"
195
".ascii \" if $type == 4\\n\"\n"
196
".ascii \" printf \\\"long: %ld\\\", $zvalue->value.lval\\n\"\n"
197
".ascii \" end\\n\"\n"
198
".ascii \" if $type == 5\\n\"\n"
199
".ascii \" printf \\\"double: %f\\\", $zvalue->value.dval\\n\"\n"
200
".ascii \" end\\n\"\n"
201
".ascii \" if $type == 6\\n\"\n"
202
".ascii \" printf \\\"string: %s\\\", (char*)$zvalue->value.str->val\\n\"\n"
203
".ascii \" end\\n\"\n"
204
".ascii \" if $type == 7\\n\"\n"
205
".ascii \" printf \\\"array: \\\"\\n\"\n"
206
".ascii \" if ! $arg1\\n\"\n"
207
".ascii \" set $ind = $ind + 1\\n\"\n"
208
".ascii \" ____print_ht $zvalue->value.arr 1\\n\"\n"
209
".ascii \" set $ind = $ind - 1\\n\"\n"
210
".ascii \" set $i = $ind\\n\"\n"
211
".ascii \" while $i > 0\\n\"\n"
212
".ascii \" printf \\\" \\\"\\n\"\n"
213
".ascii \" set $i = $i - 1\\n\"\n"
214
".ascii \" end\\n\"\n"
215
".ascii \" end\\n\"\n"
216
".ascii \" set $type = 0\\n\"\n"
217
".ascii \" end\\n\"\n"
218
".ascii \" if $type == 8\\n\"\n"
219
".ascii \" printf \\\"object\\\"\\n\"\n"
220
".ascii \" ____executor_globals\\n\"\n"
221
".ascii \" set $handle = $zvalue->value.obj.handle\\n\"\n"
222
".ascii \" set $handlers = $zvalue->value.obj.handlers\\n\"\n"
223
".ascii \" set $zobj = $zvalue->value.obj\\n\"\n"
224
".ascii \" set $cname = (char*)$zobj->ce->name->val\\n\"\n"
225
".ascii \" printf \\\"(%s) #%d\\\", $cname, $handle\\n\"\n"
226
".ascii \" if ! $arg1\\n\"\n"
227
".ascii \" if $handlers->get_properties == &zend_std_get_properties\\n\"\n"
228
".ascii \" if $zobj->properties\\n\"\n"
229
".ascii \" printf \\\"\\\\\\\\nProperties \\\"\\n\"\n"
230
".ascii \" set $ht = $zobj->properties\\n\"\n"
231
".ascii \" set $ind = $ind + 1\\n\"\n"
232
".ascii \" ____print_ht $ht 1\\n\"\n"
233
".ascii \" set $ind = $ind - 1\\n\"\n"
234
".ascii \" set $i = $ind\\n\"\n"
235
".ascii \" while $i > 0\\n\"\n"
236
".ascii \" printf \\\" \\\"\\n\"\n"
237
".ascii \" set $i = $i - 1\\n\"\n"
238
".ascii \" end\\n\"\n"
239
".ascii \" else\\n\"\n"
240
".ascii \" printf \\\" {\\\\\\\\n\\\"\\n\"\n"
241
".ascii \" set $ht = &$zobj->ce->properties_info\\n\"\n"
242
".ascii \" set $k = 0\\n\"\n"
243
".ascii \" set $num = $ht->nNumUsed\\n\"\n"
244
".ascii \" while $k < $num\\n\"\n"
245
".ascii \" set $p = (Bucket*)($ht->arData + $k)\\n\"\n"
246
".ascii \" set $name = $p->key\\n\"\n"
247
".ascii \" set $prop = (zend_property_info*)$p->val.value.ptr\\n\"\n"
248
".ascii \" set $val = (zval*)((char*)$zobj + $prop->offset)\\n\"\n"
249
".ascii \" printf \\\"%s => \\\", (char*)$name->val\\n\"\n"
250
".ascii \" printzv $val\\n\"\n"
251
".ascii \" set $k = $k + 1\\n\"\n"
252
".ascii \" end\\n\"\n"
253
".ascii \" end\\n\"\n"
254
".ascii \" end\\n\"\n"
255
".ascii \" end\\n\"\n"
256
".ascii \" set $type = 0\\n\"\n"
257
".ascii \" end\\n\"\n"
258
".ascii \" if $type == 9\\n\"\n"
259
".ascii \" printf \\\"resource: #%d\\\", $zvalue->value.res->handle\\n\"\n"
260
".ascii \" end\\n\"\n"
261
".ascii \" if $type == 10\\n\"\n"
262
".ascii \" printf \\\"reference: \\\"\\n\"\n"
263
".ascii \" ____printzv &$zvalue->value.ref->val $arg1\\n\"\n"
264
".ascii \" end\\n\"\n"
265
".ascii \" if $type == 11\\n\"\n"
266
".ascii \" printf \\\"CONSTANT_AST\\\"\\n\"\n"
267
".ascii \" end\\n\"\n"
268
".ascii \" if $type == 12\\n\"\n"
269
".ascii \" printf \\\"indirect: \\\"\\n\"\n"
270
".ascii \" ____printzv $zvalue->value.zv $arg1\\n\"\n"
271
".ascii \" end\\n\"\n"
272
".ascii \" if $type == 13\\n\"\n"
273
".ascii \" printf \\\"pointer: %p\\\", $zvalue->value.ptr\\n\"\n"
274
".ascii \" end\\n\"\n"
275
".ascii \" if $type == 15\\n\"\n"
276
".ascii \" printf \\\"_ERROR\\\"\\n\"\n"
277
".ascii \" end\\n\"\n"
278
".ascii \" if $type == 16\\n\"\n"
279
".ascii \" printf \\\"_BOOL\\\"\\n\"\n"
280
".ascii \" end\\n\"\n"
281
".ascii \" if $type == 17\\n\"\n"
282
".ascii \" printf \\\"_NUMBER\\\"\\n\"\n"
283
".ascii \" end\\n\"\n"
284
".ascii \" if $type > 17\\n\"\n"
285
".ascii \" printf \\\"unknown type %d\\\", $type\\n\"\n"
286
".ascii \" end\\n\"\n"
287
".ascii \" printf \\\"\\\\\\\\n\\\"\\n\"\n"
288
".ascii \"end\\n\"\n"
289
".ascii \"\\n\"\n"
290
".ascii \"define ____printzv\\n\"\n"
291
".ascii \" ____executor_globals\\n\"\n"
292
".ascii \" set $zvalue = $arg0\\n\"\n"
293
".ascii \"\\n\"\n"
294
".ascii \" printf \\\"[%p] \\\", $zvalue\\n\"\n"
295
".ascii \"\\n\"\n"
296
".ascii \" set $zcontents = (zval*) $zvalue\\n\"\n"
297
".ascii \" if $arg1\\n\"\n"
298
".ascii \" ____printzv_contents $zcontents $arg1\\n\"\n"
299
".ascii \" else\\n\"\n"
300
".ascii \" ____printzv_contents $zcontents 0\\n\"\n"
301
".ascii \" end\\n\"\n"
302
".ascii \"end\\n\"\n"
303
".ascii \"\\n\"\n"
304
".ascii \"define print_global_vars\\n\"\n"
305
".ascii \" ____executor_globals\\n\"\n"
306
".ascii \" set $symtable = ((HashTable *)&($eg_ptr->symbol_table))\\n\"\n"
307
".ascii \" print_ht $symtable\\n\"\n"
308
".ascii \"end\\n\"\n"
309
".ascii \"\\n\"\n"
310
".ascii \"document print_global_vars\\n\"\n"
311
".ascii \" Prints the global variables\\n\"\n"
312
".ascii \"end\\n\"\n"
313
".ascii \"\\n\"\n"
314
".ascii \"define print_const_table\\n\"\n"
315
".ascii \" set $ind = 1\\n\"\n"
316
".ascii \" printf \\\"[%p] {\\\\\\\\n\\\", $arg0\\n\"\n"
317
".ascii \" ____print_ht $arg0 4\\n\"\n"
318
".ascii \" printf \\\"}\\\\\\\\n\\\"\\n\"\n"
319
".ascii \"end\\n\"\n"
320
".ascii \"\\n\"\n"
321
".ascii \"document print_const_table\\n\"\n"
322
".ascii \" Dumps elements of Constants HashTable\\n\"\n"
323
".ascii \" Example: print_const_table executor_globals.zend_constants\\n\"\n"
324
".ascii \"end\\n\"\n"
325
".ascii \"\\n\"\n"
326
".ascii \"define ____print_ht\\n\"\n"
327
".ascii \" set $ht = (HashTable*)$arg0\\n\"\n"
328
".ascii \" set $n = $ind\\n\"\n"
329
".ascii \" while $n > 0\\n\"\n"
330
".ascii \" printf \\\" \\\"\\n\"\n"
331
".ascii \" set $n = $n - 1\\n\"\n"
332
".ascii \" end\\n\"\n"
333
".ascii \"\\n\"\n"
334
".ascii \" set $packed = $ht->u.v.flags & 4\\n\"\n"
335
".ascii \" if $packed\\n\"\n"
336
".ascii \" printf \\\"Packed\\\"\\n\"\n"
337
".ascii \" else\\n\"\n"
338
".ascii \" printf \\\"Hash\\\"\\n\"\n"
339
".ascii \" end\\n\"\n"
340
".ascii \" printf \\\"(%d)[%p]: {\\\\\\\\n\\\", $ht->nNumOfElements, $ht\\n\"\n"
341
".ascii \"\\n\"\n"
342
".ascii \" set $num = $ht->nNumUsed\\n\"\n"
343
".ascii \" set $i = 0\\n\"\n"
344
".ascii \" set $ind = $ind + 1\\n\"\n"
345
".ascii \" while $i < $num\\n\"\n"
346
".ascii \" if $packed\\n\"\n"
347
".ascii \" set $val = (zval*)($ht->arPacked + $i)\\n\"\n"
348
".ascii \" set $key = (zend_string*)0\\n\"\n"
349
".ascii \" set $h = $i\\n\"\n"
350
".ascii \" else\\n\"\n"
351
".ascii \" set $bucket = (Bucket*)($ht->arData + $i)\\n\"\n"
352
".ascii \" set $val = &$bucket->val\\n\"\n"
353
".ascii \" set $key = $bucket->key\\n\"\n"
354
".ascii \" set $h = $bucket->h\\n\"\n"
355
".ascii \" end\\n\"\n"
356
".ascii \" set $n = $ind\\n\"\n"
357
".ascii \" if $val->u1.v.type > 0\\n\"\n"
358
".ascii \" while $n > 0\\n\"\n"
359
".ascii \" printf \\\" \\\"\\n\"\n"
360
".ascii \" set $n = $n - 1\\n\"\n"
361
".ascii \" end\\n\"\n"
362
".ascii \" printf \\\"[%d] \\\", $i\\n\"\n"
363
".ascii \" if $key\\n\"\n"
364
".ascii \" ____print_str (char*)$key->val $key->len\\n\"\n"
365
".ascii \" printf \\\" => \\\"\\n\"\n"
366
".ascii \" else\\n\"\n"
367
".ascii \" printf \\\"%d => \\\", $h\\n\"\n"
368
".ascii \" end\\n\"\n"
369
".ascii \" if $arg1 == 0\\n\"\n"
370
".ascii \" printf \\\"%p\\\\\\\\n\\\", $val\\n\"\n"
371
".ascii \" end\\n\"\n"
372
".ascii \" if $arg1 == 1\\n\"\n"
373
".ascii \" set $zval = $val\\n\"\n"
374
".ascii \" ____printzv $zval 1\\n\"\n"
375
".ascii \" end\\n\"\n"
376
".ascii \" if $arg1 == 2\\n\"\n"
377
".ascii \" printf \\\"%s\\\\\\\\n\\\", (char*)$val->value.ptr\\n\"\n"
378
".ascii \" end\\n\"\n"
379
".ascii \" if $arg1 == 3\\n\"\n"
380
".ascii \" set $func = (zend_function*)$val->value.ptr\\n\"\n"
381
".ascii \" printf \\\"\\\\\\\\\\\"%s\\\\\\\\\\\"\\\\\\\\n\\\", (char*)$func->common.function_name->val\\n\"\n"
382
".ascii \" end\\n\"\n"
383
".ascii \" if $arg1 == 4\\n\"\n"
384
".ascii \" set $const = (zend_constant *)$val->value.ptr\\n\"\n"
385
".ascii \" ____printzv $const 1\\n\"\n"
386
".ascii \" end\\n\"\n"
387
".ascii \" end\\n\"\n"
388
".ascii \" set $i = $i + 1\\n\"\n"
389
".ascii \" end\\n\"\n"
390
".ascii \" set $ind = $ind - 1\\n\"\n"
391
".ascii \" printf \\\"}\\\\\\\\n\\\"\\n\"\n"
392
".ascii \"end\\n\"\n"
393
".ascii \"\\n\"\n"
394
".ascii \"define print_ht\\n\"\n"
395
".ascii \" set $ind = 0\\n\"\n"
396
".ascii \" ____print_ht $arg0 1\\n\"\n"
397
".ascii \"end\\n\"\n"
398
".ascii \"\\n\"\n"
399
".ascii \"document print_ht\\n\"\n"
400
".ascii \" dumps elements of HashTable made of zval\\n\"\n"
401
".ascii \"end\\n\"\n"
402
".ascii \"\\n\"\n"
403
".ascii \"define print_htptr\\n\"\n"
404
".ascii \" set $ind = 0\\n\"\n"
405
".ascii \" ____print_ht $arg0 0\\n\"\n"
406
".ascii \"end\\n\"\n"
407
".ascii \"\\n\"\n"
408
".ascii \"document print_htptr\\n\"\n"
409
".ascii \" dumps elements of HashTable made of pointers\\n\"\n"
410
".ascii \"end\\n\"\n"
411
".ascii \"\\n\"\n"
412
".ascii \"define print_htstr\\n\"\n"
413
".ascii \" set $ind = 0\\n\"\n"
414
".ascii \" ____print_ht $arg0 2\\n\"\n"
415
".ascii \"end\\n\"\n"
416
".ascii \"\\n\"\n"
417
".ascii \"document print_htstr\\n\"\n"
418
".ascii \" dumps elements of HashTable made of strings\\n\"\n"
419
".ascii \"end\\n\"\n"
420
".ascii \"\\n\"\n"
421
".ascii \"define print_ft\\n\"\n"
422
".ascii \" set $ind = 0\\n\"\n"
423
".ascii \" ____print_ht $arg0 3\\n\"\n"
424
".ascii \"end\\n\"\n"
425
".ascii \"\\n\"\n"
426
".ascii \"document print_ft\\n\"\n"
427
".ascii \" dumps a function table (HashTable)\\n\"\n"
428
".ascii \"end\\n\"\n"
429
".ascii \"\\n\"\n"
430
".ascii \"define ____print_inh_class\\n\"\n"
431
".ascii \" set $ce = $arg0\\n\"\n"
432
".ascii \" if $ce->ce_flags & 0x10 || $ce->ce_flags & 0x20\\n\"\n"
433
".ascii \" printf \\\"abstract \\\"\\n\"\n"
434
".ascii \" else\\n\"\n"
435
".ascii \" if $ce->ce_flags & 0x40\\n\"\n"
436
".ascii \" printf \\\"final \\\"\\n\"\n"
437
".ascii \" end\\n\"\n"
438
".ascii \" end\\n\"\n"
439
".ascii \" printf \\\"class %s\\\", (char*)$ce->name->val\\n\"\n"
440
".ascii \" if $ce->parent != 0\\n\"\n"
441
".ascii \" printf \\\" extends %s\\\", (char*)$ce->parent->name->val\\n\"\n"
442
".ascii \" end\\n\"\n"
443
".ascii \" if $ce->num_interfaces != 0\\n\"\n"
444
".ascii \" printf \\\" implements\\\"\\n\"\n"
445
".ascii \" set $tmp = 0\\n\"\n"
446
".ascii \" while $tmp < $ce->num_interfaces\\n\"\n"
447
".ascii \" printf \\\" %s\\\", (char*)$ce->interfaces[$tmp]->name->val\\n\"\n"
448
".ascii \" set $tmp = $tmp + 1\\n\"\n"
449
".ascii \" if $tmp < $ce->num_interfaces\\n\"\n"
450
".ascii \" printf \\\",\\\"\\n\"\n"
451
".ascii \" end\\n\"\n"
452
".ascii \" end\\n\"\n"
453
".ascii \" end\\n\"\n"
454
".ascii \" set $ce = $ce->parent\\n\"\n"
455
".ascii \"end\\n\"\n"
456
".ascii \"\\n\"\n"
457
".ascii \"define ____print_inh_iface\\n\"\n"
458
".ascii \" set $ce = $arg0\\n\"\n"
459
".ascii \" printf \\\"interface %s\\\", (char*)$ce->name->val\\n\"\n"
460
".ascii \" if $ce->num_interfaces != 0\\n\"\n"
461
".ascii \" set $ce = $ce->interfaces[0]\\n\"\n"
462
".ascii \" printf \\\" extends %s\\\", (char*)$ce->name->val\\n\"\n"
463
".ascii \" else\\n\"\n"
464
".ascii \" set $ce = 0\\n\"\n"
465
".ascii \" end\\n\"\n"
466
".ascii \"end\\n\"\n"
467
".ascii \"\\n\"\n"
468
".ascii \"define print_inh\\n\"\n"
469
".ascii \" set $ce = $arg0\\n\"\n"
470
".ascii \" set $depth = 0\\n\"\n"
471
".ascii \" while $ce != 0\\n\"\n"
472
".ascii \" set $tmp = $depth\\n\"\n"
473
".ascii \" while $tmp != 0\\n\"\n"
474
".ascii \" printf \\\" \\\"\\n\"\n"
475
".ascii \" set $tmp = $tmp - 1\\n\"\n"
476
".ascii \" end\\n\"\n"
477
".ascii \" set $depth = $depth + 1\\n\"\n"
478
".ascii \" if $ce->ce_flags & 0x80\\n\"\n"
479
".ascii \" ____print_inh_iface $ce\\n\"\n"
480
".ascii \" else\\n\"\n"
481
".ascii \" ____print_inh_class $ce\\n\"\n"
482
".ascii \" end\\n\"\n"
483
".ascii \" printf \\\" {\\\\\\\\n\\\"\\n\"\n"
484
".ascii \" end\\n\"\n"
485
".ascii \" while $depth != 0\\n\"\n"
486
".ascii \" set $tmp = $depth\\n\"\n"
487
".ascii \" while $tmp != 1\\n\"\n"
488
".ascii \" printf \\\" \\\"\\n\"\n"
489
".ascii \" set $tmp = $tmp - 1\\n\"\n"
490
".ascii \" end\\n\"\n"
491
".ascii \" printf \\\"}\\\\\\\\n\\\"\\n\"\n"
492
".ascii \" set $depth = $depth - 1\\n\"\n"
493
".ascii \" end\\n\"\n"
494
".ascii \"end\\n\"\n"
495
".ascii \"\\n\"\n"
496
".ascii \"define print_pi\\n\"\n"
497
".ascii \" set $pi = (zend_property_info *)$arg0\\n\"\n"
498
".ascii \" set $initial_offset = ((uint32_t)(uintptr_t)(&((zend_object*)0)->properties_table[(0)]))\\n\"\n"
499
".ascii \" set $ptr_to_val = (zval*)((char*)$pi->ce->default_properties_table + $pi->offset - $initial_offset)\\n\"\n"
500
".ascii \" printf \\\"[%p] {\\\\\\\\n\\\", $pi\\n\"\n"
501
".ascii \" printf \\\" offset = %p\\\\\\\\n\\\", $pi->offset\\n\"\n"
502
".ascii \" printf \\\" ce = [%p] %s\\\\\\\\n\\\", $pi->ce, (char*)$pi->ce->name->val\\n\"\n"
503
".ascii \" printf \\\" flags = 0x%x (\\\", $pi->flags\\n\"\n"
504
".ascii \" if $pi->flags & 0x100\\n\"\n"
505
".ascii \" printf \\\"ZEND_ACC_PUBLIC\\\"\\n\"\n"
506
".ascii \" else\\n\"\n"
507
".ascii \" if $pi->flags & 0x200\\n\"\n"
508
".ascii \" printf \\\"ZEND_ACC_PROTECTED\\\"\\n\"\n"
509
".ascii \" else\\n\"\n"
510
".ascii \" if $pi->flags & 0x400\\n\"\n"
511
".ascii \" printf \\\"ZEND_ACC_PRIVATE\\\"\\n\"\n"
512
".ascii \" else\\n\"\n"
513
".ascii \" if $pi->flags & 0x800\\n\"\n"
514
".ascii \" printf \\\"ZEND_ACC_EARLY_BINDING\\\"\\n\"\n"
515
".ascii \" else\\n\"\n"
516
".ascii \" if $pi->flags & 0x20000\\n\"\n"
517
".ascii \" printf \\\"ZEND_ACC_SHADOW\\\"\\n\"\n"
518
".ascii \" end\\n\"\n"
519
".ascii \" end\\n\"\n"
520
".ascii \" end\\n\"\n"
521
".ascii \" end\\n\"\n"
522
".ascii \" end\\n\"\n"
523
".ascii \" printf \\\")\\\\\\\\n\\\"\\n\"\n"
524
".ascii \" printf \\\" name = \\\"\\n\"\n"
525
".ascii \" print_zstr $pi->name\\n\"\n"
526
".ascii \" printf \\\" default value: \\\"\\n\"\n"
527
".ascii \" printzv $ptr_to_val\\n\"\n"
528
".ascii \" printf \\\"}\\\\\\\\n\\\"\\n\"\n"
529
".ascii \"end\\n\"\n"
530
".ascii \"\\n\"\n"
531
".ascii \"document print_pi\\n\"\n"
532
".ascii \" Takes a pointer to an object\\\\'s property and prints the property information\\n\"\n"
533
".ascii \" usage: print_pi <ptr>\\n\"\n"
534
".ascii \"end\\n\"\n"
535
".ascii \"\\n\"\n"
536
".ascii \"define ____print_str\\n\"\n"
537
".ascii \" set $tmp = 0\\n\"\n"
538
".ascii \" set $str = $arg0\\n\"\n"
539
".ascii \" if $argc > 2\\n\"\n"
540
".ascii \" set $maxlen = $arg2\\n\"\n"
541
".ascii \" else\\n\"\n"
542
".ascii \" set $maxlen = 256\\n\"\n"
543
".ascii \" end\\n\"\n"
544
".ascii \"\\n\"\n"
545
".ascii \" printf \\\"\\\\\\\\\\\"\\\"\\n\"\n"
546
".ascii \" while $tmp < $arg1 && $tmp < $maxlen\\n\"\n"
547
".ascii \" if $str[$tmp] > 31 && $str[$tmp] < 127\\n\"\n"
548
".ascii \" printf \\\"%c\\\", $str[$tmp]\\n\"\n"
549
".ascii \" else\\n\"\n"
550
".ascii \" printf \\\"\\\\\\\\\\\\\\\\%o\\\", $str[$tmp]\\n\"\n"
551
".ascii \" end\\n\"\n"
552
".ascii \" set $tmp = $tmp + 1\\n\"\n"
553
".ascii \" end\\n\"\n"
554
".ascii \" if $tmp != $arg1\\n\"\n"
555
".ascii \" printf \\\"...\\\"\\n\"\n"
556
".ascii \" end\\n\"\n"
557
".ascii \" printf \\\"\\\\\\\\\\\"\\\"\\n\"\n"
558
".ascii \"end\\n\"\n"
559
".ascii \"\\n\"\n"
560
".ascii \"define printzn\\n\"\n"
561
".ascii \" ____executor_globals\\n\"\n"
562
".ascii \" set $ind = 0\\n\"\n"
563
".ascii \" set $znode = $arg0\\n\"\n"
564
".ascii \" if $znode->op_type == 1\\n\"\n"
565
".ascii \" set $optype = \\\"IS_CONST\\\"\\n\"\n"
566
".ascii \" end\\n\"\n"
567
".ascii \" if $znode->op_type == 2\\n\"\n"
568
".ascii \" set $optype = \\\"IS_TMP_VAR\\\"\\n\"\n"
569
".ascii \" end\\n\"\n"
570
".ascii \" if $znode->op_type == 4\\n\"\n"
571
".ascii \" set $optype = \\\"IS_VAR\\\"\\n\"\n"
572
".ascii \" end\\n\"\n"
573
".ascii \" if $znode->op_type == 8\\n\"\n"
574
".ascii \" set $optype = \\\"IS_UNUSED\\\"\\n\"\n"
575
".ascii \" end\\n\"\n"
576
".ascii \"\\n\"\n"
577
".ascii \" printf \\\"[%p] %s\\\", $znode, $optype\\n\"\n"
578
".ascii \"\\n\"\n"
579
".ascii \" if $znode->op_type == 1\\n\"\n"
580
".ascii \" printf \\\": \\\"\\n\"\n"
581
".ascii \" ____printzv &$znode->u.constant 0\\n\"\n"
582
".ascii \" end\\n\"\n"
583
".ascii \" if $znode->op_type == 2\\n\"\n"
584
".ascii \" printf \\\": \\\"\\n\"\n"
585
".ascii \" set $tvar = (union _temp_variable *)((char *)$eg.current_execute_data->Ts + $znode->u.var)\\n\"\n"
586
".ascii \" ____printzv ((union _temp_variable *)$tvar)->tmp_var 0\\n\"\n"
587
".ascii \" end\\n\"\n"
588
".ascii \" if $znode->op_type == 4\\n\"\n"
589
".ascii \" printf \\\": \\\"\\n\"\n"
590
".ascii \" set $tvar = (union _temp_variable *)((char *)$eg.current_execute_data->Ts + $znode->u.var)\\n\"\n"
591
".ascii \" ____printzv *$tvar->var.ptr_ptr 0\\n\"\n"
592
".ascii \" end\\n\"\n"
593
".ascii \" if $znode->op_type == 8\\n\"\n"
594
".ascii \" printf \\\"\\\\\\\\n\\\"\\n\"\n"
595
".ascii \" end\\n\"\n"
596
".ascii \"end\\n\"\n"
597
".ascii \"\\n\"\n"
598
".ascii \"document printzn\\n\"\n"
599
".ascii \" print type and content of znode.\\n\"\n"
600
".ascii \" usage: printzn &opline->op1\\n\"\n"
601
".ascii \"end\\n\"\n"
602
".ascii \"\\n\"\n"
603
".ascii \"define printzops\\n\"\n"
604
".ascii \" printf \\\"op1 => \\\"\\n\"\n"
605
".ascii \" printzn &execute_data->opline.op1\\n\"\n"
606
".ascii \" printf \\\"op2 => \\\"\\n\"\n"
607
".ascii \" printzn &execute_data->opline.op2\\n\"\n"
608
".ascii \" printf \\\"result => \\\"\\n\"\n"
609
".ascii \" printzn &execute_data->opline.result\\n\"\n"
610
".ascii \"end\\n\"\n"
611
".ascii \"\\n\"\n"
612
".ascii \"document printzops\\n\"\n"
613
".ascii \" dump operands of the current opline\\n\"\n"
614
".ascii \"end\\n\"\n"
615
".ascii \"\\n\"\n"
616
".ascii \"define print_zstr\\n\"\n"
617
".ascii \" set $zstr = (zend_string *)$arg0\\n\"\n"
618
".ascii \" if $argc == 2\\n\"\n"
619
".ascii \" set $maxlen = $arg1\\n\"\n"
620
".ascii \" else\\n\"\n"
621
".ascii \" set $maxlen = $zstr->len\\n\"\n"
622
".ascii \" end\\n\"\n"
623
".ascii \" printf \\\"string(%d) \\\", $zstr->len\\n\"\n"
624
".ascii \" ____print_str (char*)$zstr->val $zstr->len $maxlen\\n\"\n"
625
".ascii \" printf \\\"\\\\\\\\n\\\"\\n\"\n"
626
".ascii \"end\\n\"\n"
627
".ascii \"\\n\"\n"
628
".ascii \"document print_zstr\\n\"\n"
629
".ascii \" print the length and contents of a zend string\\n\"\n"
630
".ascii \" usage: print_zstr <ptr> [max length]\\n\"\n"
631
".ascii \"end\\n\"\n"
632
".ascii \"\\n\"\n"
633
".ascii \"define zbacktrace\\n\"\n"
634
".ascii \" ____executor_globals\\n\"\n"
635
".ascii \" dump_bt $eg.current_execute_data\\n\"\n"
636
".ascii \"end\\n\"\n"
637
".ascii \"\\n\"\n"
638
".ascii \"document zbacktrace\\n\"\n"
639
".ascii \" prints backtrace.\\n\"\n"
640
".ascii \" This command is almost a short cut for\\n\"\n"
641
".ascii \" > (gdb) ____executor_globals\\n\"\n"
642
".ascii \" > (gdb) dump_bt $eg.current_execute_data\\n\"\n"
643
".ascii \"end\\n\"\n"
644
".ascii \"\\n\"\n"
645
".ascii \"define lookup_root\\n\"\n"
646
".ascii \" set $found = 0\\n\"\n"
647
".ascii \" if gc_globals->roots\\n\"\n"
648
".ascii \" set $current = gc_globals->roots->next\\n\"\n"
649
".ascii \" printf \\\"looking ref %p in roots\\\\\\\\n\\\", $arg0\\n\"\n"
650
".ascii \" while $current != &gc_globals->roots\\n\"\n"
651
".ascii \" if $current->ref == $arg0\\n\"\n"
652
".ascii \" set $found = $current\\n\"\n"
653
".ascii \" break\\n\"\n"
654
".ascii \" end\\n\"\n"
655
".ascii \" set $current = $current->next\\n\"\n"
656
".ascii \" end\\n\"\n"
657
".ascii \" if $found != 0\\n\"\n"
658
".ascii \" printf \\\"found root %p\\\\\\\\n\\\", $found\\n\"\n"
659
".ascii \" else\\n\"\n"
660
".ascii \" printf \\\"not found\\\\\\\\n\\\"\\n\"\n"
661
".ascii \" end\\n\"\n"
662
".ascii \" end\\n\"\n"
663
".ascii \"end\\n\"\n"
664
".ascii \"\\n\"\n"
665
".ascii \"document lookup_root\\n\"\n"
666
".ascii \" lookup a refcounted in root\\n\"\n"
667
".ascii \" usage: lookup_root [ptr].\\n\"\n"
668
".ascii \"end\\n\"\n"
669
".ascii \"\\n\"\n"
670
".ascii \"''')\\n\"\n"
671
".ascii \"\\n\"\n"
672
".ascii \"\\\"\\\"\\\"GDB support for PHP types\\n\"\n"
673
".ascii \"\\n\"\n"
674
".ascii \"This is auto-loaded by GDB if Python Auto-loading is enabled (the default), and\\n\"\n"
675
".ascii \"the PHP binary is in the auto load safe path:\\n\"\n"
676
".ascii \"\\n\"\n"
677
".ascii \" # ~/.config/gdb/gdbinit (not ~/.gdbinit)\\n\"\n"
678
".ascii \" add-auto-load-safe-path /path/to/php-src\\n\"\n"
679
".ascii \"\\n\"\n"
680
".ascii \"See https://sourceware.org/gdb/current/onlinedocs/gdb.html/Python-Auto_002dloading.html\\n\"\n"
681
".ascii \"See https://sourceware.org/gdb/current/onlinedocs/gdb.html/Auto_002dloading-safe-path.html#Auto_002dloading-safe-path\\n\"\n"
682
".ascii \"\\n\"\n"
683
".ascii \"If needed, pretty printers can be by-passed by using the /r flag:\\n\"\n"
684
".ascii \" (gdb) p /r any_variable\\n\"\n"
685
".ascii \"\\n\"\n"
686
".ascii \"Use |set print pretty| to enable multi-line printing and indentation:\\n\"\n"
687
".ascii \" (gdb) set print pretty on\\n\"\n"
688
".ascii \"\\n\"\n"
689
".ascii \"Use |set print max-depth| to control the maximum print depth for nested\\n\"\n"
690
".ascii \"structures:\\n\"\n"
691
".ascii \" (gdb) set print pretty on\\n\"\n"
692
".ascii \"\\n\"\n"
693
".ascii \"To interactively type Python for development of the printers, use\\n\"\n"
694
".ascii \" (gdb) python foo = gdb.parse_and_eval('bar')\\n\"\n"
695
".ascii \"to put the C value 'bar' in the current scope into a Python variable 'foo'.\\n\"\n"
696
".ascii \"Then you can interact with that variable:\\n\"\n"
697
".ascii \" (gdb) python print foo['impl_']\\n\"\n"
698
".ascii \"\\\"\\\"\\\"\\n\"\n"
699
".ascii \"\\n\"\n"
700
".ascii \"import gdb\\n\"\n"
701
".ascii \"import gdb.printing\\n\"\n"
702
".ascii \"import re\\n\"\n"
703
".ascii \"\\n\"\n"
704
".ascii \"pp_set = gdb.printing.RegexpCollectionPrettyPrinter(\\\"php\\\")\\n\"\n"
705
".ascii \"\\n\"\n"
706
".ascii \"class ZendStringPrettyPrinter(gdb.printing.PrettyPrinter):\\n\"\n"
707
".ascii \" \\\"Print a zend_string\\\"\\n\"\n"
708
".ascii \"\\n\"\n"
709
".ascii \" def __init__(self, val):\\n\"\n"
710
".ascii \" self.val = val\\n\"\n"
711
".ascii \"\\n\"\n"
712
".ascii \" def to_string(self):\\n\"\n"
713
".ascii \" return self.format_string()\\n\"\n"
714
".ascii \"\\n\"\n"
715
".ascii \" def children(self):\\n\"\n"
716
".ascii \" for field in self.val.type.fields():\\n\"\n"
717
".ascii \" if field.name == 'val':\\n\"\n"
718
".ascii \" yield ('val', self.format_string())\\n\"\n"
719
".ascii \" else:\\n\"\n"
720
".ascii \" yield (field.name, self.val[field.name])\\n\"\n"
721
".ascii \"\\n\"\n"
722
".ascii \" def format_string(self):\\n\"\n"
723
".ascii \" len = int(self.val['len'])\\n\"\n"
724
".ascii \" truncated = False\\n\"\n"
725
".ascii \" if len > 50:\\n\"\n"
726
".ascii \" len = 50\\n\"\n"
727
".ascii \" truncated = True\\n\"\n"
728
".ascii \"\\n\"\n"
729
".ascii \" ptr_type = gdb.lookup_type('char').pointer()\\n\"\n"
730
".ascii \" ary_type = gdb.lookup_type('char').array(len)\\n\"\n"
731
".ascii \" str = self.val['val'].cast(ptr_type).dereference().cast(ary_type)\\n\"\n"
732
".ascii \" str = str.format_string()\\n\"\n"
733
".ascii \" if truncated:\\n\"\n"
734
".ascii \" str += ' (%d bytes total)' % int(self.val['len'])\\n\"\n"
735
".ascii \"\\n\"\n"
736
".ascii \" return str\\n\"\n"
737
".ascii \"\\n\"\n"
738
".ascii \"\\n\"\n"
739
".ascii \"pp_set.add_printer('zend_string', '^_zend_string$', ZendStringPrettyPrinter)\\n\"\n"
740
".ascii \"\\n\"\n"
741
".ascii \"class ZendTypePrettyPrinter(gdb.printing.PrettyPrinter):\\n\"\n"
742
".ascii \" \\\"Print a zend_type\\\"\\n\"\n"
743
".ascii \"\\n\"\n"
744
".ascii \" def __init__(self, val):\\n\"\n"
745
".ascii \" self.val = val\\n\"\n"
746
".ascii \" load_type_bits()\\n\"\n"
747
".ascii \"\\n\"\n"
748
".ascii \" def to_string(self):\\n\"\n"
749
".ascii \" return self.format_type(self.val)\\n\"\n"
750
".ascii \"\\n\"\n"
751
".ascii \" def children(self):\\n\"\n"
752
".ascii \" for field in self.val.type.fields():\\n\"\n"
753
".ascii \" yield (field.name, self.val[field.name])\\n\"\n"
754
".ascii \"\\n\"\n"
755
".ascii \" def format_type(self, t):\\n\"\n"
756
".ascii \" type_mask = int(t['type_mask'])\\n\"\n"
757
".ascii \" type_mask_size = t['type_mask'].type.sizeof * 8\\n\"\n"
758
".ascii \" separator = '|'\\n\"\n"
759
".ascii \" parts = []\\n\"\n"
760
".ascii \" meta = []\\n\"\n"
761
".ascii \" for bit in range(0, type_mask_size):\\n\"\n"
762
".ascii \" if type_mask & (1 << bit):\\n\"\n"
763
".ascii \" type_name = type_bit_to_name.get(bit)\\n\"\n"
764
".ascii \" match type_name:\\n\"\n"
765
".ascii \" case None:\\n\"\n"
766
".ascii \" parts.append('(1<<%d)' % bit)\\n\"\n"
767
".ascii \" case 'list':\\n\"\n"
768
".ascii \" list = t['ptr'].cast(gdb.lookup_type('zend_type_list').pointer())\\n\"\n"
769
".ascii \" num_types = int(list['num_types'])\\n\"\n"
770
".ascii \" types = list['types'].dereference().cast(gdb.lookup_type('zend_type').array(num_types))\\n\"\n"
771
".ascii \" for i in range(0, num_types):\\n\"\n"
772
".ascii \" str = self.format_type(types[i])\\n\"\n"
773
".ascii \" if any((c in set('|&()')) for c in str):\\n\"\n"
774
".ascii \" str = '(%s)' % str\\n\"\n"
775
".ascii \" parts.append(str)\\n\"\n"
776
".ascii \" case 'union' | 'arena':\\n\"\n"
777
".ascii \" meta.append(type_name)\\n\"\n"
778
".ascii \" case 'intersection':\\n\"\n"
779
".ascii \" meta.append(type_name)\\n\"\n"
780
".ascii \" separator = '&'\\n\"\n"
781
".ascii \" case 'name':\\n\"\n"
782
".ascii \" str = t['ptr'].cast(gdb.lookup_type('zend_string').pointer())\\n\"\n"
783
".ascii \" parts.append(ZendStringPrettyPrinter(str).to_string())\\n\"\n"
784
".ascii \" case _:\\n\"\n"
785
".ascii \" parts.append(type_name)\\n\"\n"
786
".ascii \"\\n\"\n"
787
".ascii \" str = separator.join(parts)\\n\"\n"
788
".ascii \"\\n\"\n"
789
".ascii \" if len(meta) > 0:\\n\"\n"
790
".ascii \" str = '[%s] %s' % (','.join(meta), str)\\n\"\n"
791
".ascii \"\\n\"\n"
792
".ascii \" return str\\n\"\n"
793
".ascii \"\\n\"\n"
794
".ascii \"\\n\"\n"
795
".ascii \"pp_set.add_printer('zend_type', '^zend_type$', ZendTypePrettyPrinter)\\n\"\n"
796
".ascii \"\\n\"\n"
797
".ascii \"class ZendAstKindPrettyPrinter(gdb.printing.PrettyPrinter):\\n\"\n"
798
".ascii \" \\\"Print a zend_ast_kind\\\"\\n\"\n"
799
".ascii \"\\n\"\n"
800
".ascii \" def __init__(self, val):\\n\"\n"
801
".ascii \" self.val = val\\n\"\n"
802
".ascii \"\\n\"\n"
803
".ascii \" def to_string(self):\\n\"\n"
804
".ascii \" return self.val.cast(gdb.lookup_type('enum _zend_ast_kind'))\\n\"\n"
805
".ascii \"\\n\"\n"
806
".ascii \"\\n\"\n"
807
".ascii \"pp_set.add_printer('zend_ast_kind', '^zend_ast_kind$', ZendAstKindPrettyPrinter)\\n\"\n"
808
".ascii \"\\n\"\n"
809
".ascii \"class ZendAstPrettyPrinter(gdb.printing.PrettyPrinter):\\n\"\n"
810
".ascii \" \\\"Print a zend_ast\\\"\\n\"\n"
811
".ascii \"\\n\"\n"
812
".ascii \" def __init__(self, val):\\n\"\n"
813
".ascii \" self.val = val\\n\"\n"
814
".ascii \"\\n\"\n"
815
".ascii \" def to_string(self):\\n\"\n"
816
".ascii \" return '((%s*)0x%x)' % (str(self.cast().type), self.val.address)\\n\"\n"
817
".ascii \"\\n\"\n"
818
".ascii \" def children(self):\\n\"\n"
819
".ascii \" val = self.cast()\\n\"\n"
820
".ascii \" for field in val.type.fields():\\n\"\n"
821
".ascii \" if field.name == 'child':\\n\"\n"
822
".ascii \" children = val[field.name]\\n\"\n"
823
".ascii \" num_children = self.num_children()\\n\"\n"
824
".ascii \"\\n\"\n"
825
".ascii \" ptr_type = gdb.lookup_type('zend_ast').pointer().pointer()\\n\"\n"
826
".ascii \" children = children.cast(ptr_type)\\n\"\n"
827
".ascii \"\\n\"\n"
828
".ascii \" for i in range(0, num_children):\\n\"\n"
829
".ascii \" c = children[i]\\n\"\n"
830
".ascii \" if int(c) != 0:\\n\"\n"
831
".ascii \" c = c.dereference()\\n\"\n"
832
".ascii \" yield ('child[%d]' % i, c)\\n\"\n"
833
".ascii \" elif field.name == 'name':\\n\"\n"
834
".ascii \" yield (field.name, ZendStringPrettyPrinter(val[field.name].dereference()).to_string())\\n\"\n"
835
".ascii \" elif field.name == 'val':\\n\"\n"
836
".ascii \" yield (field.name, ZvalPrettyPrinter(val[field.name]).to_string())\\n\"\n"
837
".ascii \" else:\\n\"\n"
838
".ascii \" yield (field.name, val[field.name])\\n\"\n"
839
".ascii \"\\n\"\n"
840
".ascii \" def is_special(self):\\n\"\n"
841
".ascii \" special_shift = 6 # ZEND_AST_SPECIAL_SHIFT\\n\"\n"
842
".ascii \" kind = self.val['kind']\\n\"\n"
843
".ascii \" return (kind >> special_shift) & 1\\n\"\n"
844
".ascii \"\\n\"\n"
845
".ascii \" def is_decl(self):\\n\"\n"
846
".ascii \" return self.is_special() and int(self.val['kind']) >= enum_value('ZEND_AST_FUNC_DECL')\\n\"\n"
847
".ascii \"\\n\"\n"
848
".ascii \" def is_list(self):\\n\"\n"
849
".ascii \" list_shift = 7 # ZEND_AST_IS_LIST_SHIFT\\n\"\n"
850
".ascii \" kind = self.val['kind']\\n\"\n"
851
".ascii \" return (kind >> list_shift) & 1\\n\"\n"
852
".ascii \"\\n\"\n"
853
".ascii \" def cast(self):\\n\"\n"
854
".ascii \" kind = int(self.val['kind'])\\n\"\n"
855
".ascii \"\\n\"\n"
856
".ascii \" if kind == enum_value('ZEND_AST_ZVAL') or kind == enum_value('ZEND_AST_CONSTANT'):\\n\"\n"
857
".ascii \" return self.val.cast(gdb.lookup_type('zend_ast_zval'))\\n\"\n"
858
".ascii \" if kind == enum_value('ZEND_AST_ZNODE'):\\n\"\n"
859
".ascii \" return self.val.cast(gdb.lookup_type('zend_ast_znode'))\\n\"\n"
860
".ascii \" if self.is_decl():\\n\"\n"
861
".ascii \" return self.val.cast(gdb.lookup_type('zend_ast_decl'))\\n\"\n"
862
".ascii \" if self.is_list():\\n\"\n"
863
".ascii \" return self.val.cast(gdb.lookup_type('zend_ast_list'))\\n\"\n"
864
".ascii \"\\n\"\n"
865
".ascii \" return self.val\\n\"\n"
866
".ascii \"\\n\"\n"
867
".ascii \" def num_children(self):\\n\"\n"
868
".ascii \" if self.is_decl():\\n\"\n"
869
".ascii \" decl_type = gdb.lookup_type('zend_ast_decl')\\n\"\n"
870
".ascii \" child_type = decl_type['child'].type\\n\"\n"
871
".ascii \" return array_size(child_type)\\n\"\n"
872
".ascii \" if self.is_special():\\n\"\n"
873
".ascii \" return 0\\n\"\n"
874
".ascii \" elif self.is_list():\\n\"\n"
875
".ascii \" return int(self.cast()['children'])\\n\"\n"
876
".ascii \" else:\\n\"\n"
877
".ascii \" num_children_shift = 8 # ZEND_AST_NUM_CHILDREN_SHIFT\\n\"\n"
878
".ascii \" kind = self.val['kind']\\n\"\n"
879
".ascii \" return kind >> num_children_shift\\n\"\n"
880
".ascii \"\\n\"\n"
881
".ascii \"\\n\"\n"
882
".ascii \"pp_set.add_printer('zend_ast', '^_zend_ast$', ZendAstPrettyPrinter)\\n\"\n"
883
".ascii \"\\n\"\n"
884
".ascii \"class ZvalPrettyPrinter(gdb.printing.PrettyPrinter):\\n\"\n"
885
".ascii \" \\\"Print a zval\\\"\\n\"\n"
886
".ascii \"\\n\"\n"
887
".ascii \" def __init__(self, val):\\n\"\n"
888
".ascii \" self.val = val\\n\"\n"
889
".ascii \" load_type_bits()\\n\"\n"
890
".ascii \"\\n\"\n"
891
".ascii \" def to_string(self):\\n\"\n"
892
".ascii \" return self.value_to_string()\\n\"\n"
893
".ascii \"\\n\"\n"
894
".ascii \" def value_to_string(self):\\n\"\n"
895
".ascii \" t = int(self.val['u1']['v']['type'])\\n\"\n"
896
".ascii \" if t == type_name_to_bit['undef']:\\n\"\n"
897
".ascii \" return 'undef'\\n\"\n"
898
".ascii \" elif t == type_name_to_bit['null']:\\n\"\n"
899
".ascii \" return 'null'\\n\"\n"
900
".ascii \" elif t == type_name_to_bit['false']:\\n\"\n"
901
".ascii \" return 'false'\\n\"\n"
902
".ascii \" elif t == type_name_to_bit['true']:\\n\"\n"
903
".ascii \" return 'true'\\n\"\n"
904
".ascii \" elif t == type_name_to_bit['long']:\\n\"\n"
905
".ascii \" return str(self.val['value']['lval'])\\n\"\n"
906
".ascii \" elif t == type_name_to_bit['double']:\\n\"\n"
907
".ascii \" return str(self.val['value']['dval'])\\n\"\n"
908
".ascii \" elif t == type_name_to_bit['string']:\\n\"\n"
909
".ascii \" return ZendStringPrettyPrinter(self.val['value']['str'].dereference()).to_string()\\n\"\n"
910
".ascii \" elif t == type_name_to_bit['array']:\\n\"\n"
911
".ascii \" return 'array'\\n\"\n"
912
".ascii \" elif t == type_name_to_bit['object']:\\n\"\n"
913
".ascii \" return 'object(%s)' % ZendStringPrettyPrinter(self.val['value']['obj']['ce']['name'].dereference()).to_string()\\n\"\n"
914
".ascii \" elif t == type_name_to_bit['resource']:\\n\"\n"
915
".ascii \" return 'resource'\\n\"\n"
916
".ascii \" elif t == type_name_to_bit['reference']:\\n\"\n"
917
".ascii \" return 'reference'\\n\"\n"
918
".ascii \" elif t == type_name_to_bit['constant_ast']:\\n\"\n"
919
".ascii \" return 'constant_ast'\\n\"\n"
920
".ascii \" else:\\n\"\n"
921
".ascii \" return 'zval of type %d' % int(self.val['u1']['v']['type'])\\n\"\n"
922
".ascii \"\\n\"\n"
923
".ascii \" def children(self):\\n\"\n"
924
".ascii \" for field in self.val.type.fields():\\n\"\n"
925
".ascii \" if field.name == 'value':\\n\"\n"
926
".ascii \" value = self.val['value']\\n\"\n"
927
".ascii \" t = int(self.val['u1']['v']['type'])\\n\"\n"
928
".ascii \" if t == type_name_to_bit['undef']:\\n\"\n"
929
".ascii \" value = value['lval']\\n\"\n"
930
".ascii \" elif t == type_name_to_bit['null']:\\n\"\n"
931
".ascii \" value = value['lval']\\n\"\n"
932
".ascii \" elif t == type_name_to_bit['false']:\\n\"\n"
933
".ascii \" value = value['lval']\\n\"\n"
934
".ascii \" elif t == type_name_to_bit['true']:\\n\"\n"
935
".ascii \" value = value['lval']\\n\"\n"
936
".ascii \" elif t == type_name_to_bit['long']:\\n\"\n"
937
".ascii \" value = value['lval']\\n\"\n"
938
".ascii \" elif t == type_name_to_bit['double']:\\n\"\n"
939
".ascii \" value = value['dval']\\n\"\n"
940
".ascii \" elif t == type_name_to_bit['string']:\\n\"\n"
941
".ascii \" value = value['str'].dereference()\\n\"\n"
942
".ascii \" elif t == type_name_to_bit['array']:\\n\"\n"
943
".ascii \" value = value['ht'].dereference()\\n\"\n"
944
".ascii \" elif t == type_name_to_bit['object']:\\n\"\n"
945
".ascii \" value = value['obj'].dereference()\\n\"\n"
946
".ascii \" elif t == type_name_to_bit['resource']:\\n\"\n"
947
".ascii \" value = value['res'].dereference()\\n\"\n"
948
".ascii \" elif t == type_name_to_bit['reference']:\\n\"\n"
949
".ascii \" value = value['ref'].dereference()\\n\"\n"
950
".ascii \" elif t == type_name_to_bit['constant_ast']:\\n\"\n"
951
".ascii \" value = value['ast'].dereference()\\n\"\n"
952
".ascii \" else:\\n\"\n"
953
".ascii \" value = value['ptr']\\n\"\n"
954
".ascii \" yield (field.name, value)\\n\"\n"
955
".ascii \" elif field.name == 'u2':\\n\"\n"
956
".ascii \" yield ('u2', self.val[field.name]['extra'])\\n\"\n"
957
".ascii \" else:\\n\"\n"
958
".ascii \" yield (field.name, self.val[field.name])\\n\"\n"
959
".ascii \"\\n\"\n"
960
".ascii \"\\n\"\n"
961
".ascii \"pp_set.add_printer('zval', '^_zval_struct$', ZvalPrettyPrinter)\\n\"\n"
962
".ascii \"\\n\"\n"
963
".ascii \"type_bit_to_name = None\\n\"\n"
964
".ascii \"type_name_to_bit = None\\n\"\n"
965
".ascii \"\\n\"\n"
966
".ascii \"def load_type_bits():\\n\"\n"
967
".ascii \" global type_bit_to_name\\n\"\n"
968
".ascii \" global type_name_to_bit\\n\"\n"
969
".ascii \"\\n\"\n"
970
".ascii \" if type_bit_to_name != None:\\n\"\n"
971
".ascii \" return\\n\"\n"
972
".ascii \"\\n\"\n"
973
".ascii \" (symbol,_) = gdb.lookup_symbol(\\\"zend_gc_refcount\\\")\\n\"\n"
974
".ascii \" if symbol == None:\\n\"\n"
975
".ascii \" raise Exception(\\\"Could not find zend_types.h: symbol zend_gc_refcount not found\\\")\\n\"\n"
976
".ascii \" filename = symbol.symtab.fullname()\\n\"\n"
977
".ascii \"\\n\"\n"
978
".ascii \" bits = {}\\n\"\n"
979
".ascii \"\\n\"\n"
980
".ascii \" with open(filename, 'r') as file:\\n\"\n"
981
".ascii \" content = file.read()\\n\"\n"
982
".ascii \"\\n\"\n"
983
".ascii \" pattern = re.compile(r'#define _ZEND_TYPE_([^\\\\s]+)_BIT\\\\s+\\\\(1u << (\\\\d+)\\\\)')\\n\"\n"
984
".ascii \" matches = pattern.findall(content)\\n\"\n"
985
".ascii \" for name, bit in matches:\\n\"\n"
986
".ascii \" bits[int(bit)] = name.lower()\\n\"\n"
987
".ascii \"\\n\"\n"
988
".ascii \" pattern = re.compile(r'#define IS_([^\\\\s]+)\\\\s+(\\\\d+)')\\n\"\n"
989
".ascii \" matches = pattern.findall(content)\\n\"\n"
990
".ascii \" for name, bit in matches:\\n\"\n"
991
".ascii \" if not int(bit) in bits:\\n\"\n"
992
".ascii \" bits[int(bit)] = name.lower()\\n\"\n"
993
".ascii \"\\n\"\n"
994
".ascii \" types = {}\\n\"\n"
995
".ascii \" for bit in bits:\\n\"\n"
996
".ascii \" types[bits[bit]] = bit\\n\"\n"
997
".ascii \"\\n\"\n"
998
".ascii \" type_bit_to_name = bits\\n\"\n"
999
".ascii \" type_name_to_bit = types\\n\"\n"
1000
".ascii \"\\n\"\n"
1001
".ascii \"def lookup_symbol(name):\\n\"\n"
1002
".ascii \" (symbol, _) = gdb.lookup_symbol(name)\\n\"\n"
1003
".ascii \" if symbol == None:\\n\"\n"
1004
".ascii \" raise Exception(\\\"Could not lookup symbol %s\\\" % name)\\n\"\n"
1005
".ascii \" return symbol\\n\"\n"
1006
".ascii \"\\n\"\n"
1007
".ascii \"def enum_value(name):\\n\"\n"
1008
".ascii \" symbol = lookup_symbol(name)\\n\"\n"
1009
".ascii \" return int(symbol.value())\\n\"\n"
1010
".ascii \"\\n\"\n"
1011
".ascii \"def array_size(ary_type):\\n\"\n"
1012
".ascii \" # array types have a single field whose type represents its range\\n\"\n"
1013
".ascii \" return ary_type.fields()[0].type.range()[1]+1\\n\"\n"
1014
".ascii \"\\n\"\n"
1015
".ascii \"gdb.printing.register_pretty_printer(gdb, pp_set, replace=True)\\n\"\n"
1016
".ascii \"\\n\"\n"
1017
".byte 0\n"
1018
".popsection\n"
1019
);
main
debug_gdb_scripts.c
Generated on Sat Aug 23 2025 01:46:12 for php-internal-docs by
1.13.2