Code coverage not showing results using Xcode + gcov
I have been trying to get the Code coverage working for iPhone simulator and always get a 0% coverage. Below are the configuration details and the steps that I have tried.
Configuration
Xcode 3.2.5/iOS 4.1 and iOS 4.2/Mac 10.6/GCC 4.2 Application UICatalog
References
http://www.cubiclemuses.com/cm/articles/2009/05/14/coverstory-on-the-iphone/
http://developer.apple.com/library/mac/#qa/qa2007/qa1514.html
Steps
- Enable “Generate Test Coverage Files”
- Enable “Instrument Program Flow”
- Add “
-lgcov
” to “Other Linker Flags” UIApplicationExitsOnSuspend
flag in Info.plist is set to true
Result
I have the .gcda files generated but the coverage always show 0%.
Settings tried
Changing GCC to 4.0 and 4.2. When I try to change the GCC to 4.0 I get 26 build errors.
Set environment variables
(const char *prefix = "GCOV_PREFIX"; const char *prefixValue = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] cStringUsingEncoding:NSASCIIStringEncoding]; // This gets the filepath to the app's Documents directory const char *prefixStrip = "GCOV_PREFIX_STRIP"; const char *prefixStripValue = "1"; setenv(prefix, prefixValue, 1); // This sets an environment variable which tells gcov where to put the .gcda files. setenv(prefixStrip, prefixStripValue, 1); // This tells gcov to strip the default prefix, and use the filepath that we just declared.)
GCC Optimization set to None (-O0) and unchecked the precompiled prefix 开发者_如何学Goheader file flag.
Thanks for all the info on stackoverfow and CubicleMuses
I have code coverage working for both simulator and device! Here are the steps and configuration that worked for me:
Configuration : Xcode 4 !
XCode project settings
Build Settings
Other Linker Flags: add "-lgcov"
GCC_GENERATE_TEST_COVERAGE_FILES: Set to YES
GCC_INSTRUMENT_PROGRAM_FLOW_ARCS: Set to YES
- C/C++ Compiler Version: GCC 4.2 (if you are on XCode 4) iOS deployment target: 4.2
- Precompile prefix header: NO
Info.plist
- Set UIApplicationExitsOnSuspend flag in your Info.plist to YES
Above steps are same for Simulator and Device however, we have some extra work to make it work on Device.
Main.m: Copy paste the below code to main.m
const char *prefix = "GCOV_PREFIX";
const char *prefixValue = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] cStringUsingEncoding:NSASCIIStringEncoding]; // This gets the filepath to the app's Documents directory
const char *prefixStrip = "GCOV_PREFIX_STRIP";
const char *prefixStripValue = "1";
setenv(prefix, prefixValue, 1); // This sets an environment variable which tells gcov where to put the .gcda files.
setenv(prefixStrip, prefixStripValue, 1); // This tells gcov to strip the default prefix, and use the filepath that we just declared.
Note: Make sure the above code is before:
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
int retVal = UIApplicationMain(argc, argv, nil, nil);
[pool release];
return retVal;
Why we set the above coverage variables?
http://gcc.gnu.org/onlinedocs/gcc/Cross_002dprofiling.html
How to get the .gcda files?
Use the Organizer in Xcode to download app's package from the device to get the .gcda files out of the Documents directory.
Note: I could not get the code coverage using Xcode 3.2.5 with the same settings. But Xcode 4 was a cake-walk :-)
Thanks Sangavi since your answer helped me.
Now the but: I followed your descripition step by step and than I had the problem that no gcda-files were created (only gcdo-files).
After that I removed your (above) prefix-code which I copied in the main.m and everything worked suddenly. Bet the gcov-path was not created correctly or something.
Just posting this if anyone runs into the same issue.
I just figured out after hours of frustration that enabling distributed builds in Xcode 3.2.6 will work around the need to disable your prefix header.
I had the problem that no files were created at all. This was in Xcode 4.1 on Lion.
I changed the compiler from System Default (GCC 4.2)
to GCC 4.2
.
So NOT use the system default.
Seems like a bug in Xcode, but it solved the problem for me.
When i changed back the preference the problem returned.
精彩评论