Posts Tagged iPhone Development

XCode Crashes if it can’t phone-home

I’ve had trouble lately with XCode crashing immediately after an error trying to communicate with Apple’s servers.

I don’t know quite what’s happening, but i have Little Snitch installed on my Mac and I often work in Starbucks or bookstores where paid WiFi is available.   Somehow, being denied its chat with Apple makes XCode crash.

Little Snitch is a cool piece of software.  I bought it in one of those bundle deals from MacHeist or MacUpdate.  But its alert every time an unexpected communication attempt is made can be quite eye-opening.   However, I learned quickly to not deny XCode when it tries to talk to Apple.  The first time I did that, XCode crashed immediately and took my text changes with it.  (Not much work lost thankfully.)

I still make Little Snitch ask for permission for all XCode communications so I can see when they happen.  If I don’t press the “Allow” button before the attempt times out, XCode may or may not crash. I give permission as fast as possible so it won’t crash.

In the past few days though, XCode has still crashed, even with permission given in under 5 seconds.  I’ve begun to wonder if it might be a problem with router used by stores to get logins before allowing traffic out to the internet.  If XCode is denied at that point, will it still crash?  I don’t know yet.   But since such WiFi spots allow the computer to connect, it may look like you are on the internet when you aren’t.  Communications will fail.

Thankfully, it doesn’t try very frequently.  If it did,  it would be too frustrating to deal with all the crashes.  I also note that the XCode Console output shows a crash report submitted to Apple,  so I assume they don’t need another bug report on it.

Tags: , , ,

Helping XCode find its files

I started moving files around in my project folder recently.   I wanted to re-organize code and non-code files into different folders.

Once the files had been moved and the project re-opened, there are many source files displayed in red, meaning XCode does not know where they are.

To help XCode find missing files, try this:  select the red file,  perform “Get Info”, select the “General” tab and click the “Choose…” button.   You can then find and pick the file.  You can even change the file if you like.

Warning:  when you are doing this with a missing file, it is possible to substitute a folder for the file.   If you manage to do this, you won’t be able to just re-choose the file.   You’ll have to delete the folder and re-add the file.

Tags: , , ,

default.png won’t display

Funny one today:  my default.png file would not display.  My application launched with a black screen zooming out instead.  A quick look at another app that did work properly showed the only difference: the “D” was capitolized.  A quick check and sure enough, it worked if the D was upper-case.

That was a surprise to me, being so used to the case-insensitive file system on the Mac for so long.

Tags: ,

Executing Terminal Commands Inside Xcode

A long time ago,  I remember using Apple’s MPW environment to create software for the Mac.   This environment was a lot like using terminals had been on the Unix machines back in college. This had its plusses and minuses but it was strange in one fashion:  I could execute command-line scripts inside the text editor.  This ability has returned in Xcode.  (Well, I just noticed it recently due to a lucky accident. It may have been there all along.)

The default setup for Xcode uses Control-R (and variations with Option or Shift keys) to execute the currently selected text as a bash terminal command. If no text is selected, the entire line containing the insertion point is used. You can change which key does this in Xcode’s “Key Bindings” preference panel under the “Text Key Bindings” tab.  (Note that the variations are listed in the bindings panel mentioned.)

This can have many small, cool uses.   Here are a few off the top of my head:
- date
this will give you a timestamp like this one: “Fri Jul 17 14:04:02 EDT 2009″
- ls
“ls” will list directories of files directly into your text file – this can be useful if you are looking to put a file name into a file open command or  something

If you have a useful command-line tool whose output would be useful in an Xcode text file, this will work for you.

What you can’t do is run programs that don’t stop or require further input, like TOP or SSH.  For those, you’ll still need to use the terminal program supplied with your computer.   If you do try this,  you will cause problems for Xcode that will probably lead to it locking up or crashing.

