VS2013编译调试postgresql10.3

由于之前编译过,想着再来一次应该很容易没想到。。。。

好啦 ,为了下次不犯错,记录一下吧

首先要装vc2013和MinGW

然后确认电脑已经安装好perl、diff、flex、bison,可以在目录C:\MinGW\msys\1.0\bin里面确认是否有相关执行文件,并把这个目录加到path里。

再将C:\Program Files (x86)\MSBuild\12.0\Bin加入到path(这块我迷惑,电脑里有好多版本的MSBuild,在C:\Windows\Microsoft.NET目录里边的其他版本试了几个不行还是报错,最后选了C:\Program Files (x86)\MSBuild\12.0\Bin)

\src\tools\msvc\Mkvcbuild.pm将“my $vsVersion = DetermineVisualStudioVersion();”修改为“my $vsVersion = ‘12.00‘;”,如下图所示:

                       VS2013编译调试postgresql10.3

用vs打开文件“src\fe_utils\print.c”,执行如下操作:

VS2013编译调试postgresql10.3

 

VS2013编译调试postgresql10.3

 

然后保存替换原来的文件。此处解决的问题:该文件中的换行符使用的是各个操作系统通用的换行符,在windows下编译会出现警告。报错信息为“warning C4819: The file contains a character that cannot be represented in the current code page (936). Save the file in Unicode format to prevent data loss

下面编译postgresql源码:(一定要通过vc的VS2013编译调试postgresql10.3

命令行)

然后执行“cd src\tools\msvc”切换到pg源码路径,执行命令“perl build.pl DEBUG”此处为方便调试使用DEBUG模式,编译时间会比在linux下要长,编译完成后,如下:

VS2013编译调试postgresql10.3

编译完成后,可以执行“perl vcregress.pl check”跑一下回归测试,结果如下:

VS2013编译调试postgresql10.3

确认无误后,执行“perl install.pl D:\pgdata\pgdb”进行安装,安装结果如下:

VS2013编译调试postgresql10.3

然后进入到pg安装目录“cd /d D:\pgdata\pgdb”进行建库操作“initdb.exe -D ../data”,建库完成后,启动pg数据库“pg_ctl.exe -D ../data -l logfile start”,启动完成后即可进入数据库“psql -d postgres”

VS2013编译调试postgresql10.3

VS2013编译调试postgresql10.3

如果需要使用vs调试pg,先将pg代码使用vs打开,打开方式,找到编译后的文件夹打开文件“pgsql.sln即出现以下提示,因使用vs2013的编译器编译,不对项目进行重定向,选项如下:

确定后,即可使用vs打开pg源码。然后确定当前打开pg的进程ID:

VS2013编译调试postgresql10.3

确定后,即可使用vs打开pg源码。然后确定当前打开pg的进程ID:

VS2013编译调试postgresql10.3

 

点击附加,即可附加到进程。

尝试调试

VS2013编译调试postgresql10.3

VS2013编译调试postgresql10.3

此时pg在等待输入,通过堆栈信息可以看出是等待网络消息的状态,最终停止在函数“WaitForMultipleObjects”

使用断调试,例如在pg错误入口函数下断点,

如下

VS2013编译调试postgresql10.3

然后执行错误的SQL语句:

VS2013编译调试postgresql10.3

数据库中并不存在表aaaa,此时vs状态如下:

VS2013编译调试postgresql10.3

以上堆栈信息即为pg执行错误SQL时所使用的函数。