# postgresql-debug-memleak-detection **Repository Path**: wu-nuofan/postgresql-debug-memleak-detection ## Basic Information - **Project Name**: postgresql-debug-memleak-detection - **Description**: A comprehensive guide for building PostgreSQL from source with debug symbols and detecting memory leaks using Valgrind - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2025-11-19 - **Last Updated**: 2025-11-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # PostgreSQL Debug Build & Memory Leak Detection PostgreSQL源码DEBUG版本编译与常用接口内存泄漏检测实践 ## 项目概述 通过重新编译Postgre源码DEBUG版本,借助Valgrind,完成Debian12中Postgre常用接口的内存泄漏检测 ### 项目目标 检测Postgre接口内存泄漏问题,如果问题存在,则定位并解决内存泄漏问题 ### 技术栈与环境 - **PostgreSQL版本**: 18.1 - **操作系统**: Debian12 - **编译器**: g++ - **检测工具**: valgrind - **其他工具**: Makefile --- ## 环境准备 Debian12 ### 工具安装 #### Valgrind安装 ```bash sudo apt update sudo apt install -y valgrind ``` #### g++安装 ```bash sudo apt update sudo apt install -y g++ ``` #### 其他依赖 ```bash # 源码编译DEBUG相关依赖 sudo apt update sudo apt install -y build-essential libreadline-dev zlib1g-dev \ flex bison libxml2-dev libxslt1-dev \ libssl-dev libicu-dev pkg-config ``` --- ## PostgreSQL源码编译(DEBUG版本) ### 源码获取 ```bash # 下载源码 wget https://ftp.postgresql.org/pub/source/v18.1/postgresql-18.1.tar.gz tar -zxvf postgresql-18.1.tar.gz cd postgresql-18.1 ``` ### 配置编译选项 ```bash # 配置命令 cd postgresql-18.1 ./configure --enable-debug --enable-cassert CFLAGS="-O0 -g3" --prefix=安装路径/pgsql_debug ``` **配置参数说明**: - `--enable-debug`: 启用调试模式 - `--enable-cassert`: 启用断言检查(帮助发现bug) - `CFLAGS="-O0 -g"`: 关闭优化(-O0),最详细调试信息(-g3) - `--prefix`: 指定DEBUG版本相关内容的安装路径 ### 编译与安装 ```bash # 编译命令 make -j$(nproc) # 多核编译加速 # 安装命令 make install # 安装到指定目录 ``` ### 特别说明 本仓库中已提供有Postgre-18.1的源码以及编译好的DEBUG版本,上述源码获取和编译过程可选择跳过 ### 初始化数据库 ```bash # 初始化命令 # your_path为指定安装路径 your_path/pgsql_debug/bin/initdb -D your_path/pgdata # 初始化数据目录(首次) your_path/pgsql_debug/bin/pg_ctl -D your_path/pgdata start # 启动pgsql的服务端服务 ``` --- ## 内存泄漏检测实践 ### 检测工具介绍 #### Valgrind **基本用法**: ```bash valgrind --leak-check=full --show-leak-kinds=all 程序 ``` **主要参数说明**: --leak-check=full 输出每个泄漏的详细调用栈 --show-leak-kinds=all 检测所有的泄露类型:明确泄漏,可能泄漏,间接泄漏 #### 编写测试用例 相关常见接口的压力测试用例和特殊功能接口的测试用例已在仓库中提供:test_libpq pressure_test: 常见接口压力测试用例 further_leak_test: 特殊功能接口测试用例 --- ## 常用接口内存泄漏检测 ### 测试前说明 ```bash # 所有测试前,引入动态链接器相关环境变量 # your_path表示Postgre源码DEBUG版本的相关目录 export LD_LIBRARY_PATH=your_path/pgsql_debug/lib # 所有测试代码中用于连接的信息需要根据实际情况修改 # host:实际Postgre服务端IP(本地用localhost或127.0.0.1) # port:端口一般默认5432 # dbname:指定自身创建的数据库(默认使用postgres) # user:指定自身用户(默认可不指定) const char *conninfo = "host=localhost port=5432 dbname=test_db user=nodesbit"; ``` ### 接口1: PQconnectdb **功能说明**: 建立连接 **检测命令**: ```bash # Valgrind检测命令 cd test_libpq/pressure_test make valgrind --leak-check=full --show-leak-kinds=all ./link ``` **是否存在内存泄漏**: 不存在内存泄漏 --- ### 接口2: PQexec **功能说明**: 发起sql query **检测命令**: ```bash cd test_libpq/pressure_test make valgrind --leak-check=full --show-leak-kinds=all ./query ``` **是否存在内存泄漏**: 不存在内存泄漏 --- ### 接口3: PQconnectdb PQexec **功能说明**: 测试相关接口发生错误时,是否内存泄漏 **检测命令**: ```bash cd test_libpq/pressure_test make valgrind --leak-check=full --show-leak-kinds=all ./error ``` **是否存在内存泄漏**: 不存在内存泄漏 --- ### 接口4: PQprepare **功能说明**: 测试sql语句预编译接口 **检测命令**: ```bash cd test_libpq/pressure_test make valgrind --leak-check=full --show-leak-kinds=all ./prepare ``` **是否存在内存泄漏**: 不存在内存泄漏 --- ### 接口5: PQconnectdb **功能说明**: 启用ssl加密情况 **检测命令**: ```bash cd test_libpq/pressure_test make valgrind --leak-check=full --show-leak-kinds=all ./ssl ``` **是否存在内存泄漏**: 不存在内存泄漏 --- ### 接口6: PQconnectdb PQexec PQprepare PQexecPrepared **功能说明**: 测试接口混合情况 **检测命令**: ```bash cd test_libpq/pressure_test make valgrind --leak-check=full --show-leak-kinds=all ./mixed ``` **是否存在内存泄漏**: 不存在内存泄漏 --- ### 接口7: PQsendQuery PQgetResult **功能说明**: 测试异步查询 **检测命令**: ```bash cd test_libpq/further_leak_test make valgrind --leak-check=full --show-leak-kinds=all ./async ``` **是否存在内存泄漏**: 不存在内存泄漏 --- ### 接口8: PQexecParams **功能说明**: 测试多参数查询 **检测命令**: ```bash cd test_libpq/pressure_test make valgrind --leak-check=full --show-leak-kinds=all ./params ``` **是否存在内存泄漏**: 不存在内存泄漏 --- ### 接口9: PQexec **功能说明**: 同样测试PQexec接口,查询大数据结果 **检测命令**: ```bash cd test_libpq/pressure_test make valgrind --leak-check=full --show-leak-kinds=all ./bigres ``` **是否存在内存泄漏**: 不存在内存泄漏 --- ### 检测相关事项注意 1. PQconnectdb连接数据库:host,user,dbname这三个参数需要根据自己的设置修改 2. 实际测试前,需启动Postgre服务端,并完成用户和数据库的创建 3. 上述测试为单线程测试,多线程测试中保证连接资源线程独享,即不会出现并发问题,也同样不会出现内存泄漏 --- ## 参考资料 - [PostgreSQL官方文档](https://www.postgresql.org/docs/) - [Valgrind官方文档](https://valgrind.org/docs/manual/manual.html) --- ## 附录 ### 附录A: 常用命令速查 ```bash # PostgreSQL服务端 初始化数据库: yourpath/pgsql_debug/bin/initdb -D yourpath/pgdata 启动: yourpath/pgsql_debug/bin/pg_ctl -D yourpath/pgdata start 停止: yourpath/pgsql_debug/bin/pg_ctl stop 重启: yourpath/pgsql_debug/bin/pg_ctl -D yourpath/pgdata restart # PostgreSQL客户端连接服务端 # -h 指定host(本地用localhost) # -p 指定端口(默认5432) # -d 连接数据库名称(初始连接使用Postgre默认数据库,后续可自行创建数据库) # -U 连接用户(初始连接可不指定,连接默认用户,后续可自行创建用户) 连接: yourpath/pgsql_debug/bin/psql -h localhost -p 5432 -d postgres -U nodesbit # PostgreSQL客户端相关操作SQL 创建用户: CREATE USER 用户名 WITH PASSWORD '密码'; 创建数据库: CREATE DATABASE 数据库名; 创建表: CREATE TABLE 表名 (列1 类型 [约束], 列2 类型 [约束], ...); 用户授权: GRANT ALL PRIVILEGES ON DATABASE dbname TO myuser; 查看数据库: \l 查看用户: \du 查看数据库: \db 查看表: \dt 切换数据库: \c dbname 推出客户端: \q # Valgrind相关 详细检测:valgrind --leak-check=full --show-leak-kinds=all 可执行文件 ``` ### 附录B: 环境配置文件 ```bash # 环境变量配置 export LD_LIBRARY_PATH=your_path/pgsql_debug/lib:$LD_LIBRARY_PATH ```