🐳 chore(工具): 增加 lua gdb 工具

develop
cloudfreexiao 5 years ago
parent c02c53765a
commit b6fc0646f7

@ -0,0 +1,183 @@
# Lua GDB Helpers
# https://github.com/mkottman/lua-gdb-helper
# Copyright (c) 2010 Michal Kottman
# License: MIT
define luavalue
if $argc == 0
help luavalue
else
if $argc == 2
set $L = $arg1
else
set $L = L
end
set $obj = index2adr($L, $arg0)
end
end
document luavalue
luavalue <index> [L]
Provides a pointer to a TValue from a stack index. By default, uses the current variable
L as a lua_State pointer, but can be specified as the second argument. The return value
is passed in variable $obj.
end
define luaprinttable
if $argc != 1
help luaprinttable
else
printf " { "
set $t = $arg0
set $node = $t->node
set $i = 0
set $last = 1 << $t->lsizenode
# hash part
while $i < $last
set $node = $t->node + $i
set $key = $node->i_key
if $key.tvk.tt > 0
if $key.tvk.tt == 4
# string key
set $ts = &($key.tvk.value->gc->ts)
set $str = (char *)($ts + 1)
printf "%s = ", $str
else
printf "<%s> = ", lua_typename(L, $key.tvk.tt)
end
set $val = &($node->i_val)
luaprint $val
printf ",\n"
end
set $i = $i + 1
end
# array part
set $i = 0
while $i < $t->sizearray
set $val = $t->array + $i
luaprint $val
printf ", "
set $i = $i + 1
end
printf " } "
end
end
document luaprinttable
luaprinttable <table>
Pretty-prints a Lua Table. Expects a pointer to Table.
end
define luaprint
if $argc == 0
help luaprint
else
set $v = $arg0
set $val = &($v.value)
set $type = $v.tt
if $type == 0
printf "nil"
end
# boolean
if $type == 1
if $val->b > 0
printf "true"
else
printf "false"
end
end
# lightudata
if $type == 2
printf "<ludata>%p", $val->p
end
# number
if $type == 3
printf "%f", $val->n
end
# string
if $type == 4
set $ts = &($val->gc->ts)
set $str = (char *)($ts + 1)
printf "'%s'", $str
end
# table
if $type == 5
set $tab = &($val->gc->h)
printf "<tab> %p ", $tab
if $argc == 2
luaprinttable $tab
if $tab.metatable
printf " metatable="
luaprinttable $tab.metatable
end
end
end
# userdata
if $type == 7
set $uv = $val->gc.u->uv
printf "<udata> %p size=%d", &($val->gc.u) + 1, $uv.len
if $argc == 2 && $uv.metatable
printf " metatable="
luaprinttable $uv.metatable
end
if $argc == 2 && $uv.env
printf " env="
luaprinttable $uv.env
end
end
# other
if $type > 5 && $type != 7
printf "<%s> %p", lua_typename(L, $type), $val
end
end
end
document luaprint
luaprint <value> [verbose]
Pretty-prints a TValue passed as argument. Expects a pointer to a TValue. When verbose is 1,
expands tables, metatables and userdata environments.
end
define luastack
if $argc == 0
set $L = L
else
set $L = $arg0
end
printf "Lua stack trace: %d items\n", lua_gettop($L)
set $ptr = $L->base
set $idx = 1
while $ptr < $L->top
printf "%03d: ", $idx
luaprint $ptr
printf "\n"
set $ptr = $ptr + 1
set $idx = $idx + 1
end
end
document luastack
luastack [L]
Prints values on the Lua C stack. Without arguments, uses the current value of "L"
as the lua_State*. You can provide an alternate lua_State as the first argument.
end
define luatrace
if $argc == 0
set $L = L
else
set $L = $arg0
end
if luaL_loadstring ($L, "return debug.traceback()") == 0
if lua_pcall($L, 0, 1, 0) == 0
printf "%s\n", lua_tolstring ($L, -1, 0)
else
printf "ERROR: %s\n", lua_tolstring ($L, -1, 0)
end
call lua_settop ($L, -2)
end
end
document luatrace
luatraceback [L]
Dumps Lua execution stack, as debug.traceback() does. Without
arguments, uses the current value of "L" as the
lua_State*. You can provide an alternate lua_State as the
first argument.
end
Loading…
Cancel
Save