From 265cd543f4c0afa6a436f8a1474d1b7217622573 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20D=C3=BCsterhus?= Date: Thu, 13 Feb 2025 14:32:52 +0100 Subject: [PATCH 1/3] php_gdb: Fix missing casts in `ZendAstPrettyPrinter` Fixes php/php-src#17782 --- main/debug_gdb_scripts.c | 4 ++-- scripts/gdb/php_gdb.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/main/debug_gdb_scripts.c b/main/debug_gdb_scripts.c index eef618bd03301..5eb2943d658df 100644 --- a/main/debug_gdb_scripts.c +++ b/main/debug_gdb_scripts.c @@ -847,14 +847,14 @@ asm( ".ascii \" for i in range(0, num_children):\\n\"\n" ".ascii \" c = children[i]\\n\"\n" ".ascii \" if int(c) != 0:\\n\"\n" - ".ascii \" c = c.dereference()\\n\"\n" + ".ascii \" c = ZendAstPrettyPrinter(c.dereference()).cast()\\n\"\n" ".ascii \" yield ('child[%d]' % i, c)\\n\"\n" ".ascii \" elif field.name == 'name':\\n\"\n" ".ascii \" yield (field.name, format_zstr(val[field.name]))\\n\"\n" ".ascii \" elif field.name == 'val':\\n\"\n" ".ascii \" yield (field.name, ZvalPrettyPrinter(val[field.name]).to_string())\\n\"\n" ".ascii \" else:\\n\"\n" - ".ascii \" yield (field.name, format_nested(self.val[field.name]))\\n\"\n" + ".ascii \" yield (field.name, format_nested(val[field.name]))\\n\"\n" ".ascii \"\\n\"\n" ".ascii \" def is_special(self):\\n\"\n" ".ascii \" special_shift = 6 # ZEND_AST_SPECIAL_SHIFT\\n\"\n" diff --git a/scripts/gdb/php_gdb.py b/scripts/gdb/php_gdb.py index 3bd66c8d88fb8..335b96de36177 100644 --- a/scripts/gdb/php_gdb.py +++ b/scripts/gdb/php_gdb.py @@ -177,14 +177,14 @@ def children(self): for i in range(0, num_children): c = children[i] if int(c) != 0: - c = c.dereference() + c = ZendAstPrettyPrinter(c.dereference()).cast() yield ('child[%d]' % i, c) elif field.name == 'name': yield (field.name, format_zstr(val[field.name])) elif field.name == 'val': yield (field.name, ZvalPrettyPrinter(val[field.name]).to_string()) else: - yield (field.name, format_nested(self.val[field.name])) + yield (field.name, format_nested(val[field.name])) def is_special(self): special_shift = 6 # ZEND_AST_SPECIAL_SHIFT From 0e940e8d8b7c18649f22b836aa751165a13f04d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20D=C3=BCsterhus?= Date: Thu, 13 Feb 2025 14:38:04 +0100 Subject: [PATCH 2/3] php_gdb: Handle `NULL` in `format_zstr` --- main/debug_gdb_scripts.c | 3 +++ scripts/gdb/php_gdb.py | 3 +++ 2 files changed, 6 insertions(+) diff --git a/main/debug_gdb_scripts.c b/main/debug_gdb_scripts.c index 5eb2943d658df..b3a147a290d71 100644 --- a/main/debug_gdb_scripts.c +++ b/main/debug_gdb_scripts.c @@ -1631,6 +1631,9 @@ asm( ".ascii \" return ary_type.fields()[0].type.range()[1]+1\\n\"\n" ".ascii \"\\n\"\n" ".ascii \"def format_zstr(zstr):\\n\"\n" + ".ascii \" if zstr.type.code == gdb.TYPE_CODE_PTR and int(zstr) == 0:\\n\"\n" + ".ascii \" return zstr\\n\"\n" + ".ascii \"\\n\"\n" ".ascii \" len = int(zstr['len'])\\n\"\n" ".ascii \" truncated = False\\n\"\n" ".ascii \" if len > 200:\\n\"\n" diff --git a/scripts/gdb/php_gdb.py b/scripts/gdb/php_gdb.py index 335b96de36177..7547edab57981 100644 --- a/scripts/gdb/php_gdb.py +++ b/scripts/gdb/php_gdb.py @@ -961,6 +961,9 @@ def array_size(ary_type): return ary_type.fields()[0].type.range()[1]+1 def format_zstr(zstr): + if zstr.type.code == gdb.TYPE_CODE_PTR and int(zstr) == 0: + return zstr + len = int(zstr['len']) truncated = False if len > 200: From a0f97eda9acc14dedbf80853060efdd4c0d9c1b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20D=C3=BCsterhus?= Date: Thu, 13 Feb 2025 16:16:28 +0100 Subject: [PATCH 3/3] Resolve review remarks --- main/debug_gdb_scripts.c | 7 +------ scripts/gdb/php_gdb.py | 7 +------ 2 files changed, 2 insertions(+), 12 deletions(-) diff --git a/main/debug_gdb_scripts.c b/main/debug_gdb_scripts.c index b3a147a290d71..6368b403d5cd2 100644 --- a/main/debug_gdb_scripts.c +++ b/main/debug_gdb_scripts.c @@ -847,10 +847,8 @@ asm( ".ascii \" for i in range(0, num_children):\\n\"\n" ".ascii \" c = children[i]\\n\"\n" ".ascii \" if int(c) != 0:\\n\"\n" - ".ascii \" c = ZendAstPrettyPrinter(c.dereference()).cast()\\n\"\n" + ".ascii \" c = c.dereference()\\n\"\n" ".ascii \" yield ('child[%d]' % i, c)\\n\"\n" - ".ascii \" elif field.name == 'name':\\n\"\n" - ".ascii \" yield (field.name, format_zstr(val[field.name]))\\n\"\n" ".ascii \" elif field.name == 'val':\\n\"\n" ".ascii \" yield (field.name, ZvalPrettyPrinter(val[field.name]).to_string())\\n\"\n" ".ascii \" else:\\n\"\n" @@ -1631,9 +1629,6 @@ asm( ".ascii \" return ary_type.fields()[0].type.range()[1]+1\\n\"\n" ".ascii \"\\n\"\n" ".ascii \"def format_zstr(zstr):\\n\"\n" - ".ascii \" if zstr.type.code == gdb.TYPE_CODE_PTR and int(zstr) == 0:\\n\"\n" - ".ascii \" return zstr\\n\"\n" - ".ascii \"\\n\"\n" ".ascii \" len = int(zstr['len'])\\n\"\n" ".ascii \" truncated = False\\n\"\n" ".ascii \" if len > 200:\\n\"\n" diff --git a/scripts/gdb/php_gdb.py b/scripts/gdb/php_gdb.py index 7547edab57981..8841833a32e43 100644 --- a/scripts/gdb/php_gdb.py +++ b/scripts/gdb/php_gdb.py @@ -177,10 +177,8 @@ def children(self): for i in range(0, num_children): c = children[i] if int(c) != 0: - c = ZendAstPrettyPrinter(c.dereference()).cast() + c = c.dereference() yield ('child[%d]' % i, c) - elif field.name == 'name': - yield (field.name, format_zstr(val[field.name])) elif field.name == 'val': yield (field.name, ZvalPrettyPrinter(val[field.name]).to_string()) else: @@ -961,9 +959,6 @@ def array_size(ary_type): return ary_type.fields()[0].type.range()[1]+1 def format_zstr(zstr): - if zstr.type.code == gdb.TYPE_CODE_PTR and int(zstr) == 0: - return zstr - len = int(zstr['len']) truncated = False if len > 200: