【问题标题】:messed up lua paths after trying to set up debugging尝试设置调试后弄乱了lua路径
【发布时间】:2019-10-15 17:25:17
【问题描述】:

我想通过大型 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_PATHLUA_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_PATH 和 LUA_CPATH?因为无需我指定任何路径,它就可以正常工作。

【问题讨论】:

  • 构建确实需要很长时间。我已经等了大约 20 分钟来验证它:将./?.so 添加到LUA_CPATH,似乎运行脚本将目录更改为base/build/...,这是您的路径和默认路径之间唯一有意义的区别。一旦我可以验证它,我会留下答案。

标签: debugging lua zerobrane


【解决方案1】:

两个路径的默认值都位于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"

【讨论】:

  • 太棒了,谢谢。 (非常感谢您实际构建回购。确实需要很长时间:D)
【解决方案2】:

您的代码正在尝试加载库libkoreader-lfs,在LUA_CPATHLUA_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"

【讨论】:

  • 我也试过了。但这没有什么区别。事实上,在脚本执行之前,LUA_PATH 并不存在。我认为这是 lua 特有的。
  • 您没有显示正在运行的整个脚本。例如,您的 package.cpath 包括 common/?.socommon?.dll 路径,但错误消息中均未显示它们。您能否显示只包含设置路径/cpath 和 require 命令失败的 整个 脚本?另外,您尝试加载的模块相对于您正在运行的脚本的实际位置是什么?
  • 这是一个庞大的现有代码库,而不仅仅是一个脚本。我不清楚什么时候执行的。代码在这里github.com/koreader/koreader 也许这个结构对 lua 专业人士来说是有意义的。但我不能只给你相关的sn-ps。我不知道会是哪一个。
猜你喜欢
  • 2017-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-15
  • 1970-01-01
  • 1970-01-01
  • 2011-03-12
  • 1970-01-01
相关资源
最近更新 更多