2014-10-27 82 views
2

我尝试了一些运行Lua代码的尝试,并在运行低谷C/C++时检索其值,但我的应用程序因分段故障而崩溃。如何从Lua运行进程读取变量值(获取过程变量值)?

例如。访问不正确的内存:

到目前为止,我得到了这个。简单的过程,用Lua解释器:

a = {5} 

local Cnt1 = 0 
local Cnt2 = 0 
while true do 
    Cnt2 = Cnt2 + 1 
    if(Cnt2 == 100000000) then 
    Cnt2 = 0 
    print("Irer: "..Cnt1.." Address: "..tostring(a).." Value: "..a[1]) 
    Cnt1 = Cnt1 + 1 
    end 
end 

无限循环实际上是为了保持进程唤醒和表地址常量。

正如您所看到的,我打印出“a”的地址,我将其复制到控制台本身的C(代码块)中。之后,我又写了程序,在这里我硬编码的指针像这样的存储器映射:

unsigned char *p = (unsigned char *)0x78C070; 
printf("Value: %u",*p); 
return 0; 

可能的方式是
1)的方式,我可以尝试是一个文件,但它确实慢(HDD)

2)ram-disk上的文件 - 速度很快,但不是每个人都有一个ram-disk。

+0

使用'%p'打印指针。另外,如果你不介意一些额外的C代码,你可以使用'mmap'来共享内存。 – 2014-10-27 13:01:36

+0

这看起来像[XY问题](http://meta.stackexchange.com/a/66378)。请给我们一万英尺的看法。 – 2014-10-27 22:20:28

回答

0

创建一个C包装程序并使用Lua C API检索值。这是一个应该检索你的“a”的例子。没有错误处理,但希望你会明白。

lua_State *L = sys_lua_L(); 
luaL_loadfile(L, "your_lua_script.lua"); 
lua_pcall(L, 0, 0, 0); 
lua_getglobal(L, "a"); // retrieve lua variable a 
lua_rawgeti(L, -1, 1); // assumes "a" is a table 
int val = lua_tointegerL, -1); 
printf("%d\n", val); 
+0

但是这只是打开文件并执行它...我正在谈论一个正在运行的进程。你在这里看到我的文件已经在运行,而不是从C打开并执行它。如果你运行这个文件,文件将会再次打开,表格的地址将会不同(相同的“a”,相同的值,但是不同的地址在内存中) – 2014-10-31 08:18:41

+1

这是真的!我误解了你的问题。如果您只是试图确定程序的运行状态,则可以使用远程调试程序,如http://studio.zerobrane.com/doc-remote-debugging.html或这里描述的一个:http:// stackoverflow.com/questions/5438751/how-to-debug-lua-remotely。另外,你也可以在一个C程序中运行它,并且在接收到某个信号时使用一个信号处理程序来转储Lua全局状态。 – 2014-11-03 16:47:52

+0

感谢m8,这似乎更可靠! – 2014-11-07 11:57:10