I tried this with “top” and Xcode started having difficulty editing the file any further.  Other things seemed to work, but it eventually crashed.  As I figured out later, a “top” process had started.  The second time, I found it in the process list and used “kill” on  it from the real terminal.  The moment I killed it, the Xcode window filled with a ton of output generated by TOP.

In another case, I tried to use the SQLite3 tool, but it just quit with this error: “Incomplete SQL”.  So interactive tools don’t work for this.

Of course, its easy to capture the output of command-line tools for text files in different ways, so this is cool, but not really earth-shaking.  It can make some work much quicker and easier.   Enjoy.

Tags: , , ,

DevBits06: Debugging with Instruments causes Bugs?

Here’s one that just about caused me to pull out another chunk of hair:  I was getting ready to send a product to a customer and was giving it the final test runs on my device.  I was using Instruments to check for leaks when the program started crashing, somewhat randomly with array-bounds-exceptions.  It didn’t crash in the same place every time, or even after the same amount of use.  It could happen quickly, it could take a while.  (Well,  you know the kind of thing I’m talking about.)

After a LOT of work going over code trying to find the problem, I was thinking it must be something device-specific because it hadn’t happened in the simulator at all.  I looked through all my notes, I looked through posts online, nothing seemed to narrow it down.

After a lot of debugging, I noticed that it only happened with instruments running.  That seemed weird, but usually this kind of thing means there is a bug, but the presence of something like instruments is just bringing it out.  But since I couldn’t run the debugger and instruments at the same time, I was having trouble seeing what was wrong beyond the bounds-exception.  So, I added a bunch of calls to NSLog to give me info about the situation while instruments was running.  (If there are good articles on using Instruments alongside gdb or something, I’d love to hear about them.)

Now, with all the logging, I finally see that the index was jumping by 2 rather than 1 at wrong moments.  That was sending the index beyond the limit.  Now Why? WHY?  The only increment code was in an IBACTION called by a button on the view, and it only incremented by 1.

In the end,  I could hardly believe the answer:  I was incrementing by 1 – TWICE.  The IBACTION was being called multiple times by MY rapid clicking (touching) on the button. I thought it was cool that while the animation was transitioning between 2 views, the destination view was actually loaded and ready to be touched. It made everything faster. I was going through views at a rapid pace in my testing and thinking nothing of it. Every new touch would interrupt the animation and do whatever the touch would do. Most of the time, the offending view would disappear before the button could be pushed again.  However, with Instruments running, things on the device slowed down just enough for the button to sometimes get pushed again and send the message to the IBACTION a second time. The indexes incremented incorrectly as a result.

The first thought I had was “I shouldn’t use Touch-Up-Inside. I should send the event on Value-Changed or something”.   That might have worked, but the button in question was a button bar item. It didn’t have the option to choose the event.

The solution: add some code to the program to prevent incrementing beyond the array bounds.

The solution I probably should have used (and will use in the next version): add code to the IBACTION to prevent it from executing more than once before the view disappears (and re-appears a little later.)  I’ll just add a member variable to the view controller that turns false/NO on entering the IBACTION, and resets to true/YES in ViewDidAppear.

The moral:  do not assume that an IBACTION can only be called once just because it changes the view or view controller.  The system controls that.

Tags:

iPhone Developer Bits 5

Your downloaded certificate file doesn’t seem to contain a private key?  You turned down the arrow in the Keychain Utility and there wasn’t anything there?  I’ve had this happen twice and I’ve got the following I wrote down.  I wish I had written something more detailed at the time, but here is this if it helps.

-  the original private key for the request is held on the computer that generated the certificate request (CSR) file, so you must download the certificate on that same computer. (And hopefully a crash or drive corruption hasn’t hurt that key in the meantime.)  I’m not an expert on security, but I believe the idea is that the request (CSR) is actually a public key, or contains one, so when Apple creates the certificate, only you can decrypt it with the private key for the CSR.

- Create a different CSR for each certificate: One for development, one for distribution.  I’m not exactly positive on this one.  I’m wishing I wrote more, but I’m sure that doing this won’t hurt anything.

