Trouble with the PL/pgSQL debugger and VC++

From: Charlie Savage <cfis(at)savagexi(dot)com>
To: pgsql-hackers(at)postgresql(dot)org, korry(dot)douglas(at)enterprisedb(dot)com
Subject: Trouble with the PL/pgSQL debugger and VC++
Date: 2007-09-06 23:06:16
Message-ID: 46E087E8.3070403@savagexi.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: 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

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Charlie Savage 2007-09-06 23:08:20 Re: Some more msvc++ 8.2.4 build feedback
Previous Message Decibel! 2007-09-06 22:50:41 Re: Just-in-time Background Writer Patch+Test Results