《一个常用环境在windows但是必须要在Linux上写代码的悲剧》
接下来是一些回忆,难免保证有一些偏差,只是大体思路可以参考一下。
用源码安装pgsql并配置环境变量
第一步,把pgsql的源码下载下来,把一些依赖库装好。
然后可以看到源码目录里面有个configure.
sh configure --prefix=$HOME/project --enable-depend --enable-cassert --enable-debug CFLAGS="-ggdb -O0"
按照惯例去复读网上很多人的博客,这里我希望采取默认安装路径,--prefix直接省略。
cmake_minimum_required(VERSION 3.6)
project(postgres)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(CMAKE_CXX_FLAGS_DEBUG “${CMAKE_CXX_FLAGS_DEBUG} -O0”)
set(CMAKE_C_FLAGS_DEBUG “${CMAKE_C_FLAGS_DEBUG} -O0”)
add_custom_target(postgres COMMAND make -C ${postgres_SOURCE_DIR})
执行make&&make install.
之后要初始化数据库,就需要参考这个文章(二)中的一部分:Ubuntu18.04源码安装PostgreSQL11_我的梦-CSDN博客_ubuntu源码安装postgresql里的说法,但是不用新建用户postgres.
把环境变量配置一下,并且给一下文件夹权限,然后就可以把刚刚那个文章关掉了。
然后重启电脑让环境变量生效。
接着进行initdb的设置,(如果刚刚环境目录生效了,理论上它也不会问你数据在哪) 保险起见可以用initdb -D /var/postgresql/data这样的做法。
之后pg_ctl start,把数据库打开,并用createdb命令新建一个db,我这里用的名字叫testdb。
用另外一个终端执行psql testdb,发现可以连接。随便执行几个插入命令也可以顺利执行。
关闭psql,执行pg_ctl stop,把之前数据库相关的东西都关掉。
用clion进行调试
之后打开clion:
打开debug configuration,增加一个Application,Target选postgres,Executable选择到源码目录的src/backend/postgres
,程序参数写 -D 数据目录
点击debug就能开始调试,参考这个文章就行。
clion调试postgresql - 邱明成 - 博客园
但是如果真的只是这样就好了,我tm还用折腾那么半天……
用clion进行planner的调试
之后你会发现一个很严重的问题,就是它其实有些断点是进不去的。
比如说cost_index,你可以看到clion在打上断点之后有禁止符号,它提醒你这里打上断点也没用,因为程序到不了这里。
于是你可以进入程序的目录,找到其他的target:最熟悉的target莫过于pg_ctl和psql.
先看看psql,程序参数写 testdb,这样看起来就很美好,点击一下debug,成了。
但其实这个样子也不行,你发现它还是进不去那些断点。
再看看pg_ctl,人家根本不搭理你,还问你是不是安装错了。
于是事情就卡死了:clion不背锅,是之前的可执行文件选错了。
学长的通俗解释告诉我,pg分为client和server,如果是前端的事情呢,那么肯定是去调试client,这个其实对应着psql。而如果我们想调试planner,肯定偏内核一点,所以我们需要调试server。
在找server之前,先做些准备工作:
编辑 /etc/sysctl.d/10-ptrace.conf 文件
修改kernel.yama.ptrace_scope = 1为kernel.yama.ptrace_scope = 0
然后运行sudo service procps restart 或者重启
这样可以保证clion的gdb能正常使用。
之后从终端启动数据库并用psql testdb链接它:
运行这个sql语句:select pg_backend_pid(),记住pid。
使用clion的附加进程调试(run菜单下),找到那个pid,进行debug。
从psql端写入一些查询,比如select * from T where id = 1,可以看到cost_index等函数有断点触发。
不知道有没有什么正经的做法……反正目前想到的比较正常的做法就只能这样做了。
(不过果然这个环境配置问题还是太小众了……)