vscode远程调试openrestry,linux安装gcc,glibc

参考资料

centos编译安装gcc 10:https://xujinzh.github.io/2021/02/03/centos-install-gcc/

CentOs下安装gcc/g++/gdb的方法:https://cloud.tencent.com/developer/beta/article/1720891

vscode调试插件安装:https://vscode-debug-specs.github.io/cpp/

glibc升级到:https://www.jianshu.com/p/f4d603967e1d

查看gcc对应版本对应的库文件版本:https://stackoverflow.com/questions/56781513/understanding-the-gcc-version-and-the-glibc-glibcxx-versions-in-more-detail

问题

调试lua脚本的时候,需要使用gdb进行debug。

解决方案

要按照上面的步骤来安装对应的软件,主要分以下几步:

安装vscode插件

  1. 安装 c/c++插件
  2. 安装 emmylua插件

设置vscode的debug配置

里面的路径记得修改成自己的

  1. launch.json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "emmylua_new",
"request": "launch",
"name": "EmmyLua New Debug",
"host": "localhost",
"port": 9966,
"ext": [
".lua",
".lua.txt",
".lua.bytes"
],
"ideConnectDebugger": false
},
{
"name": "Open Resty",
"type": "cppdbg",
"request": "launch",
"program": "/usr/local/openresty/bin/openresty",//需要配置
"cwd": "/usr/local/openresty/nginx/html",
"args": ["-c", "/usr/local/openresty/nginx/conf/nginx.conf"],
"stopAtEntry": false,
"environment": [],
"externalConsole": false,//可以配置,这边不能搞成true
"MIMode": "gdb",
"miDebuggerPath": "/usr/bin/gdb",
}
]
}
  1. nginx.conf 的http节点下面添加emmylua初始化的文件路径,这样:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#user  nobody;
worker_processes 1;

events {
worker_connections 1024;
}

# !!!这两个不能少,远程调试的时候,openrestry进程不能后台运行,不然debug断不下来
daemon off;
master_process off;

