Greg Parker wrote on Wednesday, January 28, 2009 4:22 PM > On Jan 28, 2009, at 10:33 AM, Karan, Cem (Civ, ARL/CISD) wrote: > > First off, I know this question is going to the wrong list, > but I have > > NO idea which list would be best. If anyone wants to jump > in and tell > > me a better list, I'll gladly move there. > > > > Background: > > I have an application that is working very, very hard to drive me > > insane. It is multithreaded, lazy, and has my broken attempt at > > trampoline code. Now, it crashes once in a while, but I'm not sure > > what the trail of broken bits are that causes the crash. If only I > > had a way of instrumenting every single entry and exit of each > > function, I could log it all… which is exactly what -finstrument- > > functions does. > > You'll likely get better results from dtrace than > -finstrument- functions. DTrace can be programmed to act on > function entry or exit for all functions in a specified file. > (DTrace experts: this is your cue to chime in.)
I thought DTrace was primarily statistical in nature, right? Won't -finstrument-function work better in my case because it is guaranteed to be called each time? Meh, I have no idea; I've never used it before, just Instruments, and not much at that. > Be warned that any instrumentation tool is likely to perturb > your bug away, if it is in fact a problem with multithreading > or code generation. I KNEW I'd seen a great name for this somewhere! http://en.wikipedia.org/wiki/Heisenbug#Heisenbug Yes, I'm familiar with them, and that is part of the reason for running the traces. I'm hoping that with enough traces I'll figure out why I'm having problems. I figure that by running diffs on all the traces, I'll start finding commonalities between them, which will give me a clue as to what to look for. > > For those of you that don't know about it, when you > compile your code > > using -finstrument-functions, just after the entry point of each > > instrumented function the function > __cyg_profile_func_enter() will be > > called, and __cyg_profile_func_exit() will be called just before > > function exit. You define those functions as you wish. > > > > The tricky part is that there are certain functions that > must not be > > instrumented like that, so you need to set the attribute > > no_instrument_function on those functions. In my case, I > want to run > > some startup code before either of those methods ever get > called. I > > put my code into main(), but, IIRC, there is some function > that gets > > called before main() does. If that is a library function, I'm OK > > since __cyg*() won't get compiled into anything I don't have the > > source for, but if gcc is generating some code that calls __cyg*() > > before I get the chance to do the setup, I'm going to > > have another crash. So, is there anything called before main()? > > What about just before main() returns? > > +load methods and static C++ constructors are obvious examples of code > run before main(). I hadn't thought of those. That would explain a great deal though. > For testing purposes, you could add a flag that's set after > your prep work is complete, and check it in > __cyg_profile_func_enter. You could even do the prep work > inside __cyg_profile_func_enter if the flag isn't set yet. Yeah, I just tested that, and it works well. I'd like to find a way of registering a callback that is guaranteed to be the last function called in the program, but there doesn't seem to be a way (registering with atexit() doesn't work; there are a lot of functions called afterwards, and, although not actually necessary for what I'm doing, I'd like to see what they are) Thanks, Cem Karan _______________________________________________ Cocoa-dev mailing list (Cocoa-dev@lists.apple.com) 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: http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com This email sent to arch...@mail-archive.com