2014-10-27 81 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