- Do you have an individual developer account? You must revoke the “bad” certificate and its associated provision profiles, then regenerate them, starting with certificate. (Be sure you can find and save the certificate private key before generating provision profiles with it.)

Remember: to be able to give free updates to your customers, you must have the original distribution private key.  Back it up in places that will survive the death, destruction, disappearance and theft of the hard drive it is stored on.

Tags:

iPhone Developer Bits 4

Changed your bundle identifier and now XCode won’t load the result app onto the iPhone or iPod Touch device?

- Try deleting the old version of the application from the device before loading/running the new one.

Tags: ,

iPhone Developer Bits 3

error “syntax error before ‘AT_NAME’ token”

This one frustrated me for longer than I care to think about. (It wasn’t really all that long, but my pride was hurt that I didn’t figure it out much more quickly.)  It appeared to be something wrong in the generated token stream but the messages gave no real clue as to why this was happening.  My first thought was that I had accidentally edited an SDK file.

However, when my own thinking doesn’t turn up the answer in an effective amount of time, I find it pays to Google for it. My usual practice is to duplicate the error text as exactly as possilbe so that I can find posts about the same problem.  (Start with the very specific and become more general if the answer doesn’t present itself.)

It turned out to be that I had gotten some extra text after the “@end” directive in a .h file

Special thanks to John Muchow for his post on iphonedevelopertips.com which quickly lead me to the correct answer.  No doubt you saved me time and hair-pulling.

Tags: ,

iPhone Developer Bits 2

Are you getting kAMDApplicationVerificationFailedError when you try to run your app on a device?
- Check the status of your provisioning profile’s certificate in the Keychain Utility.  It may be expired.  If so, go to the program portal and create a new one.

Tags: , , ,

A Technique for Finding iPhone App Crashes at ojbc_msgSend

(if this helps you, even to save a little time, please leave a comment)

Recently, I was working on an iPhone application for a client when I ran headlong into a crash in objc_msgSend.  It was a hair-pulling bit of frustration for me as it seemed so hard to debug for a long time.  Every time I encountered it, this was all I saw on the stack:

Debugger Stack for objc_msgSend problem

Debugger Stack for objc_msgSend problem

I saw several posts online which gave me more than few hints.  It seemed very clear that I had over-released something, but all the zombies and other flags didn’t really make it clear which thing was getting over-released or where.  I could tell what it was, but nothing much else until I struck on this idea while taking a walk:  if the crashes are always related to the release of an auto-release pool, then I need to control the auto-release pool. I can’t wait for this _NSFireDelayedPerform thing to decide to release it. (Steve Maguire’s  “Writing Solid Code” has been one of my favorite industry books for a long time.)

So in essence, I started bracketing all my suspect code like this:

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

<code to test>

[pool release];

Sure enough, my debugger stacks went from looking like the one above to looking like this:

Debugger Stack With Manual Pool Release

Debugger Stack With Manual Pool Release

That’s a LOT better. Now I know where to look.  Further application of layers of pools narrowed down the target pretty quickly.

In the end,  I found that my mistake was a call like this in an initializer:

NSMutableArray *memberArray = [[NSMutableArray alloc]  initWithCapacity: 5];

which isn’t wrong.  However,  I never actually filled the allocated array entries.  When it was released later, it caused my crash.  Changing the code to to allocate the array later, when I had items to fill it,  fixed the problem.

There is one little problem with this technique that I see: you have to be careful how you bracket things with the pool-release calls.  If you release a pool, then try to use something that was allocated on that pool, you may be trying to use something you’ve already released.  The easiest way I saw to use it was to put them around a call to a routine or a message.  When I had to use them inside a block of code, I had to be careful that allocations and releases that used the pool would all be inside the bracketing calls.

I hope this helps someone else find a solution.  If it did, please leave a comment.

Tags: , ,