环境搭建:
1. VS2005(完全安装,要用VC8),(VS2008用来编译也是可以的,但是最后的工程文件还是VS2005的) 2. Active Perl5.8后续版本,确保perlbin在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:PROJECTSpostgresql-9.1.3
2 ) 假设VS2005安装到:D:toolsvs8,进入cmd窗口:运行D:toolsvs8vcbinvcvars32.bat,以得到所有有用的VC编译器环境变量。 进入目录:E:PROJECTSpostgresql-9.1.3srctoolsmsvc
3) 运行build.bat DEBUG >> build.log 4) 检查没什么错误(0 errors)之后,运行install.bat E:PROJECTSpgsql_debug,将build出来之后的东西安装到此位置。
5) 在pgsql_debug目录下边设置简单的几个环境变量pg_env.bat,并运行之:
@ECHO OFF REM The script sets environment variables helpful for PostgreSQL SET PGHOME=E:PROJECTSpgsql_debug SET PATH=%PGHOME%bin;%PATH% SET PGDATA=%PGHOME%data SET PGLOCALEDIR=%PGHOME%sharelocale
6) 运行下边命令建立数据目录:
initdb --no-locale -E UTF-8 -DE:PROJECTSpgsql_debugdata
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():
if (strcmp(argv[1],"--forkbackend") == 0 ||
strcmp(argv[1],"--forkavlauncher") == 0 ||
strcmp(argv[1],"--forkavworker") == 0 ||
strcmp(argv[1],"--forkboot") == 0)
PGSharedMemoryReAttach();
/* autovacuum needs this set before calling InitProcess */
if (strcmp(argv[1],"--forkavlauncher") == 0)
AutovacuumLauncherIAm();
if (strcmp(argv[1],"--forkavworker") == 0)
AutovacuumWorkerIAm();
if (strcmp(argv[1],"--forklog") == 0)
if (strcmp(argv[1],"--forkcol") == 0)
{
/* Close the postmaster's sockets */
ClosePostmasterPorts(false);
/* Do not want to attach to shared memory */
PgstatCollectorMain(argc,argv);
proc_exit(0);
}
不难发现,
SysLogger --> --forklog AutoVacuum --> --forkavworker,--forkavlauncher WalWriter,BgWriter --> --forkboot PgStat --> --forkcol PgArch --> --forkarch
使用ProcessExplorer工具,从postgres.exe的进程属性即可以看出对应的是哪个后台进程。 如下图所示:
找到src/backend/postmaster/pgarch.c,选择适当的断点,即可进行跟踪了。 (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|