尝试设置调试后弄乱了 lua 路径
messed up lua paths after trying to set up debugging
我想调试大型 lua 代码库。为此,我下载了 ZeroBrane 并按照他们的说明设置了捆绑的 mobdebug。
代码库是 koreader。以下 shellscript 重现了我所做的:
# 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 在这里做什么?如果设置了 none,它是否总是假设一些默认值 LUA_PATH 和 LUA_CPATH?因为它在我不指定任何路径的情况下工作得很好。
您的代码正在尝试加载库 libkoreader-lfs
,在 LUA_CPATH
或 LUA_PATH
中设置的任何路径中都找不到该库。我不知道你的项目结构能给你确切的答案,但因为它在你 不 设置这些环境变量时有效,而在你设置时不起作用,它看起来就像您正在覆盖这些变量的一些默认值一样。
尝试向这些变量添加而不是设置它们:
export LUA_PATH="$LUA_PATH;./?.lua;$ZBS/lualibs/?/?.lua;$ZBS/lualibs/?.lua"
export LUA_CPATH="$LUA_CPATH;$ZBS/bin/linux/x86/?.so;$ZBS/bin/linux/x86/clibs/?.so"
两个路径的默认值都位于 luaconf.h#LUA_PATH_DEFAULT ff。 (5.3).
也就是说 - 您的 LUA_CPATH
遗漏了默认设置中的两点:LUA_CDIR/loadall.so
和 ./?.so
。在你的情况下,问题是由于缺少第二个。
那是因为 ./kodev run
做了一些额外的操作来设置运行时环境。在某些时候,工作目录更改为 EMU_DIR
(例如 ./koreader-emulator-x86_64-linux-gnu-debug/koreader
)。这个目录也有一个有效的 libs/libkoreader-lfs.so
.
将 LUA_CPATH
更改为包含 ./?.so
:
export LUA_CPATH="$ZBS/bin/linux/x86/?.so;$ZBS/bin/linux/x86/clibs/?.so;./?.so"
我想调试大型 lua 代码库。为此,我下载了 ZeroBrane 并按照他们的说明设置了捆绑的 mobdebug。
代码库是 koreader。以下 shellscript 重现了我所做的:
# 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 在这里做什么?如果设置了 none,它是否总是假设一些默认值 LUA_PATH 和 LUA_CPATH?因为它在我不指定任何路径的情况下工作得很好。
您的代码正在尝试加载库 libkoreader-lfs
,在 LUA_CPATH
或 LUA_PATH
中设置的任何路径中都找不到该库。我不知道你的项目结构能给你确切的答案,但因为它在你 不 设置这些环境变量时有效,而在你设置时不起作用,它看起来就像您正在覆盖这些变量的一些默认值一样。
尝试向这些变量添加而不是设置它们:
export LUA_PATH="$LUA_PATH;./?.lua;$ZBS/lualibs/?/?.lua;$ZBS/lualibs/?.lua"
export LUA_CPATH="$LUA_CPATH;$ZBS/bin/linux/x86/?.so;$ZBS/bin/linux/x86/clibs/?.so"
两个路径的默认值都位于 luaconf.h#LUA_PATH_DEFAULT ff。 (5.3).
也就是说 - 您的 LUA_CPATH
遗漏了默认设置中的两点:LUA_CDIR/loadall.so
和 ./?.so
。在你的情况下,问题是由于缺少第二个。
那是因为 ./kodev run
做了一些额外的操作来设置运行时环境。在某些时候,工作目录更改为 EMU_DIR
(例如 ./koreader-emulator-x86_64-linux-gnu-debug/koreader
)。这个目录也有一个有效的 libs/libkoreader-lfs.so
.
将 LUA_CPATH
更改为包含 ./?.so
:
export LUA_CPATH="$ZBS/bin/linux/x86/?.so;$ZBS/bin/linux/x86/clibs/?.so;./?.so"