Valgrind 的交叉编译与使用

关于 valgrind 就不详加介绍了,它大致的原理是模拟一个 CPU 环境,并提供服务给其他工具,其他工具则类似于插件,利用内核提供的服务完成各种特定的内存调试任务。

本文记录的应用场景是使用 Valgrind 调试嵌入式平台(目标系统)如 aarch64 下的应用,宿主系统的环境是 Linux X64。首先获取 Valgrind 的源码,在宿主机上交叉编译:

注:这里的 –host 参数指定的是目标系统的架构, –prefix 参数指定软件的安装路径。

然后将编译好的 valgrind 拷贝到目标机上,如果拷贝到目标机上的路径和上面编译时指定的 –prefix 不一致,运行时需要设置 valgrind 运行时的 LIB 路径:

接下来就可以利用 valgrind 调试内存问题了。调用 Valgrind 的通用格式是:

Valgrind 内置一些很强大的工具。默认使用的是 memcheck,可以通过 “–tool=tool name” 指定使用其他工具。

  • memcheck:    重量级的内存检查器,能够发现绝大多数内存错误使用情况;
  • callgrind:       用来检查程序中函数调用过程中出现的问题;
  • cachegrind:   用来检查程序中缓存使用出现的问题;
  • helgrind:        用来检查多线程程序中出现的竞争问题;
  • massif:            用来检查程序中堆栈使用中出现的问题;
  • extension:      可利用 core 提供的功能自己编写内存调试工具;

Valgrind 的参数分两类,一类是 core 的参数,它对所有的工具都适用;另一类是具体某个工具如 memcheck 的参数。

(关于如何使用 Valgrind 进行内存分析,后续待补充。)

参考:

DirectFB 快速入门

DirectFB(简称 DFB)

参考:

使用 uWSGI 和 Nginx 部署 Flask 应用

Step 0: 准备工作

  • 安装并配置 Nginx,可以参考这篇教程
  • 在 DNS 配置里加入一条 A 记录,将你的域名指向你的 IP,适用于子域名配置;

Step 1: 安装 Pip 包管理器

Setp 2: 创建 Python 虚拟环境

Python 虚拟环境有助于将不同的应用之间的 python 环境隔离;用于创建和管理虚拟环境的模块为 venv

创建项目目录并为其创建虚拟化环境

激活上面创建的虚拟化环境

Step 3: 创建 Flask 应用

安装 wheel 包,以支持 wheel(.whl) 打包格式

然后,再安装 Flask 和 uWSGI

创建 Flask Demo 应用

测试新创建的 Flask 应用

通过浏览器访问 http://server-domain-or-ip:5000 将会看到页面

Flask sample app

在控制台 CTRL-C 可以结束上面的 Server

创建 WSGI 网关

Step 4: 配置 uWSGI

直接使用 python app.py 运行服务的方式只适合本地开发,线上运行时要保证更高的性能和稳定性,需要使用 uwsgi 进行部署。

使用 uwsgi 部署 Flask 只需要换一种命令来启动服务即可

  • –socket 0.0.0.0:5000:指定暴露端口号为 5000
  • –protocol=http:使用 http 协议
  • -w wsgi:app:-w 指明了要启动的模块,wsgi 就是项目启动文件 wsgi.py 去掉扩展名,app 是 wsgi.py 文件中的变量 app,即 Flask 实例

启动完成后,在任意网络连通的机器上打开浏览器,并访问 http://server-domain-or-ip:5000 将再次看到同样结果

Flask sample app

关掉控制台,并退出虚拟环境

创建 uWSGI配置文件

Step 5: 创建 Systemd Service 配置文件

启动上面 uWSGI 服务,并让其开机自动启动

Step 6: 配置 Nginx,反向代理 uWSGI 请求

新创建一个 nginx server 配置项,通过 uwsgi_pass 将请求传递给我们在 app.ini 中配置文件指定创建的 socket

要启用该 server 配置,只要需要将其符号连接到 sites-enabled 目录:

检查新加的 nginx 配置文件是否有语法错误

重启 nginx 服务项

重启完成后,由于 Nginx 本身监听的端口是 80 端口,因此我们可以直接访问域名或者机器 IP 进行访问。

Flask sample app

参考文章

How To Serve Flask Applications with uWSGI and Nginx on Ubuntu 18.04