http {
include mime.types;
default_type application/octet-stream;

# !!!这里是引入一个lua脚本,目的是启动一个emmy_core调试器,监听端口为上面配置里面的9966
init_by_lua_file /usr/local/openresty/nginx/lua/init.lua;

#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';

#access_log logs/access.log main;

sendfile on;
#tcp_nopush on;

#keepalive_timeout 0;
keepalive_timeout 65;

#gzip on;

server {
listen 80;
server_name localhost;

#charset koi8-r;

#access_log logs/host.access.log main;

location / {
root html;
index index.html index.htm;
}

location = /example {
# 这里可以随便写lua脚本了。调试器会针对lua后缀动态调试
rewrite_by_lua_file /usr/local/openresty/nginx/lua/auth.lua;
content_by_lua_file /usr/local/openresty/nginx/lua/auth.lua;
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}

  1. init.lua 文件的内容长这样:
    1
    2
    3
    4
    5
    package.cpath = package.cpath .. ";/root/.vscode-server/extensions/tangzx.emmylua-0.5.13/debugger/emmy/linux/emmy_core.so"
    -- 这边引入了emmy_core,我们重新编译的就是这个
    local dbg = require("emmy_core")
    -- 连接到emmy debugger监听的端口
    dbg.tcpConnect("localhost", 9966)

4 调试

先启动emmylua,再启动openrestry

碰到的问题

找不到 GLIBCXX_3.4.29

1
2
3
4
5
6
nginx: [error] init_by_lua_file error: error loading module 'emmy_core' from file '/root/.vscode-server/extensions/tangzx.emmylua-0.5.13/debugger/emmy/linux/emmy_core.so':
/lib64/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /root/.vscode-server/extensions/tangzx.emmylua-0.5.13/debugger/emmy/linux/emmy_core.so)
stack traceback:
[C]: at 0x7ffff7fce9f0
[C]: in function 'require'
/usr/local/openresty/nginx/lua/init.lua:3: in main chunk

20230510154621

查看libc的已安装版本:

1
strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX

20230510154012

解决办法: 就是升级gcc版本,安装新的glibc库了。

  1. 远程服务器编译比较新的版本的gcc

安装的gcc版本尽量新一些,保证emmylua依赖的库文件在系统中可以找到。我这里选择安装了10版本的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
yum -y install wget bzip2 gcc gcc-c++ glibc-headers

wget -c http://ftp.gnu.org/gnu/gcc/gcc-10.1.0/gcc-10.1.0.tar.gz

cd /root/gcc-10.1.0

# 下载依赖包
./contrib/download_prerequisites

# 创建文件夹,存储编译中产生的临时文件
mkdir build
cd build/

# 配置编译
../configure --prefix=/usr/local/gcc-10.1.0 --enable-bootstrap --enable-checking=release --enable-languages=c,c++ --disable-multilib

# 进行编译,只能进程数能够加速(这一步花的时间比较多,可以先干点其他事情)
make -j 8

# 安装,大约3-5分钟左右
make install

# 配置为默认 gcc
echo -e '\nexport PATH=/usr/local/gcc-10.1.0/bin:$PATH\n' >> /etc/profile.d/gcc.sh && source /etc/profile.d/gcc.sh
ln -sv /usr/local/gcc-10.1.0/include/ /usr/include/gcc

# 配置生效
ldconfig -v

# 导出验证
ldconfig -p | grep gcc

# 查看 gcc 版本号
gcc -v

20230510145208

20230510144020

  1. 升级完gcc之后,安装新版本的glibc:

在CentOS中安装glibc可以通过以下步骤完成:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 1. 更新系统:
sudo yum update

# 2. 安装依赖包:
sudo yum install -y wget tar gzip make gcc gcc-c++

# 3. 下载glibc源代码包,例如下载最新版本的glibc 2.33:
sudo mkdir /opt/glibc-2.33
cd /opt/glibc-2.33
sudo wget http://ftp.gnu.org/gnu/glibc/glibc-2.33.tar.gz

# 4. 解压glibc源代码包,并进入解压后的目录。
sudo tar zxvf glibc-2.33.tar.gz
cd glibc-2.33

# 5. 创建编译目录:
mkdir build
cd build

# 6. 在编译目录中使用cmake生成Makefile文件:
sudo ../configure --prefix=/usr

# 7. 继续运行make命令进行编译:
sudo make

# 8. 提权并安装glibc:
sudo su
make install

# 9. 确认已经安装成功, 可以查看当前安装的glibc版本号:
ldd --version

提示:由于glibc是C语言标准库,是整个系统的基础,因此升级glibc需要谨慎。不正确的操作可能会导致系统软件出现异常甚至无法启动的情况。建议在操作之前备份数据和系统镜像并做好相关风险评估和恢复措施。

最终解决:自己编译emmy-core调试器

升级gcc之后,依旧报其他库找不到的错误。只能拿源码,自己编译一份适合我的机器的版本了。

上面操作都做了之后,发现10.1版本的gcc依旧没有新的 GLIBCXX_3.4.29。如果升级最新的gcc编译器的话,又得大半个小时,而且不一定能用。所以这里直接采用编译 emmylua调试器 的源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

cd /root

git clone https://github.com/EmmyLua/EmmyLuaDebugger.git

cd EmmyLuaDebugger/

cmake .

make && make install

# 这个目录在vscode中安装了扩展后就会有
mv /root/.vscode-server/extensions/tangzx.emmylua-0.5.3/debugger/emmy/linux/emmy_core.so /root/.vscode-server/extensions/tangzx.emmylua-0.5.3/debugger/emmy/linux/emmy_core.so.bak

cd emmy_core/

cp emmy_core.so /root/.vscode-server/extensions/tangzx.emmylua-0.5.3/debugger/emmy/linux

ps: 上面在make的时候,如果发现cmake版本太低,可以直接下载一个linux版本的最新cmake工具,不用自己编译,下载下来直接用新版本cmake执行操作。