Debugging 尝试设置调试后,lua路径混乱

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-

我想通过一个大型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-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"