Trouble with the PL/pgSQL debugger and VC++ - Mailing list pgsql-hackers
From | Charlie Savage |
---|---|
Subject | Trouble with the PL/pgSQL debugger and VC++ |
Date | |
Msg-id | 46E087E8.3070403@savagexi.com Whole thread Raw |
Responses |
Re: Trouble with the PL/pgSQL debugger and VC++
|
List | pgsql-hackers |
Hi Korry, I am having problems with getting the debugger to work. Setup: OS: Windows XP Postgresql Version: 8.2.4 compiled with VC++ 2005 Since my version of pg is built with VC++ I thought it wise to also use VC++ for the debugger plugin. So I converted the Makefile into 3 different VC++ projects - pldbgapi, plugin_debugger and targetinfo. Note that targetinfo is not mentioned at all in the comments at the top of Makefile - you may wish to update them. VC++ did not compile the code as is, I've attached a patch below with the changes I had to make. I also generated the appropriate DEF files (using the perl scripts in postgresql-8.2.4\src\tools\msvc). I also had to define a preprocess define, __WIN32__ (line 1524, pldgbapi.c). Maybe you could use something more standard, like _WIN32? I was then able to build the dlls except the profiler (for some reason the struct timezone wasn't being picked up via the includes - but I left that for another day). I then installed the dlls as per the instructions and updated my postgresql.conf file. However, I can't set any breakpoints using PgAdmin. I know the dlls are loaded via Process Explorer, and in fact I can attach to them with the VC++ debugger. So then I tried running through your command line example (using the PgAdmin sql window and then psql) and here are the results: 1. CREATE OR REPLACE FUNCTION testwhere(x int) RETURNS int AS $$ DECLARE result int; BEGIN result := x + 1; RETURN x; END; $$ LANGUAGE 'plpgsql' STABLE; 2. SELECT * FROM pldbg_get_target_info( 'testwhere', 'f' ); target;schema;nargs;argtypes;targetname;argmodes;argnames;targetlang;fqname;returnsset;returntype 80655;79041;1;23;testwhere;;{x};77823;core.testwhere;f;23 3. SELECT * FROM pldbg_create_listener(); pldbg_create_listener 1 4. SELECT * from pldbg_set_global_breakpoint(1, 80655, NULL, NULL); pldbg_set_global_breakpoint t 5. SELECT * FROM pldbg_wait_for_target(1); At this point the session hangs, as explained in your email. So what happens next? I tried: * Opening a new pgadmin window and doing step 6 (SELECT * FROM pldbg_wait_for_breakpoint(1);). That didn't work. * I tried executing the function (select testwhere(7);). That didn't work. Any tips/help appreciated. Like I said, I can step through the code in the VC++ debugger so I can pretty much look at anything that might be helpful. And I'd be happy to send along the VC++ project files and DEF files if you'd like them. Thanks, Charlie -------------------- Only in .: msvc diff -u /c/temp/contrib/pldebugger/pldbgapi.c ./pldbgapi.c --- /c/temp/contrib/pldebugger/pldbgapi.c 2007-07-29 17:09:46 -0600 +++ ./pldbgapi.c 2007-09-06 00:34:29 -0600 @@ -1560,6 +1560,12 @@ } static int allocateServerListener( int * port ) { +#ifdef WIN32 + WORD wVersionRequested; + WSADATA wsaData; + int err; + u_long blockingMode = 0; +#endif int sockfd = socket( AF_INET, SOCK_STREAM, 0 ); struct sockaddr_in proxy_addr = {0}; socklen_t proxy_addr_len = sizeof( proxy_addr); @@ -1571,9 +1577,6 @@ proxy_addr.sin_addr.s_addr = htonl( INADDR_ANY ); #ifdef WIN32 - WORD wVersionRequested; - WSADATA wsaData; - int err; wVersionRequested = MAKEWORD( 2, 2 ); @@ -1617,7 +1620,6 @@ listen( sockfd, 2 ); #ifdef WIN32 - u_long blockingMode = 0; ioctlsocket( sockfd, FIONBIO, &blockingMode ); #endif Only in .: pldebugger diff -u /c/temp/contrib/pldebugger/plugin_debugger.c ./plugin_debugger.c --- /c/temp/contrib/pldebugger/plugin_debugger.c 2007-08-07 10:37:14 -0600 +++ ./plugin_debugger.c 2007-09-06 00:34:58 -0600 @@ -1143,16 +1143,18 @@ int client_sock; int reuse_addr_flag = 1; +#ifdef WIN32 + WORD wVersionRequested; + WSADATA wsaData; + int err; + u_long blockingMode = 0; +#endif /* Ask the TCP/IP stack for an unused port */ srv_addr.sin_family = AF_INET; srv_addr.sin_port = htons( 0 ); srv_addr.sin_addr.s_addr = htonl( INADDR_ANY ); #ifdef WIN32 - WORD wVersionRequested; - WSADATA wsaData; - int err; - wVersionRequested = MAKEWORD( 2, 2 ); err = WSAStartup( wVersionRequested, &wsaData ); @@ -1197,7 +1199,6 @@ listen( sockfd, 2 ); #ifdef WIN32 - u_long blockingMode = 0; ioctlsocket( sockfd, FIONBIO, &blockingMode ); #endif
pgsql-hackers by date: