diff --git a/tools/lua-gdb/luagdb.txt b/tools/lua-gdb/luagdb.txt new file mode 100755 index 0000000..df4a521 --- /dev/null +++ b/tools/lua-gdb/luagdb.txt @@ -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 [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 + 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 "%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 " %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 " %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 [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