Thanks for your replies. I've had a go again taking into account your replies but still without success.
What I've tried:
I build python_d.exe (debug version in windows) using visual studio 2008 express. However, this has the problem that this interpreter would only import *_d.pyd and I'm using many libraries, including numpy and matplotlib, so I think it's infeasible to attempt to build them all as debug versions.
So what I tried instead is to build python.exe in Release mode but disable optimizations and make sure there is debug symbols for the compile and link steps. The idea was to use it with the rest of release libraries but as the interpreter itself has debug symbols I thought there maybe a better chance to work with cygdb.py. At the end I just renamed my python.exe and drop the new compiled exe dll pdbs libs on my python installation (I tried to create a new virtualenv for a debug version and duplicate my python setup using pip frezee and pip install, but install would be able to find many packages, I guess because they were originally installed with a windows installer rather than pip).
Then I run cygdb with a python script that loads a .pyd (build with debug symbols and no optimizations, but crucially no --debug because that generates a *_d.pyd). As in my initial post, I can put a breakpoint at a function that I call in the pyd and run the script that calls my pyd. This executes fine but gdb doesn't stop at the breakpoint. Finally, if I write backtrace, up, or down I get a "No stack".
This time I realised that when I set the break point with cy break or just break it complains the function is not defined. sorry I forgot about this message. The same message happens if I try to set a break point using the mangled C++ name of the function.
Don't know what else to do. For the moment I go by debugging with print statements. Maybe I'll try to install a linux distribution after xmas and see if how it goes with it.