over-released NSIdEnumerator
over-released NSIdEnumerator
- Subject: over-released NSIdEnumerator
- From: Jeffrey Oleander <email@hidden>
- Date: Mon, 13 Sep 2010 20:34:48 -0700 (PDT)
After my main NSDocument algorithm method was done doing its thing and returned up the call chain to where the button click had started its action, it would flip to showing NSPopAutoreleasePool and I was crashing with EXC_BAD_ACCESS. So, I looked at all of my alloc, initWith..., retain, and releases. I did find a couple things which I should have been releasing, but had not, but no obvious ones I had been releasing that I should not have been.
So, I looked in the archives and on the web and fired up some of the tools, one by one: MallocDebug, ObjectAlloc (and tried malloc_history with no luck at all). I got these:
from NSLog and the run log/Debugger Console:
2010-09-13 21:11:40.899 DijkstraCocoa[411] MyDocument findRelationship: ---display predecessors---
(gdb) continue
2010-09-13 21:11:46.345 DijkstraCocoa[411] displayResults: resultsField=<NSTableView: 0x549e50>
2010-09-13 21:11:46.346 DijkstraCocoa[411] displayResults: superView=<NSClipView: 0x549ca0>, superSuperView=<NSScrollView: 0x5499c0> window=<NSWindow: 0x54ca00>
(gdb) continue
2010-09-13 21:11:48.638 DijkstraCocoa[411] MyDocument findRelationship: --- DONE ---
Program received signal: "EXC_BAD_ACCESS".
(gdb)
0 objc_msgSend
1 NSPopAutoreleasePool
2 -[NSApplication run]
3 NSApplicationMain
4 main
0 objc_msgSend
0x908611e4 <+0004> beq- 0x90861308 <objc_msgSend+296>
0x908611e8 <+0008> lwz r12,0(r3)
0x908611ec <+0012> lwz r12,32(r12)
0x908611f0 <+0016> stw r9,48(r1)
0x908611f4 <+0020> lwz r11,0(r12)
0x908611f8 <+0024> addi r9,r12,8
0x908611fc <+0028> rlwinm r11,r11,2,0,29
0x90861200 <+0032> and r12,r4,r11
0x90861204 <+0036> lwzx r2,r9,r12
0x90861208 <+0040> addi r12,r12,4
0x9086120c <+0044> cmplwi r2,0
0x90861210 <+0048> beq- 0x90861234 <objc_msgSend+84>
1 NSPopAutoreleasePool
0x90a21da8 <+0336> beq+ cr7,0x90a21dbc <NSPopAutoreleasePool+356>
0x90a21dac <+0340> addis r4,r31,4097
0x90a21db0 <+0344> mr r3,r29
0x90a21db4 <+0348> lwz r4,-3720(r4)
0x90a21db8 <+0352> bl 0x90b47aa8 <dyld_stub_objc_msgSend>
0x90a21dbc <+0356> lwz r2,8(r30)
0x90a21dc0 <+0360> addi r27,r27,1
0x90a21dc4 <+0364> cmplw cr7,r28,r2
0x90a21dc8 <+0368> blt+ cr7,0x90a21d64 <NSPopAutoreleasePool+268>
2 -[NSApplication run]
0x9730407c <+0592> bl 0x976f8028 <dyld_stub_objc_msgSend>
0x97304080 <+0596> lwz r3,864(r1)
0x97304084 <+0600> addis r4,r31,4095
0x97304088 <+0604> lwz r4,6316(r4)
0x9730408c <+0608> bl 0x976f8028 <dyld_stub_objc_msgSend>
0x97304090 <+0612> lwz r2,1320(r1)
0x97304094 <+0616> lha r0,50(r2)
0x97304098 <+0620> cmpwi cr7,r0,0
0x9730409c <+0624> bne+ cr7,0x97303fe4 <-[NSApplication run]+440>
0x973040a0 <+0628> addi r3,r1,80
0x973040a4 <+0632> bl 0x976f8208 <dyld_stub__NSRemoveHandler2>
0x973040a8 <+0636> b 0x97304130 <-[NSApplication run]+772>
3 NSApplicationMain
0x973c0750 <+0444> bl 0x976fbb68 <dyld_stub_ptrace>
0x973c0754 <+0448> lwz r3,0(r30)
0x973c0758 <+0452> addis r4,r31,4083
0x973c075c <+0456> lwz r4,24824(r4)
0x973c0760 <+0460> bl 0x976f8028 <dyld_stub_objc_msgSend>
0x973c0764 <+0464> li r3,0
0x973c0768 <+0468> ori r3,r3,41471
0x973c076c <+0472> li r4,0
0x973c0770 <+0476> li r5,0
0x973c0774 <+0480> li r6,0
0x973c0778 <+0484> bl 0x976fbb68 <dyld_stub_ptrace>
4 main
#import <Cocoa/Cocoa.h>
int main(int argc, char *argv[])
{
return NSApplicationMain(argc, (const char **) argv);
}
MallocDebug says:
/Users/giovanni/Projects/DijkstraCocoa/build/DijkstraCocoa.app/Contents/MacOS/DijkstraCocoa accessed memory at 0x55555575 illegally. It probably tried to dereference a pointer in freed memory.
The most interesting thing ObjAlloc were some tiny objects containing only an unsigned long long, which I allocate to stuff in a set, the sole purpose of which is as a quick test for the status of a node of my graph (not yet examined, examined and now in the priority queue, visited and removed from the priority queue). (Come to think of it, there may be a better way.) Anyway, it was the only kind of object that jumped out at me has having any irregularity, so I looked at them quite closely, before NSZombies told me it was worried about an enumerator.
NSZombies says:
2010-09-13 22:47:33.575 DijkstraCocoa[511] *** *** Selector 'release' sent to dealloced instance 0x593180 of class NSIdEnumerator.
Break at '-[_NSZombie release]' to debug.
2010-09-13 22:47:33.575 DijkstraCocoa[511] *** -[NSAutoreleasePool dealloc]: Exception ignored while releasing an object in an autorelease pool: NSGenericException *** Selector 'release' sent to dealloced instance 0x593180 of class NSIdEnumerator.
Break at '-[_NSZombie release]' to debug.
0x90adb928 <+0000> mr r5,r3
0x90adb92c <+0004> mr r3,r4
0x90adb930 <+0008> b 0x90adb580 <logMessageAndRaise>
0 -[_NSZombie release]
1 NSPopAutoreleasePool
2 _NSAppleEventManagerGenericHandler
3 aeDispatchAppleEvent(AEDesc const*, A...
4 dispatchEventAndSendReply(AEDesc cor...
5 aeProcessAppleEvent
6 AEProcessAppleEvent
7 _DPSNextEvent
8 -[NSApplication nextEventMatchingMask:untilDate:i...
9 -[NSApplication run]
10 NSApplicationMain
11 main
0 -[_NSZombie release]
1 NSPopAutoreleasePool
2 -[NSApplication run]
3 NSApplicationMain
4 main
What I'm wondering is how do I go about tracking down which enumerator is causing the problems? I'm not explicitly using autorelease pools of my own.
_______________________________________________
Cocoa-dev mailing list (email@hidden)
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden