Ho creato uno script GDB per fare le cose nella pagina web collegata ai mac. Non è bello, e probabilmente dovrebbe essere avvolto correttamente in una funzione, ecc., Ma qui è per i curiosi.
NOTA: Sembra che la pagina Web sia errata sul nome file per le funzioni lua. Nel caso in cui la stringa provenga da luaL_dofile()
il nome file inizia con un simbolo @
. Se vengono chiamati da lua_dostring()
. In questo caso la variabile $filename
è impostata sull'intera stringa passata a lua_dostring()
- e l'utente probabilmente è interessato solo a una o due righe di contesto da quel file. Non ero sicuro di come sistemarlo.
set $p = L->base_ci
while ($p <= L->ci)
if ($p->func->value.gc->cl.c.isC == 1)
printf "0x%x C FUNCTION", $p
output $p->func->value.gc->cl.c.f
printf "\n"
else
if ($p->func.tt==6)
set $proto = $p->func->value.gc->cl.l.p
set $filename = (char*)(&($proto->source->tsv) + 1)
set $lineno = $proto->lineinfo[ $p->savedpc - $proto->code -1 ]
printf "0x%x LUA FUNCTION : %d %s\n", $p, $lineno, $filename
else
printf "0x%x LUA BASE\n", $p
end
end
set $p = $p+1
end
Emette qualcosa di simile:
0x1002b0 LUA BASE
0x1002c8 LUA FUNCTION : 4 @a.lua
0x1002e0 LUA FUNCTION : 3 @b.lua
0x100310 C FUNCTION(lua_CFunction) 0x1fda <crash_function(lua_State*)>
Quando il debug l'incidente da questo codice:
// This is a file designed to crash horribly when run.
// It should generate a core, and it should crash inside some lua functions
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
#include <iostream>
#include <signal.h>
int crash_function(lua_State * L)
{
raise(SIGABRT); //This should dump core!
return 0;
}
int main()
{
lua_State * L = luaL_newstate();
lua_pushcfunction(L, crash_function);
lua_setfield(L, LUA_GLOBALSINDEX, "C");
luaopen_base(L);
if(1 == luaL_dofile(L, "a.lua"))
{
std::cout<<"ERROR: "<<lua_tostring(L,-1)<<std::endl;
return 1;
}
if(1 == luaL_dofile(L, "b.lua"))
{
std::cout<<"ERROR: "<<lua_tostring(L,-1)<<std::endl;
return 1;
}
lua_getfield(L, LUA_GLOBALSINDEX, "A");
lua_pcall(L, 0, 0, NULL);
}
Con a.lua
-- a.lua
-- just calls B, which calls C which should crash
function A()
B()
end
e b.lua
-- b.lua
function B()
C()
end
Così, forse avete letto questo già, ma non so, in modo da non essere scontroso, si prega;) [Lua stack con C++ debugger] (http://zeuxcg.org/2010/11/07/lua-callstack-with-c-debugger /) –
@macs Questa è una panoramica abbastanza buona. La sezione "Ispezione strutture dati Lua" è la chiave. Avevo elaborato la maggior parte di questo, ma era piuttosto complicato da usare. Probabilmente cercherò di scrivere alcune macro/script GDB per renderlo funzionante. –
Sono felice di darti una mano, c'è anche [StackTracePlus] (https://github.com/ignacio/StackTracePlus) ma dovrai modificare la funzione C chiamante, se sono corretto. Quindi è piuttosto inutile in questo caso particolare. –