環境搭建:
1. VS2005(完全安裝, 要用VC8), (VS2008用來編譯也是可以的,但是最后的工程文件還是VS2005的)
2. Active Perl5.8后續版本,確保perl\bin在PATH環境變量里頭
3. Bison 和 Flex
Bison 1.875 或者 2.2或以后版本才有效.
Flex必須是2.5.31或后續版本, 請參照一下:http://www.postgresql.org/ftp/misc/winflex/
如果是從release的source code里build, 這兩個工具,可以不要。如果是從git里頭取的code,則需要這兩個工具。
4. source code: http://www.postgresql.org/ftp/source/v9.1.3/
5. Diff, gettext等,連同Bison,從GnuWin32里頭下載。http://gnuwin32.sourceforge.net/packages.html
至于:6. MIT Kerberos (Kerberos authentication support)
7. libxml2 and libxslt
8. openssl
9. ossp-uuid
10. zlib
11. Python
這些都是可選的,不是必需的。
如果只是build這些選項,甚至包括一些開發包,這里有一個編譯打包好的。下載地址: http://code.google.com/p/hisql/downloads/list。這個包是免安裝版。
里邊已經放置了odbc, jdbc, ado.net包以及pgAdmin客戶端。
1) 解壓源碼至E:\PROJECTS\postgresql-9.1.3
2 ) 假設VS2005安裝到:D:\tools\vs8, 進入cmd窗口:運行D:\tools\vs8\vc\bin\vcvars32.bat,以得到所有有用的VC編譯器環境變量。
進入目錄:E:\PROJECTS\postgresql-9.1.3\src\tools\msvc
3) 運行build.bat DEBUG >> \build.log
4) 檢查沒什么錯誤(0 errors)之后,運行install.bat E:\PROJECTS\pgsql_debug,將build出來之后的東西安裝到此位置。
5) 在pgsql_debug目錄下邊設置簡單的幾個環境變量pg_env.bat, 并運行之:
@ECHO OFF
REM The script sets environment variables helpful for PostgreSQL
SET PGHOME=E:\PROJECTS\pgsql_debug
SET PATH=%PGHOME%\bin;%PATH%
SET PGDATA=%PGHOME%\data
SET PGLOCALEDIR=%PGHOME%\share\locale
6) 運行下邊命令建立數據目錄:
initdb --no-locale -E UTF-8 -D E:\PROJECTS\pgsql_debug\data
7) 啟動server進程并創建db,
pg_ctl -l pgsql.log start
createdb iihero
8) 連接db:
psql iihero
iihero=# create table foo2(id bigint);
CREATE TABLE
iihero=# select pg_backend_pid();
10804
9)
////// 此時知道該連接對應的后臺進程ID是10804,用VS2005打開plsql.sln,attach到此進程,
////// 找到postmaster工程,src/backend/tcop/postgres.c, 在exec_simple_query()處設斷點,就可以跟蹤普通的SQL操作在后臺的執行情況,此處不綴述。
10) 插入大批量的數據作測試
iihero=# insert into foo2 select * from generate_series(1, 1000000);
INSERT 0 1000000
11)
后臺進程postgres.exe,一啟動就有6個。除了用psql連接導致的新postgres進程以外,這個好判斷,用select pg_backend_pid()就可以得到進程號,準確進行attach。
那么如果想跟蹤其它幾個后臺進程呢?
總共就這些后臺進程:(SysLogger, BgWriter, WalWriter, AutoVacuum, PgArch, PgStat),名字都叫postgres。
我們注意到src/backend/postmaster/*.c里頭,剛好有對應這6個進程的實現部分。
使用VS debugger的suspend,再加上對這幾個文件進行試設斷點,也是可以的。如果仔細比對源碼,看看postmaster.c中的SubPostmasterMain():
不難發現,
SysLogger --> --forklog
AutoVacuum --> --forkavworker, --forkavlauncher
WalWriter, BgWriter --> --forkboot
PgStat --> --forkcol
PgArch --> --forkarch
使用ProcessExplorer工具,從postgres.exe的進程屬性即可以看出對應的是哪個后臺進程。 如下圖所示:
找到src/backend/postmaster/pgarch.c,選擇適當的斷點,即可進行跟蹤了。