環境:windows 10
postgresql版本:postgresql-9.6.5
使用工具:vs2017社區版
輔助工具:perl、diff、flex、bison
相關工具下載地址:
perl下載鏈接:http://pan.baidu.com/s/1i5aPilB 密碼:k6f0
diff、flex、bison下載鏈接:http://pan.baidu.com/s/1hrHotes 密碼:4ku6
以上工具均為綠色版,解壓后,設置環境變量即可
此處使用的編譯調試工具為vs2017社區版,該版本為免費版,個人使用不存在版權困擾。
首先離線下載vs2017社區版,也可在線安裝,安裝方式如下:
微軟官方下載官方提供的下載工具:vs_community.exe
cmd中執行以下命令,zh-CN表示中文,en-US表示英文,E:\vs2017表示下載位置:
vs_community.exe --layout E:\vs2017 offline --lang zh-CN
安裝vs2017,選擇如下內容安裝即可:
修改postgresql配置文件,否則編譯過程會出現錯誤。修改內容如下:
E:\PG\postgresql_9.6.5\src\tools\msvc\VSObjectFactory.pm中,將“if ($major > 14)”修改為“if ($major > 15)”,如下所示:
E:\PG\postgresql_9.6.5\src\tools\msvc\Mkvcbuild.pm將“my $vsVersion = DetermineVisualStudioVersion();”修改為“my $vsVersion = '14.00';”,如下圖所示:
以上兩步解決pg的perl腳本中不識別vs2017版本的問題,報錯信息為“Unable to determine Visual Studio version: The nmake version could not be determined. at src/tools/msvc/Mkvcbuild.pm line 86.”
用vs打開文件“E:\PG\postgresql_9.6.5\src\fe_utils\print.c”,執行如下操作:
然后保存替換原來的文件。此處解決的問題:該文件中的換行符使用的是各個操作系統通用的換行符,在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源碼:
然后執行“cd /d E:\PG\postgresql_9.6.5\src\tools\msvc”切換到pg源碼路徑,執行命令“perl build.pl DEBUG”此處為方便調試使用DEBUG模式,編譯時間會比在linux下要長,編譯完成后,如下:
編譯完成后,可以執行“perl vcregress.pl check”跑一下回歸測試,結果如下:
確認無誤后,執行“perl install.pl E:\pg\pgdb”進行安裝,安裝結果如下:
然后進入到pg安裝目錄“cd /d E:\pg\pgdb”進行建庫操作“initdb.exe -D ../data”,建庫完成后,啟動pg數據庫“pg_ctl.exe -D ../data -l logfile start”,啟動完成后即可進入數據庫“psql -d postgres”
如果需要使用vs調試pg,先將pg代碼使用vs打開,打開方式,找到編譯后的文件夾“E:\PG\postgresql_9.6.5”,打開文件“pgsql.sln”即出現以下提示,因使用vs2015的編譯器編譯,不對項目進行重定向,選項如下:
確定后,即可使用vs打開pg源碼。然后確定當前打開pg的進程ID:
點擊附加,即可附加到進程。
嘗試調試
此時pg在等待輸入,通過堆棧信息可以看出是等待網絡消息的狀態,最終停止在函數“WaitForMultipleObjects”
使用斷點調試,例如在pg錯誤入口函數下斷點,
如下
然后執行錯誤的SQL語句:
數據庫中並不存在表aaaa,此時vs狀態如下:
以上堆棧信息即為pg執行錯誤SQL時所使用的函數。