Xcode UI Testing not failing even though app crashes with SIGABRT - swift

After the iOS 11 upgrade I found a crash in my application related to the share sheet and saving an image due to the newly added permission checks. That is all good, easy fix. However, I wanted to write a UI automation test to check for this type of thing in the future since I've been burned twice now.
So I wrote the test and it crashes as expected when i run through Xcode, however when I hit continue on the debugger (after the SIGABRT) the test says it completes successfully and is not reporting a failure.
Tried googling but can't find anything relevant, anyone know why the test would say passed when the app crashes?
Here is a code snippet from test, it selects the option appropriately and then SIGABRT, Xcode catches it and when i hit continue the test says it passes. If I put more items after the line causing the crash the test just spins indefinitely.
let shareButton = app.tables.tables.buttons["share"]
shareButton.tap()
let shareSheet = app.sheets["Share Sheet Title"]
shareSheet.buttons["Item to Share"].tap()
app.collectionViews.collectionViews.buttons["Save Image"].tap()
Thanks

Related

How to debug if app closes without error message?

Im facing an issue that i am unable to debug.
If i open the app, it opens normally and works. But if i launch the app and close the app within 1 second and then launch the app again, it crashes without error message.
How do i debug this as Xcode loses debug connection if i close the app?
I tried putting exception break point but since xcode loses debug connection, it wont trigger.
This ONLY happens when a user does the above mentioned steps (open, close within 2 seconds and open again).
Is there anyway to find out why the app is closing and why there is no error / crash message?
Clarification : The crash happens when user opens the app, within 1 sec terminates the app by manually by swiping up from recents menu and tries to open the app again within 1 or 2 seconds. (Open -> terminate -> open)
Let us imagine that you run the app and quickly force-quit. Then, if you start your second run of the app from the Xcode debugger, hopefully, you should see your crash in Xcode at that point.
If that does not work, you might consider a crash reporting tool (e.g., Crashlytics, etc.). That will help you monitor and track crash reports that happen (for both you and your users) in the wild. If you do this, make sure you test the crash reporting system with some forced crash/report because an absence of a report could just be a result of a misconfiguration, which is easy to do because the setup of these tools takes a little work the first time you do it. Just make sure you have the crash report system working with a positive crash report before you draw any conclusions from an absence of a crash report generated by this particular bug.
That having been said, the way these crash reporting systems often work is they capture the crash and send it the next time you start up the app. It seems like there might be a chance that your particular crash (firing it up after having quickly force-quit it the first time) is happening so fast that the crash reporting system may not have a chance to send off its report of the past crash. (That having been said, these are still invaluable for capturing information about user crashes that happen during the normal use of the app, so I would consider them even if it does not help in this particular scenario.)
So, let’s imagine that you are still unsuccessful in catching your crash for some reason. The last resort is to consider sprinkling your code with Logger/OSLog statements. The nice thing about these logging statements is that you can watch these logging statements on your macOS Console app. See WWDC 2020 Explore logging in Swift.

Weird crash when iOS device is idle?

I'm building an app that uses Core Data, and everything works great, except for one thing. If I let the app sit idly, it suddenly throws a SIGTRAP error with no debugging prompt and no hint as to why it did so.
I suspect that it has to do with when the device automatically saves to it's UIManagedDocument seeing as that's the only function that would run in the background on it's own. Assuming that it is, does anyone have any ideas on how I could at least find out what is going on?
EDIT:
After learning what exception breakpoints were (lol), I've got the following errorstack in NSManagedObjectContext Queue: 0_cxa_begin_catch.
Have you tried committing changes immediately after updating to see if the issue occurs instead of relying on the auto save feature?

logs on second run of an ios application in the simulator

I have a question which seems like it should be a fairly common occurrence. I am trying to test code which only runs the first time an ios application is installed. While in principle this is very easy, I'm having trouble with it behaving properly the second time the app runs (note, this is not crash related).
I have been force running the app for a second time using the "Application does not run in background" flag in the plist, and then just hitting the home button. This works great, except i stop getting log data after the first run.
Does anyone know how to test for this situation in a way where you can continue seeing the log information after the app closes? For example, if there is a way to attach the xcode logger to the new process id? Or just another way to force an app reboot without losing the logging feature?
Thanks in advance!
Use the debugger menu:
Product>Attach To Process
(Results may vary with different versions of Xcode).
Also, you might need to insert a sleep at the very start of your launch to catch the very early log messages.
EDIT: If you're on a device then you can use the Device Organizer (cmd+shift+2) to watch all logs on a device.

cocos-2d:My app crashes when i close it via task manager

I have Weird problem,When i close my app via task manager , my app gets crashed on the line
int retVal = UIApplicationMain(argc, argv, nil, #"AppDelegate");
throwing "Thread : 1 signal SIGKILL" error,and i can't reopen my app at all. other times it works pretty well.
Please some one help me with this problem.
I am new to cocos-2d so please be gentle :( , thanks.
As far as I know, this is normal, expected behavior. The reason it seems weird, I think, is that when you run from Xcode, your executable is attached to the debugger in Xcode, so it sometimes prevents things from executing (for example, in a crash or SIG_KILL scenario). This is just giving you a hint as to what apple is doing when you use the task-bar to close the app... it sends SIGKILL to the process :-)
EDIT: for the curious, I tested a little and found that applicationWillTerminate: is not called first, which is actually encouraging as a consumer of apps. You really are SIGKILLing these things. I think this means (with the background-processing workflow) that the only case when that method will be called is if you opt out of background execution. The good news is that in order to kill an app this way, you need to move it to the background first, so the canonical place for teardown is applicationWillResignActive: but you knew that...
EDIT: instructions for avoiding the can't-run-again issue:
Build and Run the app on your device from Xcode
As soon as the app is "up and running", click "stop" in Xcode
When the app has closed, it is now "detached" from Xcode and you can terminate it and re-open as often as you wish. Just keep in mind that it will no longer log to Xcode any NSLog calls or otherwise.

Unable to run instruments on my iphone app on the device

I'm trying everything i can to get instruments to profile my app on the actual iphone device, but it won't work no matter what i do. I tried the solution from Does Instruments (ObjectAlloc/Leaks) require the simulator? but that didn't work. Most of the time i get nothing of use from the console, but one time i did receive this error:
Mon Aug 31 11:27:48 unknown
lockdownd[14] : (0x83d400)
handle_connection: Could not receive
USB message #13 from Instruments.
Killing connection
I'm not sure what could be causing this; has anyone else seen this and know a solution?
Same problem - it worked the first two times, then after that never again (even after restarting Xcode, deleiting the device, etc).
Eventually I resorted to:
Set XCode to display the Console
Run with Performance Tool
(instruments starts, and goes "BEEP"
with no error - Apple "forgot" to
include the error message, I think.
ARGH!)
Build&Run on device
Once the (gdb) appears in console,
go to Instruments and select "Attach
to Process" from the drop-down at
top
If you cannot see the name of your
debugging app, wait a second, and
try again
Eventually your app appears in the
list of alread-running stuff, so
select it
Hit the Record button
On subsequent runs, Instruments will remember the name of your app, but will show an error if you hit "record" too soon. So you just keep hitting record and doing "OK" on the process it tries to connect to until it stops messing around and does what it's supposed to.
So far (20 odd runs) this works everytime. Obviously, it would be nicer if it just worked properly, without this manual hackery, but Apple is reporting zero error messages even to system console, so there's nothing we can do!