lua_getglobal crashing program
我之前写过一篇有关尝试从C调用lua函数的文章。您可以在这里查看:
Lua:加载文件后获取全局功能失败
如您所见,我正在加载lua文件,然后尝试获取该函数并对其进行调用。一位读者建议我针对该问题的解决方案是更改为dofile而不是加载文件,因为您需要执行脚本才能访问这些功能。但这不是眼前的问题...
无论使用dofile还是loadfile,当我调用lua_getglobal(L," abc");
我的程序崩溃了...
呼叫栈:
1 2 3 4
| > Translation.exe!luaS_newlstr(lua_State * L=0xcccccccc, const char * str=0x00460924, unsigned int l=3) Line 84 + 0x3 bytes C
Translation.exe!lua_getfield(lua_State * L=0xcccccccc, int idx=-10002, const char * k=0x00460924) Line 551 + 0x20 bytes C
Translation.exe!LanguageShovel::FileFound(std::basic_string<char,std::char_traits<char>,std::allocator<char> > path="C:\\Loud\
esolution\\orchid\\source\\EAWResolutionApplication.cpp") Line 32 + 0x16 bytes C++ |
崩溃于:
1 2 3
| for (o = G(L)->strt.hash[lmod(h, G(L)->strt.size)];
o != NULL;
o = o->gch.next) { |
Lua库中的lstring.c文件中的
。我不知道这个lua源代码到底发生了什么。您认为这可能是lua的错误吗?还是我只是做错了?
运行:Windows xp 32位。
- 您是否检查了lua[L]_*调用中的错误?很抱歉提出这样一个居高临下的问题,但是您没有向我们提供代码。 (并且您之前的代码不进行检查。)
-
堆栈跟踪显示您的Lua状态为0xcccccccc。您是如何创建状态的?真正的问题是:lua_open()是什么?您从哪里获得此功能的?
-
lua_open是定义为luaL_newstate的宏。
-
我测试了luaLdoFile,该返回没有错误。我不记得确切地做了什么测试,但这已经很明确了。如果有一些特定的问题,您认为我应该再次进行测试,但据我所知,直到调用getglobal之前,一切都按预期进行。
L=0xcccccccc提示您没有将Lua状态变量正确传递给此函数(或者它在您的lua_open和lua_getglobal调用之间丢失了)。
- 我不确定那是怎么回事...考虑到我要做的就是打开lua库,调用dofile(),它不会返回错误,然后获取全局变量。
-
如果不显示导致此错误的代码,将很难提供帮助。
-
@Colton:您说I'm not sure how that could be...。有一种非常快速的方法来检查可能的情况:调试程序,并观察lua_getglobal的第一个参数在哪里以及如何以0xcccccccc的形式出现。在VC调试版本中,这是未初始化的堆栈变量。
-
好吧,我一直在逐步完成我的程序。为了了解正在发生的事情,您基本上需要了解我的开源FileDigger界面code.google.com/p/file-digger/source/browse / ...如果您查看FileDigger.cpp,您将看到程序执行的递归操作。
-
在我的主文件中,我创建了FileDigger f和Shovel s的实例。然后我叫f.Dig(directory,s)。在任何递归操作之前,都会调用s.BeforeDig(path)来设置lua状态。在递归序列中找到文件时,它将调用s.DirectoryFound(path)。我不知道为什么在类中调用简单方法会这样做,但是一旦调用该类,它将把lua状态重置为0xcccccccccc。如果您不明白此描述的意思,请告诉我,我会再试一次。由于专有工作内容,我不愿意发布源代码。但是filedigger是开源的。
-
@Colton:您很有可能在某个地方遇到内存管理错误(缓冲区上溢/下溢,无效的空闲空间等)。使用内存调试器找到它(stackoverflow.com/questions/413477/…)。无论如何,您都不应该在此处转储大量代码,而只是一个最小的示例,该示例将剥夺所有专有内容。