Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

bad light userdata pointer #914

Closed
wangzhankun opened this issue Aug 1, 2020 · 26 comments
Closed

bad light userdata pointer #914

wangzhankun opened this issue Aug 1, 2020 · 26 comments
Labels
Milestone

Comments

@wangzhankun
Copy link
Contributor

wangzhankun commented Aug 1, 2020

注:提问题时若使用不能用/没效果/有问题/报错此类模糊表达,但又没有根据下面的模板给出任何相关辅助信息的,将会直接标记为Invalid。

描述问题

当执行bash <(curl -fsSL https://xmake.io/shget.text)进行xmake编译时遇到下面的问题:
image

我在其他地方见到了类似的错误torch/torch7#1035neovim/neovim#7879

从这两个帖子可以看出来应该是lua的问题,但是我不确定该怎么处理,不确定xmake是否可以避免该问题。如果不可以的是否有什么方法可以将xmake的工程转成cmake之类的工程的命令吗?

期待的结果

可以在ubuntu18.04 server aarch64上正常安装xmake。

相关环境

  • 树莓派4b
  • ubuntu server18.04
  • Linux ubuntu 5.3.0-1017-raspi2 18.04.1-Ubuntu SMP Fri Jan 17 11:14:07 UTC 2020 aarch64 aarch64 aarch64 GNU/Linux
@waruqi
Copy link
Member

waruqi commented Aug 1, 2020

哦 你是 arm64的linux,这个之前可以 只不过好久没测了,可能后来bytecode的改动导致了问题,你可以先其他机器上 xmake project -k cmake 生成cmakelists来编译试试

我现在没环境,等部署好环境我才能测试下。

@waruqi waruqi added this to the v2.3.7 milestone Aug 1, 2020
@waruqi
Copy link
Member

waruqi commented Aug 1, 2020

你可以先自己拉取代码编译装,跳过bytecode gen应该是可以过掉这个问题的 你先试试

git clone https://github.com/xmake-io/xmake.git
cd ./xmake
git submodule update --init
make build
make install

@wangzhankun
Copy link
Contributor Author

你可以先自己拉取代码编译装,跳过bytecode gen应该是可以过掉这个问题的 你先试试

git clone https://github.com/xmake-io/xmake.git
cd ./xmake
git submodule update --init
make build
make install

可以正常安装,但是无法运行。
image

@waruqi
Copy link
Member

waruqi commented Aug 2, 2020

那等周一我再看下,现在我没arm64的环境

@waruqi
Copy link
Member

waruqi commented Aug 2, 2020

看着跟arm64下 linux kernel 的虚拟地址超过48bits 存储到lightdata之后会出问题,一些相关workaround方案:

LuaJIT/LuaJIT#230
https://github.com/LuaJIT/LuaJIT/pull/245/files
debayang/lua-nginx-module@543a722
zhaozg/luv@43f120c

不过我搞了个ubuntu arm64的环境,似乎一切正常,可以正常安装运行,还是没法复现问题。。我得先尝试复现下 才能想办法看看怎么修复。

@wangzhankun
Copy link
Contributor Author

好的,我明天看一下解决方案。我这个平台感觉还不完全是arm64的架构,因为我在jetson nano上是正常的。jetson nano是完全正常的arm64架构。树莓派的话,我在raspberry pi官方32位系统上是完全正常的。但是rasbian系统对多线程支持度不好,所以重新刷入了Ubuntu server18.04 64位的系统,然后就出问题了。你要不尝试在qemu下仿真一下树莓派4用Ubuntu server引导一下。

@wangzhankun
Copy link
Contributor Author

看着跟arm64下 linux kernel 的虚拟地址超过48bits 存储到lightdata之后会出问题,一些相关workaround方案:

LuaJIT/LuaJIT#230
https://github.com/LuaJIT/LuaJIT/pull/245/files
debayang/lua-nginx-module@543a722
zhaozg/luv@43f120c

不过我搞了个ubuntu arm64的环境,似乎一切正常,可以正常安装运行,还是没法复现问题。。我得先尝试复现下 才能想办法看看怎么修复。

要不你试下ubuntu server 18.04吧,下载页面
image

@waruqi
Copy link
Member

waruqi commented Aug 3, 2020

感觉好折腾,暂时没这么多时间捣鼓环境,如果有直接可用的docker image就好了,等回头有时间我再看看吧。

@waruqi
Copy link
Member

waruqi commented Aug 3, 2020

我在raspi64分支加了点log,先确认下到底是哪几处lua_pushlightuserdata处理的pointer超过了 47bits,我回头直接改好了。折腾环境太浪费时间了

git fetch origin raspi64
git checkout raspi64
make build
source ./script/srcenv.profile    <-- 直接加载本地源码编译的xmake环境,无需安装,这里面也会执行 xmake --version 应该就会报错
xmake --version 

然后把所有log发我看下。

@wangzhankun
Copy link
Contributor Author

这个是执行source scripts/srcenv.profile的报错:

[xmake]: [file_open]: xm_io_file_open: lua_pushlightuserdata: 0xaaaad75802b0
error: bad light userdata pointer
[xmake]: [file_open]: xm_io_file_open: lua_pushlightuserdata: 0xaaaae553e2b0
error: bad light userdata pointer
[xmake]: [file_open]: xm_io_file_open: lua_pushlightuserdata: 0xaaaae01852b0
error: bad light userdata pointer

@wangzhankun
Copy link
Contributor Author

wangzhankun commented Aug 3, 2020

我这里找到了一个qemu的脚本测试通过了。在系统里面尝试安装xmake碰到了相同的问题。

sudo apt-get install cloud-image-utils qemu-system-arm qemu-efi

# Get the image.
img=ubuntu-18.04-server-cloudimg-arm64.img
if [ ! -f "$img" ]; then
  wget "https://cloud-images.ubuntu.com/releases/18.04/release/${img}"
  qemu-img resize "$img" +128G
fi

# For the password.
user_data=user-data.img
if [ ! -f "$user_data" ]; then
  cat >user-data <<EOF
#cloud-config
password: asdfqwer
chpasswd: { expire: False }
ssh_pwauth: True
EOF
  cloud-localds "$user_data" user-data

  # Use the EFI magic. Picked up from:
  # https://wiki.ubuntu.com/ARM64/QEMU
  dd if=/dev/zero of=flash0.img bs=1M count=64
  dd if=/usr/share/qemu-efi/QEMU_EFI.fd of=flash0.img conv=notrunc
  dd if=/dev/zero of=flash1.img bs=1M count=64
fi

qemu-system-aarch64 \
  -M virt \
  -cpu cortex-a57 \
  -device rtl8139,netdev=net0 \
  -m 4096 \
  -netdev user,id=net0 \
  -nographic \
  -smp 4 \
  -drive "if=none,file=${img},id=hd0" \
  -device virtio-blk-device,drive=hd0 \
  -drive "file=${user_data},format=raw" \
  -pflash flash0.img \
  -pflash flash1.img \
;

直接执行运行即可。我在ubuntu18.04下执行通过了。登录的账号是ubuntu,密码是asdfqwer

@waruqi
Copy link
Member

waruqi commented Aug 3, 2020

我这里是mac环境,这个脚本跑不起来,cloud-localds没这命令,user-data.img也没有, QEMU_EFI.fd我倒是下了一个。不过mac的dd也跟linux的不同,反正改动还挺多,就不折腾了。。

大概我也知道了,反正是pointer值过大的问题,xmake里面就那么几处用了lightuserdata,回头我改下就好

@waruqi
Copy link
Member

waruqi commented Aug 3, 2020

这块牵扯的东西还比较多,可能要花点时间改下 等改完你再试试

@waruqi
Copy link
Member

waruqi commented Aug 4, 2020

我改了下,应该可以了的,你拉下dev分支源码安装下试试,我对lua_pushlightuserdata做了层workaround wrap,但仅对于47bits高地址pointer生效,所以平常的arm64/x86_64设备基本上还是走原来的逻辑。

只有部分存在高地址的aarch64设备才会切到workaround模式。

static __tb_inline__ tb_void_t xm_lua_pushpointer(lua_State* lua, tb_pointer_t ptr)
{
tb_uint64_t ptrval = (tb_uint64_t)ptr;
if ((ptrval >> 47) == 0)
lua_pushlightuserdata(lua, ptr);
else
{
tb_char_t str[64];
tb_long_t len = tb_snprintf(str, sizeof(str), "%p", ptr);
lua_pushlstring(lua, str, len);
}
}
static __tb_inline__ tb_bool_t xm_lua_ispointer(lua_State* lua, tb_int_t idx)
{
return lua_isuserdata(lua, idx) || lua_isstring(lua, idx);
}
static __tb_inline__ tb_pointer_t xm_lua_topointer2(lua_State* lua, tb_int_t idx, tb_char_t const** pstr)
{
tb_pointer_t ptr = tb_null;
if (lua_isuserdata(lua, idx))
{
ptr = lua_touserdata(lua, idx);
if (pstr) *pstr = tb_null;
}
else
{
size_t len = 0;
tb_char_t const* str = luaL_checklstring(lua, idx, &len);
if (str && len > 2 && str[0] == '0' && str[1] == 'x')
ptr = (tb_pointer_t)tb_s16tou64(str);
if (pstr) *pstr = str;
}
return ptr;
}
static __tb_inline__ tb_pointer_t xm_lua_topointer(lua_State* lua, tb_int_t idx)
{
return xm_lua_topointer2(lua, idx, tb_null);
}

@waruqi waruqi added bug and removed improvement labels Aug 4, 2020
@wangzhankun
Copy link
Contributor Author

非常感谢,现在测试成功了。有一个其他的问题,就是为啥我进行编译的时候总是提醒我要安装openssl呢,而我没有用到相关的内容。

@waruqi
Copy link
Member

waruqi commented Aug 4, 2020

非常感谢,现在测试成功了。有一个其他的问题,就是为啥我进行编译的时候总是提醒我要安装openssl呢,而我没有用到相关的内容。

那是因为你执行的是 get.sh 那个一键安装脚本,这个会自动安装一些build需要的基础依赖,比如git, gcc啥的,可能git啥的内部依赖带上了openssl吧。。

{ apt --version >/dev/null 2>&1 && $sudoprefix apt install -y git build-essential libreadline-dev ccache; } ||

@wangzhankun
Copy link
Contributor Author

是这样的,就是我在输入xmake编译我的项目的过程中出现的,而且导出cmakelists之后也是会有openssl的链接,但是我并没有用到过,我把cmakelists里面的openssl删除掉之后也是可以正常编译的,因为我的项目确实没有用到这个库,在xmake.lua里面也没有添加openssl。原来在其他平台上我都是输入n不安装,但是今天我在树莓派上编译的时候不安装的话不能正常编译。感觉这个又跟平台没啥关系。因为我在x86_64平台下遇到相同的问题,而且会提醒我安装opencv4,因为我用到了这个动态库,但是我在本地已经自行编译安装过了。

@waruqi
Copy link
Member

waruqi commented Aug 4, 2020

那就要看你add_requires加了哪些依赖库了 有些依赖库内部会依赖openssl

@waruqi
Copy link
Member

waruqi commented Aug 4, 2020

这是另外一个问题 如果觉得有问题 那就提个issues

@wangzhankun
Copy link
Contributor Author

好的,谢谢

@waruqi
Copy link
Member

waruqi commented Sep 30, 2020

这两天,luajit作者终于修掉这个问题了 LuaJIT/LuaJIT@e9af1abec54

不必再用workaround方案了,不过要升级下luajit才行,前阵子刚升级了一遍,蛋疼~

等回头空了,我再升级一波好了

@waruqi
Copy link
Member

waruqi commented Oct 1, 2020

我升级了luajit 并且去除了之前的workaround patch,你可以再更新到dev试试,应该还是可以正常运行的

@wangzhankun
Copy link
Contributor Author

好的,感谢。等过两天回学校试一下

@wangzhankun
Copy link
Contributor Author

我升级了luajit 并且去除了之前的workaround patch,你可以再更新到dev试试,应该还是可以正常运行的

好的,感谢。Dev分支我重新编译了一下是可以正常编译安装的

@waruqi
Copy link
Member

waruqi commented Oct 9, 2020

arm64上运行也正常吗?

@wangzhankun
Copy link
Contributor Author

是的,在树莓派4b上跑的,OS是ubuntu server18.04

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants