【问题标题】:How to read variables values from Lua running process ( obtain process variable value )?如何从 Lua 运行进程中读取变量值(获取进程变量值)?
【发布时间】:2014-12-22 11:48:43
【问题描述】:

我尝试了一些尝试来运行 Lua 代码,并在其运行槽 C/C++ 时检索其值,但我的应用程序因分段错误而崩溃。

例如。访问不属于我的内存:

到目前为止,我得到了这个。简单的过程,使用 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)我可以尝试的方式是一个文件,但它真的很慢(硬盘)

2) 内存盘上的文件 - 速度快,但不是每个人都有内存盘。

【问题讨论】:

  • 使用%p 打印指针。另外,如果你不介意一些额外的 C 代码,你可以使用mmap 来共享内存。
  • 这看起来像XY Problem。请给我们一万英尺的景色。

标签: c++ variables interface process lua


【解决方案1】:

创建一个 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);

【讨论】:

  • 但这只是打开文件并执行它...我在谈论一个正在运行的进程。你在这里看到我的文件已经在运行,而不是从 C 中打开并执行它。如果你运行它,文件将再次打开并且表的地址将不同(相同的“a”,相同的值,但在不同的内存中的地址)
  • 这是真的!我误解了你的问题。如果您只是想确定程序的运行状态,则可以使用远程调试器,例如:studio.zerobrane.com/doc-remote-debugging.html 或此处描述的:stackoverflow.com/questions/5438751/how-to-debug-lua-remotely。或者,您可以在带有信号处理程序的 C 程序中运行它,该处理程序在收到特定信号时转储 Lua 全局变量的状态。
猜你喜欢
  • 2020-12-22
  • 1970-01-01
  • 2021-03-02
  • 2019-09-13
  • 2013-08-02
  • 1970-01-01
  • 2011-08-19
  • 2011-01-17
  • 2020-02-04
相关资源
最近更新 更多