Debugging 尝试设置调试后,lua路径混乱
我想通过一个大型lua代码库进行调试。为此,我下载了ZeroBrane并按照他们的指示设置捆绑的mobdebug 代码库是koreader。下面的shell脚本复制了我所做的操作:Debugging 尝试设置调试后,lua路径混乱,debugging,lua,zerobrane,Debugging,Lua,Zerobrane,我想通过一个大型lua代码库进行调试。为此,我下载了ZeroBrane并按照他们的指示设置捆绑的mobdebug 代码库是koreader。下面的shell脚本复制了我所做的操作: # dependencies for building koreader sudo apt-get install build-essential git patch wget unzip \ gettext autoconf automake cmake libtool nasm luarocks libsdl2-
# dependencies for building koreader
sudo apt-get install build-essential git patch wget unzip \
gettext autoconf automake cmake libtool nasm luarocks libsdl2-dev \
libssl-dev libffi-dev libsdl2-dev libc6-dev-i386 xutils-dev linux-libc-dev:i386 zlib1g:i386
# get the source
git clone https://github.com/koreader/koreader.git
cd koreader && ./kodev fetch-thirdparty
# build it, this will take a long time
./kodev build
# assuming you have ZeroBrane installed
export ZBS=/opt/zbstudio
export LUA_PATH="./?.lua;$ZBS/lualibs/?/?.lua;$ZBS/lualibs/?.lua"
export LUA_CPATH="$ZBS/bin/linux/x86/?.so;$ZBS/bin/linux/x86/clibs/?.so"
# execute it, this will run lua
./kodev run
执行/kodev run
会导致以下错误消息:
[*] Current time: 10/14/19-17:55:34
./luajit: ./datastorage.lua:3: module 'libs/libkoreader-lfs' not found:
no field package.preload['libs/libkoreader-lfs']
no file './libs/libkoreader-lfs.lua'
no file '/opt/zbstudio/lualibs/libs/libkoreader-lfs/libs/libkoreader-lfs.lua'
no file '/opt/zbstudio/lualibs/libs/libkoreader-lfs.lua'
no file '/opt/zbstudio/bin/linux/x86/libs/libkoreader-lfs.so'
no file '/opt/zbstudio/bin/linux/x86/clibs/libs/libkoreader-lfs.so'
stack traceback:
[C]: in function 'require'
./datastorage.lua:3: in main chunk
[C]: in function 'require'
./reader.lua:18: in main chunk
[C]: at 0x55a81bf25771
~/programming/koreader
如果没有定义LUA_PATH
和LUA_CPATH
,那么就没有问题,koreader运行得很好。所以我假设导入路径在某种程度上被破坏了。如何正确设置此项
如果我正确阅读代码,/kodev run
将(在某个时候)执行以下操作,这可能会对您有所帮助:
-- set search path for 'require()'
package.path =
"common/?.lua;rocks/share/lua/5.1/?.lua;frontend/?.lua;" ..
package.path
package.cpath =
"common/?.so;common/?.dll;/usr/lib/lua/?.so;rocks/lib/lua/5.1/?.so;" ..
package.cpath
libkoreader-lfs.so的实际位置为:
/home/lklein/programming/koreader/base/build/x86_64-linux-gnu-debug/libs/libkoreader-lfs.so
事实上,如果我将其附加到CPATH
/home/lklein/programming/koreader/base/build/x86_64-linux-gnu-debug/?.so
然后它就可以运行了。卢阿在这里干什么?它是否总是假设一些默认的LUA_路径和LUA_CPATH(如果没有设置)?因为它在我不指定任何路径的情况下工作正常。您的代码正在尝试加载库
libkoreader lfs
,在LUA\u CPATH
或LUA\u path
中设置的任何路径中都找不到该库。我不知道你的项目结构会给你一个确切的答案,但由于它在你不设置这些环境变量时起作用,在你设置这些环境变量时也不起作用,所以看起来你正在覆盖这些变量的一些默认值
尝试添加到这些变量,而不是设置它们:
两条路径的默认值都位于ff中。(5.3) 也就是说,您的
LUA\u CPATH
忽略了默认值中的两个内容:LUA\u CDIR/loadall.so
和/?so
。在您的情况下,问题是由于缺少第二个
这是因为/kodev run
执行一些附加操作来设置运行时环境。在某些情况下,工作目录更改为EMU\u DIR
(例如/koreader-emulator-x86\u 64-linux-gnu-debug/koreader
)。这个目录也有一个有效的libs/libkoreader lfs.so
将LUA\u CPATH更改为包含?。因此
:
export LUA_CPATH="$ZBS/bin/linux/x86/?.so;$ZBS/bin/linux/x86/clibs/?.so;./?.so"
我也试过了。但这没什么区别。事实上,LUA_路径在脚本执行之前并不存在。我认为这是lua特有的。您没有显示正在运行的整个脚本。例如,您的
package.cpath
包括common/?.so
和common?.dll路径,但这些路径都不会显示在错误消息中。您能否显示仅包含设置路径/cpath和失败的require
命令的整个脚本?另外,您尝试加载的模块相对于正在运行的脚本的实际位置是什么?这是一个庞大的现有代码库,而不仅仅是一个脚本。我不清楚什么时候执行。这里的代码可能对lua pro来说是有意义的。但我不能只给你相关的片段。我不知道会是哪一个。建造真的需要很长时间。我已经等了20分钟来验证它了:添加/?。因此,运行脚本将目录更改为base/build/…
,这是您的路径和默认路径之间唯一有意义的区别。一旦我能核实,我会留下一个答案。太棒了,谢谢。(非常感谢你真的建立了回购协议。这确实需要很长时间:D)
export LUA_CPATH="$ZBS/bin/linux/x86/?.so;$ZBS/bin/linux/x86/clibs/?.so;./?.so"