[Tarantool-patches] [PATCH luajit 0/4] Introduce gdb extension for LuaJIT

Sergey Ostanevich sergos at tarantool.org
Mon Feb 3 16:48:01 MSK 2020


Hi! 

Thanks for the patch! 

1. It would be nice to include at least short description on how to hook up 
the script into the gdb. I used "source <fullpath>" - is it intended?

2. If there's no tarantool running - then most of commands fail with error:

(gdb) source /workspaces/tarantool.review/third_party/luajit/src/luajit-gdb.py
(gdb) lj-arch
LJ_64: True, LJ_GC64: False
(gdb) lj-gc
Traceback (most recent call last):
  File "/workspaces/tarantool.review/third_party/luajit/src/luajit-gdb.py", line 615, in invoke
    g = G(L(None))
  File "/workspaces/tarantool.review/third_party/luajit/src/luajit-gdb.py", line 188, in L
    'tarantool_L',
  File "/workspaces/tarantool.review/third_party/luajit/src/luajit-gdb.py", line 184, in <lambda>
    for l in [ L ] + list(map(lambda l: lookup(l), (
  File "/workspaces/tarantool.review/third_party/luajit/src/luajit-gdb.py", line 32, in lookup
    variable, _ = gdb.lookup_symbol(symbol)
gdb.error: No frame selected.
Error occurred in Python command: No frame selected.

3. You didn't mention it anywhere but you rely on internal symbols of tarantool, 
so it will fail when debugging stripped executable or a non-tarantool one:

(gdb) source /workspaces/tarantool.review/third_party/luajit/src/luajit-gdb.py
Traceback (most recent call last):
  File "/workspaces/tarantool.review/third_party/luajit/src/luajit-gdb.py", line 154, in <module>
    LJ_64 = str(gdb.parse_and_eval('IRT_PTR')) == 'IRT_P64'
gdb.error: No symbol "IRT_PTR" in current context.

I believe those should be augmented with grace failures with some meaningful explanation.

Otherwise I have no objections neither in code, nor in split patchset. 

Regards,
Sergos


On 27 Jan 23:41, Igor Munkin wrote:
> The series provides a gdb extension with commands for inspecting LuaJIT
> internals. The following set of commands is implemented now:
> 
> ### lj-arch
> 
> The command requires no args and dumps values of LJ_64 and LJ_GC64
> compile-time flags. These values define the sizes of host and GC
> pointers respectively.
> 
> NB: Compile-time defines are checked when script is being loaded:
> * When LJ_64 is enabled IRT_PTR is an IRT_P64 alias and an IRT_P32 one
>   otherwise
> * When LJ_64 is enabled IRT_PGC is an IRT_P64 alias and an IRT_P32 one
>   otherwise
> 
> ### lj-tv
> 
> The command recieves a <tv address> (TValue address) and dumps the type
> and some info related to it.
> * LJ_TNIL: nil
> * LJ_TFALSE: false
> * LJ_TTRUE: true
> * LJ_TLIGHTUD: light userdata @ <gcr>
> * LJ_TSTR: string <string payload> @ <gcr>
> * LJ_TUPVAL: upvalue @ <gcr>
> * LJ_TTHREAD: thread @ <gcr>
> * LJ_TPROTO: proto @ <gcr>
> * LJ_TFUNC: <LFUNC|CFUNC|FFUNC>
>   - <LFUNC>: Lua function @ <gcr>, <nupvals> upvalues, <chunk:line>
>   - <CFUNC>: C function <mcode address>
>   - <FFUNC>: fast function #<ffid>
> * LJ_TTRACE: trace <traceno> @ <gcr>
> * LJ_TCDATA: cdata @ <gcr>
> * LJ_TTAB: table @ <gcr> (asize: <asize>, hmask: <hmask>)
> * LJ_TUDATA: userdata @ <gcr>
> * LJ_TNUMX: number <numeric payload>
> 
> Whether the type of the given address differs from the listed above, then
> error message occurs.
> 
> ### lj-str
> 
> The command recieves a <gcr> of the corresponding GCstr object and dumps
> the payload, size in bytes and hash.
> 
> *Caveat*: Since Python 2 provides no native Unicode support, the payload
> is replaced with the corresponding error when decoding fails.
> 
> ### lj-tab
> 
> The command recieves a GCtab address and dumps the table contents:
> * Metatable address whether the one is set
> * Array part <asize> slots:
>   <aslot ptr>: [<index>]: <tv>
> * Hash part <hsize> nodes:
>   <hnode ptr>: { <tv> } => { <tv> }; next = <next hnode ptr>
> 
> ### lj-stack
> 
> The command recieves a lua_State address and dumps the given Lua
> coroutine guest stack:
> 
> <slot ptr> [<slot attributes>] <VALUE|FRAME>
> 
> * <slot ptr>: guest stack slot address
> * <slot attributes>:
>   - S: Bottom of the stack (the slot L->stack points to)
>   - B: Base of the current guest frame (the slot L->base points to)
>   - T: Top of the current guest frame (the slot L->top points to)
>   - M: Last slot of the stack (the slot L->maxstack points to)
> * <VALUE>: see help lj-tv for more info
> * <FRAME>: framelink slot differs from the value slot: it contains info
>   related to the function being executed within this guest frame, its
>   type and link to the parent guest frame
>   [<frame type>] delta=<slots in frame>, <lj-tv for LJ_TFUNC slot>
>   - <frame type>:
>     + L:  VM performs a call as a result of bytecode execution
>     + C:  VM performs a call as a result of lj_vm_call
>     + M:  VM performs a call to a metamethod as a result of bytecode
>           execution
>     + V:  Variable-length frame for storing arguments of a variadic
>           function
>     + CP: Protected C frame
>     + PP: VM performs a call as a result of executinig pcall or xpcall
> 
> If L is ommited the main coroutine is used.
> 
> ### lj-state
> 
> The command requires no args and dumps current VM and GC states
> * VM state: <INTERP|C|GC|EXIT|RECORD|OPT|ASM|TRACE>
> * GC state: <PAUSE|PROPAGATE|ATOMIC|SWEEPSTRING|SWEEP|FINALIZE|LAST>
> * JIT state: <IDLE|ACTIVE|RECORD|START|END|ASM|ERR>
> 
> ### lj-gc
> 
> The command requires no args and dumps current GC stats:
> * total: <total number of allocated bytes in GC area>
> * threshold: <limit when gc step is triggered>
> * debt: <how much GC is behind schedule>
> * estimate: <estimate of memory actually in use>
> * stepmul: <incremental GC step granularity>
> * pause: <pause between successive GC cycles>
> * sweepstr: <sweep position in string table>
> * root: <number of all collectable objects>
> * gray: <number of gray objects>
> * grayagain: <number of objects for atomic traversal>
> * weak: <number of weak tables (to be cleared)>
> 
> Signed-off-by: Igor Munkin <imun at tarantool.org>
> 
> ---
> 
> Branch: https://github.com/tarantool/luajit/tree/imun/luajit-gdb
> 
> Igor Munkin (4):
>   gdb: introduce luajit-gdb extension
>   gdb: make existing commands more verbose
>   gdb: make several enhancements
>   gdb: adjust extension to be used with Python 2
> 
>  src/luajit-gdb.py | 699 ++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 699 insertions(+)
>  create mode 100644 src/luajit-gdb.py
> 
> -- 
> 2.24.0
> 


More information about the Tarantool-patches mailing list