nwjs arm64 prebuild
结论: nwjs在postmarketos(alpine linux, pixel3手机)下 , 因 alpine 基于musl libc而非gnu的glibc, 导致nwjs运行Segmentation fault
LeonardLaszlo/nw.js-armv7-binaries.git : 貌似他提供了编译脚本
uname -a
# Linux pixel3 6.13.0-rc2-sdm845 #2-postmarketos-qcom-sdm845 SMP PREEMPT Fri Jan 3 13:31:22 UTC aarch64 Linux
wget https://github.com/LeonardLaszlo/nw.js-armv7-binaries/releases/download/nw60-arm64_2022-01-08/nw60-arm64_2022-01-08.tar.gz
tar -xf nw60-arm64_2022-01-08.tar.gz
cd usr/docker/dist/nwjs-chromium-ffmpeg-branding/
ls
# nw-headers-v0.60.1.tar.gz nwjs-symbol-v0.60.1-linux-arm64.tar.gz nwjs-v0.60.1-linux-arm64.tar.gz
tar -xf nwjs-v0.60.1-linux-arm64.tar.gz
cd nwjs-v0.60.1-linux-arm64/
pwd #== ~/usr/docker/dist/nwjs-chromium-ffmpeg-branding/nwjs-v0.60.1-linux-arm64
ls
#chrome_crashpad_handler icudtl.dat locales nw_100_percent.pak resources.pak #v8_context_snapshot.bin
#credits.html lib/ nw nw_200_percent.pak swiftshader
file nw
#nw: ELF 64-bit LSB pie executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, for GNU/Linux 3.7.0, BuildID[xxHash]=b58328d16786d96e, stripped
file `which bash`
#/bin/bash: ELF 64-bit LSB pie executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-musl-aarch64.so.1, BuildID[sha1]=ab69421af288153e84b94ef1d60a58e30cc94a14, stripped
#解释器不同, 直接运行 报错 找不到命令, 解决:
sudo ln -s /lib/ld-musl-aarch64.so.1 /lib/ld-linux-aarch64.so.1
export LD_LIBRARY_PATH=/home/z/usr/docker/dist/nwjs-chromium-ffmpeg-branding/nwjs-v0.
60.1-linux-arm64/lib/
./nw #报错 一大堆 找不到符号, 见下段
alpine linux貌似不是gnu的? alpine Running_glibc_programs
alpine 使用的是 轻量级 mul libc , 而 debian|ubuntu|redhat等使用的是gnu 的重量级 glibc
很显然 nw应该是基于 gnu的glibc
而 alpine / gcompat 估计是想模拟 glibc, 因为 没有再报符号找不到 ,
而是直接 Segmentation fault ,说明 模拟不稳定
sudo apk add gcompat
./nw # Segmentation fault
./nw
报错
Error relocating /home/z/usr/docker/dist/nwjs-chromium-ffmpeg-branding/nwjs-v0.60.1-linux-arm64/lib/libnw.so: __vsnprintf_chk: symbol not found
Error relocating /home/z/usr/docker/dist/nwjs-chromium-ffmpeg-branding/nwjs-v0.60.1-linux-arm64/lib/libnw.so: __memcpy_chk: symbol not found
Error relocating /home/z/usr/docker/dist/nwjs-chromium-ffmpeg-branding/nwjs-v0.60.1-linux-arm64/lib/libnw.so: __res_nclose: symbol not found
Error relocating /home/z/usr/docker/dist/nwjs-chromium-ffmpeg-branding/nwjs-v0.60.1-linux-arm64/lib/libnw.so: __res_ninit: symbol not found
Error relocating /home/z/usr/docker/dist/nwjs-chromium-ffmpeg-branding/nwjs-v0.60.1-linux-arm64/lib/libnw.so: __memset_chk: symbol not found
Error relocating /home/z/usr/docker/dist/nwjs-chromium-ffmpeg-branding/nwjs-v0.60.1-linux-arm64/lib/libnw.so: __memmove_chk: symbol not found
Error relocating /home/z/usr/docker/dist/nwjs-chromium-ffmpeg-branding/nwjs-v0.60.1-linux-arm64/lib/libnw.so: __vfprintf_chk: symbol not found
Error relocating /home/z/usr/docker/dist/nwjs-chromium-ffmpeg-branding/nwjs-v0.60.1-linux-arm64/lib/libnw.so: __longjmp_chk: symbol not found
Error relocating /home/z/usr/docker/dist/nwjs-chromium-ffmpeg-branding/nwjs-v0.60.1-linux-arm64/lib/libnw.so: gnu_get_libc_version: symbol not found
Error relocating /home/z/usr/docker/dist/nwjs-chromium-ffmpeg-branding/nwjs-v0.60.1-linux-arm64/lib/libnw.so: __fdelt_chk: symbol not found
Error relocating /home/z/usr/docker/dist/nwjs-chromium-ffmpeg-branding/nwjs-v0.60.1-linux-arm64/lib/libnw.so: __strncat_chk: symbol not found
Error relocating /home/z/usr/docker/dist/nwjs-chromium-ffmpeg-branding/nwjs-v0.60.1-linux-arm64/lib/libnw.so: mallinfo: symbol not found
Error relocating /home/z/usr/docker/dist/nwjs-chromium-ffmpeg-branding/nwjs-v0.60.1-linux-arm64/lib/libnw.so: __sched_cpualloc: symbol not found
Error relocating /home/z/usr/docker/dist/nwjs-chromium-ffmpeg-branding/nwjs-v0.60.1-linux-arm64/lib/libnw.so: __sched_cpufree: symbol not found
Error relocating /home/z/usr/docker/dist/nwjs-chromium-ffmpeg-branding/nwjs-v0.60.1-linux-arm64/lib/libnw.so: __close: symbol not found
Error relocating /home/z/usr/docker/dist/nwjs-chromium-ffmpeg-branding/nwjs-v0.60.1-linux-arm64/lib/libnw.so: __libc_malloc: symbol not found
Error relocating /home/z/usr/docker/dist/nwjs-chromium-ffmpeg-branding/nwjs-v0.60.1-linux-arm64/lib/libnw.so: __libc_calloc: symbol not found
Error relocating /home/z/usr/docker/dist/nwjs-chromium-ffmpeg-branding/nwjs-v0.60.1-linux-arm64/lib/libnw.so: __libc_memalign: symbol not found
Error relocating /home/z/usr/docker/dist/nwjs-chromium-ffmpeg-branding/nwjs-v0.60.1-linux-arm64/lib/libnw.so: __libc_realloc: symbol not found
Error relocating /home/z/usr/docker/dist/nwjs-chromium-ffmpeg-branding/nwjs-v0.60.1-linux-arm64/lib/libnw.so: __libc_free: symbol not found
Error relocating /home/z/usr/docker/dist/nwjs-chromium-ffmpeg-branding/nwjs-v0.60.1-linux-arm64/lib/libnw.so: __fprintf_chk: symbol not found
Error relocating /home/z/usr/docker/dist/nwjs-chromium-ffmpeg-branding/nwjs-v0.60.1-linux-arm64/lib/libnw.so: __sprintf_chk: symbol not found
Error relocating /home/z/usr/docker/dist/nwjs-chromium-ffmpeg-branding/nwjs-v0.60.1-linux-arm64/lib/libnw.so: initstate_r: symbol not found
Error relocating /home/z/usr/docker/dist/nwjs-chromium-ffmpeg-branding/nwjs-v0.60.1-linux-arm64/lib/libnw.so: random_r: symbol not found
Error relocating /home/z/usr/docker/dist/nwjs-chromium-ffmpeg-branding/nwjs-v0.60.1-linux-arm64/lib/libnw.so: backtrace: symbol not found
Error relocating /home/z/usr/docker/dist/nwjs-chromium-ffmpeg-branding/nwjs-v0.60.1-linux-arm64/lib/libnw.so: backtrace_symbols: symbol not found
Error relocating /home/z/usr/docker/dist/nwjs-chromium-ffmpeg-branding/nwjs-v0.60.1-linux-arm64/lib/libnw.so: __mbrlen: symbol not found
Error relocating /home/z/usr/docker/dist/nwjs-chromium-ffmpeg-branding/nwjs-v0.60.1-linux-arm64/lib/libnw.so: strtoll_l: symbol not found
Error relocating /home/z/usr/docker/dist/nwjs-chromium-ffmpeg-branding/nwjs-v0.60.1-linux-arm64/lib/libnw.so: strtoull_l: symbol not found
Error relocating /home/z/usr/docker/dist/nwjs-chromium-ffmpeg-branding/nwjs-v0.60.1-linux-arm64/lib/libnw.so: __getauxval: symbol not found
Error relocating /home/z/usr/docker/dist/nwjs-chromium-ffmpeg-branding/nwjs-v0.60.1-linux-arm64/lib/libnw.so: __register_atfork: symbol not found
Error relocating /home/z/usr/docker/dist/nwjs-chromium-ffmpeg-branding/nwjs-v0.60.1-linux-arm64/lib/libnw.so: __longjmp_chk: symbol not found
Error relocating /home/z/usr/docker/dist/nwjs-chromium-ffmpeg-branding/nwjs-v0.60.1-linux-arm64/lib/libnw.so: __libc_stack_end: symbol not found
Error relocating /home/z/usr/docker/dist/nwjs-chromium-ffmpeg-branding/nwjs-v0.60.1-linux-arm64/lib/libffmpeg.so: __mbrlen: symbol not found
Error relocating /home/z/usr/docker/dist/nwjs-chromium-ffmpeg-branding/nwjs-v0.60.1-linux-arm64/lib/libffmpeg.so: strtoll_l: symbol not found
Error relocating /home/z/usr/docker/dist/nwjs-chromium-ffmpeg-branding/nwjs-v0.60.1-linux-arm64/lib/libffmpeg.so: strtoull_l: symbol not found
Error relocating /home/z/usr/docker/dist/nwjs-chromium-ffmpeg-branding/nwjs-v0.60.1-linux-arm64/lib/libffmpeg.so: __getauxval: symbol not found
Error relocating ./nw: __libc_malloc: symbol not found
Error relocating ./nw: __libc_calloc: symbol not found
Error relocating ./nw: __libc_memalign: symbol not found
Error relocating ./nw: __libc_realloc: symbol not found
Error relocating ./nw: __libc_free: symbol not found
Error relocating ./nw: __mbrlen: symbol not found
Error relocating ./nw: strtoll_l: symbol not found
Error relocating ./nw: strtoull_l: symbol not found
Error relocating ./nw: __getauxval: symbol not found
-1. nwjs在低版本ubuntu运行情况
ubuntu16.04运行nw-v0.93或0.89报错找不到NSS_3.30、GLIBC_2.25
uname -a
#Linux Asus 4.15.0-112-generic #113~16.04.1-Ubuntu SMP Fri Jul 10 04:37:08 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
cat /etc/issue
#Ubuntu 16.04.7 LTS \n \l
/app/nwjs-sdk-v0.93.0-linux-x64/nw
#nw: /usr/lib/x86_64-linux-gnu/libnss3.so: version `NSS_3.30' not found (required by /app/nwjs-sdk-v0.93.0-linux-x64/lib/libnw.so)
#nw: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.25' not found (required by /app/nwjs-sdk-v0.93.0-linux-x64/lib/libnw.so)
换成v0.89报错相同
ubuntu18.04正常运行nw-v0.93,但异常运行nw-v0.89(不崩溃但不出界面)
sudo apt install -y libatomic1
/app/nwjs-sdk-v0.93.0-linux-x64/nw #nw-v0.93正常运行
/app/nwjs-sdk-v0.89.0-linux-x64/nw #nw-v0.89运行: 不崩溃 但却不出界面
漰溃解决中
/app/nwjs-sdk-v0.89.0-linux-x64/nw --in-process-gpu --disable-gpu-sandbox --no-sandbox --url="https://i.youkuaiyun.com/#/user-center/profile"
#nw ... --disable-devtools
ubuntu18.04.6 TODO
0. nwjs崩溃复现
nwjs-v09.3崩溃复现
v0.93.0/nwjs-sdk-v0.93.0-linux-x64.tar.gz
/app5/nwjs-sdk-v0.93.0-linux-x64/nw --disable-gpu --url="https://i.youkuaiyun.com/#/user-center/profile"
#/app5/nwjs-sdk-v0.89.0-linux-x64/nw --disable-gpu --url="https://i.youkuaiyun.com/#/user-center/profile"
#即使添加 --ingore-gpu-blacklist 也会崩溃
#win10
#g:\nwjs-sdk-v0.93.0-win-x64\nw.exe --url="https://i.youkuaiyun.com/#/user-center/profile"
右击 --> 检查背景页 --> 漰溃
win10下也崩溃,这说明 这是nwjs自身问题,难道是他不允许这样操作?
ubuntu18.04以下版本的nwjs都可复现此崩溃(已知道nwjs-v0.89在win10下同样操作 正常运行 不会崩溃)
- nwjs-sdk-v0.39.3-linux-x64.tar.gz
- nwjs-sdk-v0.59.1-linux-x64.tar.gz
- nwjs-sdk-v0.79.1-linux-x64.tar.gz
- nwjs-sdk-v0.93.0-linux-x64.tar.gz
- nwjs-sdk-v0.49.2-linux-x64.tar.gz
- nwjs-sdk-v0.69.1-linux-x64.tar.gz
- nwjs-sdk-v0.89.0-linux-x64.tar.gz
ubuntu22.04下,只验证了nwjs-v0.89复现此崩溃,其他版本未验证,估计也一样崩溃
ubuntu18.04.6安装不到该机器(笔记本asus k43sd), 因此未验证
漰溃原因猜测
猜测 崩溃原因是 ubuntu22的开源显卡驱动程序Nouveau
被 google加入了黑名单, 但貌似--ingore-gpu-blacklist
可以禁止黑名单(也许禁止不了)
google搜索: Google 决定直接在 Chromium/Chrome 71 将 Nouveau 列入黑名单
漰溃时 控制台输出
[1119/201403.819553:ERROR:elf_dynamic_array_reader.h(64)] tag not found
[142199:142199:1119/201403.985775:ERROR:object_proxy.cc(576)] Failed to call method: org.freedesktop.ScreenSaver.GetActive: object_path= /org/freedesktop/ScreenSaver: org.freedesktop.DBus.Error.NotSupported: This method is not implemented
[1119/201414.914243:ERROR:elf_dynamic_array_reader.h(64)] tag not found
[1119/201414.914699:ERROR:elf_dynamic_array_reader.h(64)] tag not found
Received signal 11 SEGV_MAPERR 000000000258
#0 0x7893942d46be (/app5/nwjs-sdk-v0.93.0-linux-x64/lib/libnw.so+0x76d46bd)
#1 0x7893942e5601 (/app5/nwjs-sdk-v0.93.0-linux-x64/lib/libnw.so+0x76e5600)
#2 0x78938c842520 (/usr/lib/x86_64-linux-gnu/libc.so.6+0x4251f)
#3 0x789392e834da (/app5/nwjs-sdk-v0.93.0-linux-x64/lib/libnw.so+0x62834d9)
#4 0x789394ec5050 (/app5/nwjs-sdk-v0.93.0-linux-x64/lib/libnw.so+0x82c504f)
#5 0x78939671c3b7 (/app5/nwjs-sdk-v0.93.0-linux-x64/lib/libnw.so+0x9b1c3b6)
#6 0x78939671d487 (/app5/nwjs-sdk-v0.93.0-linux-x64/lib/libnw.so+0x9b1d486)
#7 0x78939670ba71 (/app5/nwjs-sdk-v0.93.0-linux-x64/lib/libnw.so+0x9b0ba70)
#8 0x78939670d3a3 (/app5/nwjs-sdk-v0.93.0-linux-x64/lib/libnw.so+0x9b0d3a2)
#9 0x78939670d0dd (/app5/nwjs-sdk-v0.93.0-linux-x64/lib/libnw.so+0x9b0d0dc)
#10 0x7893967a5dcc (/app5/nwjs-sdk-v0.93.0-linux-x64/lib/libnw.so+0x9ba5dcb)
#11 0x7893967d38be (/app5/nwjs-sdk-v0.93.0-linux-x64/lib/libnw.so+0x9bd38bd)
#12 0x789394fba99e (/app5/nwjs-sdk-v0.93.0-linux-x64/lib/libnw.so+0x83ba99d)
#13 0x789394fba751 (/app5/nwjs-sdk-v0.93.0-linux-x64/lib/libnw.so+0x83ba750)
#14 0x789394fbb473 (/app5/nwjs-sdk-v0.93.0-linux-x64/lib/libnw.so+0x83bb472)
#15 0x789394fbb8cc (/app5/nwjs-sdk-v0.93.0-linux-x64/lib/libnw.so+0x83bb8cb)
#16 0x789394fbb7a6 (/app5/nwjs-sdk-v0.93.0-linux-x64/lib/libnw.so+0x83bb7a5)
#17 0x7893965b5f2d (/app5/nwjs-sdk-v0.93.0-linux-x64/lib/libnw.so+0x99b5f2c)
#18 0x7893967d61b6 (/app5/nwjs-sdk-v0.93.0-linux-x64/lib/libnw.so+0x9bd61b5)
#19 0x789394fbf455 (/app5/nwjs-sdk-v0.93.0-linux-x64/lib/libnw.so+0x83bf454)
#20 0x78938fef98c8 (/app5/nwjs-sdk-v0.93.0-linux-x64/lib/libnw.so+0x32f98c7)
#21 0x78938fef95d7 (/app5/nwjs-sdk-v0.93.0-linux-x64/lib/libnw.so+0x32f95d6)
#22 0x78938fef993d (/app5/nwjs-sdk-v0.93.0-linux-x64/lib/libnw.so+0x32f993c)
#23 0x789394f8bfe9 (/app5/nwjs-sdk-v0.93.0-linux-x64/lib/libnw.so+0x838bfe8)
#24 0x789395c67707 (/app5/nwjs-sdk-v0.93.0-linux-x64/lib/libnw.so+0x9067706)
#25 0x789394f93284 (/app5/nwjs-sdk-v0.93.0-linux-x64/lib/libnw.so+0x8393283)
#26 0x789394f93071 (/app5/nwjs-sdk-v0.93.0-linux-x64/lib/libnw.so+0x8393070)
#27 0x789394f92c10 (/app5/nwjs-sdk-v0.93.0-linux-x64/lib/libnw.so+0x8392c0f)
#28 0x789395c6ab82 (/app5/nwjs-sdk-v0.93.0-linux-x64/lib/libnw.so+0x906ab81)
#29 0x78938cabbc44 g_main_context_dispatch
#30 0x0000000000fe <unknown>
#31 0x789394299130 (/app5/nwjs-sdk-v0.93.0-linux-x64/lib/libnw.so+0x769912f)
#32 0x78939425f80f (/app5/nwjs-sdk-v0.93.0-linux-x64/lib/libnw.so+0x765f80e)
#33 0x789391d2fbea (/app5/nwjs-sdk-v0.93.0-linux-x64/lib/libnw.so+0x512fbe9)
#34 0x789391d317d2 (/app5/nwjs-sdk-v0.93.0-linux-x64/lib/libnw.so+0x51317d1)
#35 0x789391d2d358 (/app5/nwjs-sdk-v0.93.0-linux-x64/lib/libnw.so+0x512d357)
#36 0x7893936f89f3 (/app5/nwjs-sdk-v0.93.0-linux-x64/lib/libnw.so+0x6af89f2)
#37 0x7893936f9efe (/app5/nwjs-sdk-v0.93.0-linux-x64/lib/libnw.so+0x6af9efd)
#38 0x7893936f9d46 (/app5/nwjs-sdk-v0.93.0-linux-x64/lib/libnw.so+0x6af9d45)
#39 0x7893936f7643 (/app5/nwjs-sdk-v0.93.0-linux-x64/lib/libnw.so+0x6af7642)
#40 0x7893936f7c47 (/app5/nwjs-sdk-v0.93.0-linux-x64/lib/libnw.so+0x6af7c46)
#41 0x78938f35d30f ChromeMain
#42 0x78938c829d90 (/usr/lib/x86_64-linux-gnu/libc.so.6+0x29d8f)
r8: 000000000000001f r9: 00005928041a64d8 r10: 0000000000000005 r11: 000000000000000a
r12: 0000592804719ca0 r13: 000059280520fd40 r14: 0000000000000000 r15: 00005928041cf940
di: 0000000000000000 si: 0000000000000000 bp: 00007ffe19ec1390 bx: 0000000000000003
dx: 0000000000000000 ax: 0000592804719ca0 cx: 00005928042ecf68 sp: 00007ffe19ec1390
ip: 000078938fd0d4f4 efl: 0000000000010202 cgf: 002b000000000033 erf: 0000000000000004
trp: 000000000000000e msk: 0000000000000000 cr2: 0000000000000258
[end of stack trace]
1 nwjs-控制台手动操纵
下载
下载页面/Previous Downloads(旧版下载)/v0.89.0/nwjs-sdk-v0.89.0-linux-x64.tar.gz
FUrl=https://dl.nwjs.io/v0.89.0/nwjs-sdk-v0.89.0-linux-x64.tar.gz
( cd /app5/pack/ && wget $FUrl ;)
tar -xf /app5/pack/nwjs-sdk-v0.89.0-linux-x64.tar.gz -C /app/
#产物形式 /app/nwjs-sdk-v0.89.0-linux-x64/bin/nw
js备忘
nwjs打开url
nw.Window.get().window.location="http://blog.youkuaiyun.com"
nwjs获得document
doc=nw.Window.get().window.document
nwjs执行xpath
//doc.evaluate(expr,contextNode,?resolver,?type,$inResult)
snap=doc.evaluate("//*",doc,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null)
const nodeLsA = Array.from({
length: snap.snapshotLength }, (_, k) => snap.snapshotItem(k));
const nodeLsB = [...Array(snap.snapshotLength).keys()].map(k=>snap.snapshotItem(k));
//A B写法是等效的
it=doc.evaluate("//*",doc,null,XPathResult.ORDERED_NODE_ITERATOR_TYPE,null)
//it.invalidIteratorState==true : 不合法的遍历器状态?
if(!it.invalidIteratorState){
//正常遍历it?
}
xp
nwjs的xpath函数封装
function xp(doc,xpath_str){
const snap=doc.evaluate(xpath_str,doc,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null);
const nodeLs = [...Array(snap.snapshotLength).keys()].map(k=>snap.snapshotItem(k));
return nodeLs;
}
nwjs的背景页控制台下调用
const allNode=xp(nw.Window.get().window.document,"//*");
nwjs的常规页控制台下调用
const allNode=xp(window.document,"//*");
页面按标签分组计数
函数cntGrpByTagName:按照个数从多到少排序
function cntGrpByTagName(doc){
const tagLs=xp(doc,"//*").map(e=>e.tagName);
const grp=Object.groupBy(tagLs,x=>x);
const entry_ls=Object.entries(grp).map