tôi đã tạo ra một kịch bản GDB để làm những thứ trong trang web liên quan đến bằng Mac. Nó không đẹp, và có lẽ nên được bao bọc đúng cách vào một chức năng vv, nhưng ở đây nó là cho tò mò.
LƯU Ý: Dường như trang web không đúng về tên tệp cho các hàm lua. Trong trường hợp chuỗi xuất phát từ luaL_dofile()
, tên tệp bắt đầu bằng ký hiệu @
. Nếu chúng được gọi từ lua_dostring()
. Trong trường hợp đó biến số $filename
được đặt thành toàn bộ chuỗi được chuyển đến lua_dostring()
- và người dùng có lẽ chỉ quan tâm đến một hoặc hai dòng ngữ cảnh từ tệp đó. Tôi không chắc cách sửa lỗi đó.
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
này kết quả đầu ra một cái gì đó như:
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*)>
Khi tôi gỡ lỗi các vụ tai nạn từ mã này:
// 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);
}
Với a.lua
-- a.lua
-- just calls B, which calls C which should crash
function A()
B()
end
và b.lua
-- b.lua
function B()
C()
end
Vì vậy, có thể bạn đã đọc điều này, nhưng tôi không biết, vì vậy đừng lo lắng, vui lòng;) [Lua callstack with C++ debugger] (http://zeuxcg.org/2010/11/07/lua-callstack-với-c-debugger /) –
@macs Đó là một tổng quan khá tuyệt vời. Phần "Kiểm tra cấu trúc dữ liệu Lua" là chìa khóa. Tôi đã làm việc ra hầu hết nhưng nó khá cồng kềnh để sử dụng. Tôi có lẽ sẽ xem xét để viết một số macro/script GDB để làm cho nó hoàn toàn khả thi. –
Tôi rất vui khi đưa cho bạn một bàn tay giúp đỡ, đó cũng là [StackTracePlus] (https://github.com/ignacio/StackTracePlus) nhưng bạn sẽ phải sửa đổi chức năng gọi C, nếu tôi đúng. Vì vậy, nó khá vô ích trong trường hợp cụ thể này. –