postgresql源码学习(26)—— Windows vscode远程调试Linux上的postgresql

本篇纪念小白第一次用开发工具调试源码成功~

       gdb使用命令行调试感觉还是有诸多不便,本来想简单点找找怎么直接调试Windows下的pg源码,找了半天只有用vs,太重而且步骤比较复杂。大多数实际环境还是运行在Linux的,所以最好还是调试Linux下的pg源码。

  • 目标端:centos 7+postgresql 14
  • 源端:Windows 10 + vscode

 

零、 特别提醒

在调试的过程中,有些操作可能会导致整个pg挂掉,小白们千万别在生产环境瞎跑。

postgresql源码学习(26)—— Windows vscode远程调试Linux上的postgresql_第1张图片

一、 postgresql 14源码编译与安装

  •       之前写过pg用于调试的源码安装方法,这里是一样的(所以如果之前有装好可以就用这个环境)。特别要注意的就是编译的时候要加--enable-debug,不然是调试不了的。

postgresql源码学习(一)—— 源码编译安装与gdb调试入门_Hehuyi_In的博客-CSDN博客_postgresql 源码调试

       安装完之后试一下里面gdb调试的例子,因为后面的工具也会依赖gdb。如果执行没问题,就可以继续往下走了。

二、 安装vscode

下载链接:Visual Studio Code - Code Editing. Redefined

如果速度太慢,国内也有大量网站提供下载,安装过程下一步下一步即可。

1. 本地安装vscode插件

postgresql源码学习(26)—— Windows vscode远程调试Linux上的postgresql_第2张图片

装下面3个:

  • C/C++
  • C/C++ Runner:编译、运行、debug
  • Remote Development:远程开发。它安装了三个插件:Remote-SSHRemote-ContainerRemote-WSL,如果只需要ssh连接,只装Remote-SSH就可以。

postgresql源码学习(26)—— Windows vscode远程调试Linux上的postgresql_第3张图片

2. 测试远程连接

       在Remote Development插件装完后,左下角会多一个小电脑图标,点它,然后新建ssh连接。按照提示在框里填  ssh [email protected]

postgresql源码学习(26)—— Windows vscode远程调试Linux上的postgresql_第4张图片

配好后点旁边的小加号,会弹出新界面让输密码

postgresql源码学习(26)—— Windows vscode远程调试Linux上的postgresql_第5张图片

第一次进去的时候它会在远端服务器装vscode,会比较慢,它在/root下面创建一个隐藏目录vscode。

postgresql源码学习(26)—— Windows vscode远程调试Linux上的postgresql_第6张图片

如果安装遇到报错 Resolver error: Error: XHR failed,有可能是网络问题,把linux上的.vscode目录删掉,重试几次即可。

    连接成功之后可以看到Linux的命令行

postgresql源码学习(26)—— Windows vscode远程调试Linux上的postgresql_第7张图片

三、 配置远端调试pg

打开源码src目录,创建.vscode目录,以及launch.json文件。直接用Linux命令行也可以,通过vscode建也可以

postgresql源码学习(26)—— Windows vscode远程调试Linux上的postgresql_第8张图片

launch.json文件内容如下

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "postgresql",
            "type": "cppdbg",
            "request": "attach",
            "program": "/data/postgres/base/14.4/bin/postgres",
            "processId": "${command:pickProcess}",
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                },
                {
                    "description":  "Set Disassembly Flavor to Intel",
                    "text": "-gdb-set disassembly-flavor intel",
                    "ignoreFailures": true
                }
          ]
        }
    ]
}

唯一要改的地方是"program": "/data/postgres/base/14.4/bin/postgres",换成实际的路径。

另外远端vscode需要安装json插件,否则会报错不能解析该文件。

顺便看了下远端都装了哪些插件,除了json和C/C++ Extension Pack,其他貌似都是自动装的。

postgresql源码学习(26)—— Windows vscode远程调试Linux上的postgresql_第9张图片

如果你遇到这个报错,说不能识别cppdbg,说明没有装C/C++ Runner插件,装上就可以。

postgresql源码学习(26)—— Windows vscode远程调试Linux上的postgresql_第10张图片

四、远程调试测试

