[Tarantool-patches] [PATCH luajit] gdb: fix misalignment in lj-stack for LJ_GC64

Mikhail Shishatskiy m.shishatskiy at tarantool.org
Wed Jul 7 10:10:46 MSK 2021


Since commit 58790750b9c4bd4c21d883f109ab552a2e202a15 ('gdb: introduce
luajit-gdb extension') when luajit-gdb.py is introduced, Lua stack
slots printed by lj-stack command are misaligned, when LJ_GC64 is
enabled. The issue is that PADDING variable used for aligning single
slots in the output is initialized before LuaJIT build mode is
defined in <init> function, so the result was the following:

| 0x7ffff7fb0d90:0x7ffff7fb0dc0 [    ] 7 slots: Red zone
| 0x7ffff7fb0d88            [   M]
| 0x7ffff7fb0cc0:0x7ffff7fb0d80 [    ] 25 slots: Free stack slots
| 0x7ffff7fb0cb8            [  T ]
| ...

In scope of this patch, PADDING initialization is also moved to
<init> function right after all commands are loaded. As a result, the
output looks as expected:

| 0x7ffff7fb0d90:0x7ffff7fb0dc0 [    ] 7 slots: Red zone
| 0x7ffff7fb0d88                [   M]
| 0x7ffff7fb0cc0:0x7ffff7fb0d80 [    ] 25 slots: Free stack slots
| 0x7ffff7fb0cb8                [  T ]
| ...

Fixes tarantool/tarantool#5876
---

Branch: https://github.com/tarantool/luajit/tree/shishqa/gh-5876

To test changes do the following:

| $ gdb -q --args ./luajit -e 'print("QQ")'
| Reading symbols from ./luajit...
| lj-arch command initialized
| lj-tv command initialized
| lj-str command initialized
| lj-tab command initialized
| lj-stack command initialized
| lj-state command initialized
| lj-gc command initialized
| luajit-gdb.py is successfully loaded
| (gdb) lj-arch
| LJ_64: True, LJ_GC64: True
| (gdb) b lj_cf_print
| Breakpoint 1 at 0x298b0: file /mnt/WorkDisk/share/dev/__tarantool/lj-tarantool/src/lib_base.c, line 485.
| (gdb) r
| Starting program: /mnt/WorkDisk/share/dev/__tarantool/lj-tarantool/src/luajit -e print\(\"QQ\"\)
|
| Breakpoint 1, lj_cf_print (L=0x0)
|     at /mnt/WorkDisk/share/dev/__tarantool/lj-tarantool/src/lib_base.c:485
| 485	{
| (gdb) s
| 486	  ptrdiff_t i, nargs = L->top - L->base;
| (gdb) lj-stack L
| 0x7ffff7fa8d90:0x7ffff7fa8dc0 [    ] 7 slots: Red zone
| 0x7ffff7fa8d88                [   M]
| 0x7ffff7fa8cc0:0x7ffff7fa8d80 [    ] 25 slots: Free stack slots
| 0x7ffff7fa8cb8                [  T ]
| 0x7ffff7fa8cb0                [ B  ] VALUE: string "QQ" @ 0x7ffff7fb1178
| 0x7ffff7fa8ca0:0x7ffff7fa8ca8 [    ] FRAME: [L] delta=2, fast function #29
| 0x7ffff7fa8c90:0x7ffff7fa8c98 [    ] FRAME: [V] delta=2, Lua function @ 0x7ffff7fb1240, 0 upvalues, "=(command line)":0
| 0x7ffff7fa8c80:0x7ffff7fa8c88 [    ] FRAME: [CP] delta=4, Lua function @ 0x7ffff7fb1240, 0 upvalues, "=(command line)":0
| 0x7ffff7fa8c78                [    ] VALUE: C function @ 0x55555555c962
| 0x7ffff7fa8c70                [    ] VALUE: light userdata @ 0x0
| 0x7ffff7fa8c60:0x7ffff7fa8c68 [    ] FRAME: [CP] delta=2, C function @ 0x55555555df1c
| 0x7ffff7fa8c58:0x7ffff7fa8c60 [S   ] FRAME: dummy L


 src/luajit-gdb.py | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/src/luajit-gdb.py b/src/luajit-gdb.py
index f1fd6230..720d989a 100644
--- a/src/luajit-gdb.py
+++ b/src/luajit-gdb.py
@@ -160,7 +160,7 @@ LJ_FR2 = None
 
 LJ_GCVMASK = ((1 << 47) - 1)
 
-PADDING = ' ' * len(':' + hex((1 << (47 if LJ_GC64 else 32)) - 1))
+PADDING = None
 
 # }}}
 
@@ -665,7 +665,7 @@ The command requires no args and dumps current GC stats:
         ))
 
 def init(commands):
-    global LJ_64, LJ_GC64, LJ_FR2
+    global LJ_64, LJ_GC64, LJ_FR2, PADDING
 
     # XXX Fragile: though connecting the callback looks like a crap but it
     # respects both Python 2 and Python 3 (see #4828).
@@ -714,6 +714,8 @@ def init(commands):
     for name, command in commands.items():
         command(name)
 
+    PADDING = ' ' * len(':' + hex((1 << (47 if LJ_GC64 else 32)) - 1))
+
     gdb.write('luajit-gdb.py is successfully loaded\n')
 
 def load(event=None):
-- 
2.32.0



More information about the Tarantool-patches mailing list