On Mar 8, 2005, at 16:59, Florian Munz wrote:

Bob Ippolito <[EMAIL PROTECTED]> wrote:

What you need to do here is:
(a) implement a __del__ that removes it as an observer or otherwise
ensure that the Controller object is never an observer after it's dead
(i.e. by making sure it never dies, or removing it manually before it
goes away).
(b) make sure it's alive for the duration that you want it to receive
notifications, by storing away a reference to it somewhere.. if you are
just testing and you want it to never go away, do self.retain()

Thanks a lot, that solved all my problems and I know a significant bit more about PyObjC now ;-)

FYI the best way to debug a crash that happens on objc_msgSend is to use the same technique you would use when debugging Objective-C code: NSZombie.


Some information is available:
http://developer.apple.com/technotes/tn2004/tn2124.html
http://www.cocoadev.com/index.pl?DebuggingAutorelease

Essentially, what I do is this (with an --alias build):

env NSZombieEnabled=YES USE_PDB=1 ./dist/MyApp.app/Contents/MacOS/MyApp

If it's really bad, I'll use GDB:

env NSZombieEnabled=YES USE_PDB=1 gdb --args ./dist/MyApp.app/Contents/MacOS/MyApp


USE_PDB is an environment variable that PyObjCTools.AppHelper.runEventLoop() inspects. When it's set, it will:
(1) enable PyObjCTools.Debugging in verbose mode, so you get a stack trace at every exception that Objective-C sees (caught or otherwise). Python exceptions that cross the bridge will have additional information.
(2) on uncaught exceptions, it'll drop you to pdb (though the runloop will catch many exceptions)


Unfortunately, by the time runEventLoop kicks in it is too late to twiddle NSZombieEnabled and other Foundation debugging hooks, so you have to set it explicitly.

-bob

_______________________________________________
Pythonmac-SIG maillist  -  Pythonmac-SIG@python.org
http://mail.python.org/mailman/listinfo/pythonmac-sig

Reply via email to