我们以最简单的begin操作为例,跟踪StartTransactionCommand函数执行情况。这个函数在 /root/postgresql-14.4/src/backend/access/transam/xact.c 文件中

vscode端:

找到xact.c 文件中的StartTransactionCommand函数,打上断点

postgresql源码学习(26)—— Windows vscode远程调试Linux上的postgresql_第11张图片

linux端:

psql创建连接,查询进程号

select pg_backend_pid();

postgresql源码学习(26)—— Windows vscode远程调试Linux上的postgresql_第12张图片

vscode端:

开始debug,快捷键F5

postgresql源码学习(26)—— Windows vscode远程调试Linux上的postgresql_第13张图片

attach对应进程

postgresql源码学习(26)—— Windows vscode远程调试Linux上的postgresql_第14张图片

会看到右下角有这样的输出

postgresql源码学习(26)—— Windows vscode远程调试Linux上的postgresql_第15张图片

linux端:

执行一个begin命令,发现它会卡住

vscode端:

光标跳到了对应函数,说明已经开始调试了,可以点上面的小箭头,一步步看。

postgresql源码学习(26)—— Windows vscode远程调试Linux上的postgresql_第16张图片

调试界面主要区域如下:

  • variable:每一步执行时对应的变量值,这个非常有用
  • call stack:调用栈,从下往上看
  • 代码中发光的那行是当前执行到的行

postgresql源码学习(26)—— Windows vscode远程调试Linux上的postgresql_第17张图片

通过代码和变量值的对比,很容易看出下一步应该进哪个case,然后再执行什么。

postgresql源码学习(26)—— Windows vscode远程调试Linux上的postgresql_第18张图片

至此,我们的调试测试就成功啦,迈出了pg源码学习万里长征的第一步~

五、 如何指定函数名设置断点

      一点小补充,像上面那样一点点找文件位置,再找函数位置打断点的方法虽然可行,但很麻烦,怎么样像gdb只要指定函数名就能设置断点呢?

postgresql源码学习(26)—— Windows vscode远程调试Linux上的postgresql_第19张图片

 在最左下角会让输入函数名,另外还可以设置断点条件及命中次数才触发,这里我们暂时不用。

postgresql源码学习(26)—— Windows vscode远程调试Linux上的postgresql_第20张图片

 打完断点后面启动调试步骤跟之前一样

 开始debug,快捷键F5

postgresql源码学习(26)—— Windows vscode远程调试Linux上的postgresql_第21张图片

attach对应进程

postgresql源码学习(26)—— Windows vscode远程调试Linux上的postgresql_第22张图片

Linux端随便执行一条insert语句,可以看到断点被触发

postgresql源码学习(26)—— Windows vscode远程调试Linux上的postgresql_第23张图片

这样的话后面调试就方便多了。 

六、 全局搜索和查看源码

vscode打开源码目录

File -> Open Folder

postgresql源码学习(26)—— Windows vscode远程调试Linux上的postgresql_第24张图片

Ctrl+Shift+F 快捷键或者点击左侧边栏中的放大镜图标,打开全局搜索界面,例如搜索RemoveStatistics函数

postgresql源码学习(26)—— Windows vscode远程调试Linux上的postgresql_第25张图片 

点击可以在右侧看到对应源码,上方的紫色小框是当前位置的上层函数

postgresql源码学习(26)—— Windows vscode远程调试Linux上的postgresql_第26张图片

ctrl 点击该函数,可以跳转到源码定义

postgresql源码学习(26)—— Windows vscode远程调试Linux上的postgresql_第27张图片postgresql源码学习(26)—— Windows vscode远程调试Linux上的postgresql_第28张图片  

参考

https://blog.csdn.net/loveoobaby/article/details/123765071?spm=1001.2014.3001.5501

https://blog.csdn.net/loveoobaby/article/details/123766468

https://blog.csdn.net/Hehuyi_In/article/details/110729822

https://blog.csdn.net/Hehuyi_In/article/details/124524307

https://blog.csdn.net/wangyjfrecky/article/details/124681577

阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区

你可能感兴趣的:(源码学习,PostgreSQL,postgresql,源码学习,调试,vscode,远程调试)