Apple’s library technology has a long and glorious history, dating all the way back to the origins of Unix. This does, however, mean that it can be a bit confusing to newcomers. This is my attempt to clarify some terminology.
If you have any questions or comments about this, start a new thread and tag it with Linker so that I see it.
Share and Enjoy
—
Quinn “The Eskimo!” @ Developer Technical Support @ Apple
let myEmail = "eskimo" + "1" + "@" + "apple.com"
An Apple Library Primer
Apple’s tools support two related concepts:
Platform — This is the platform itself; macOS, iOS, iOS Simulator, and Mac Catalyst are all platforms.
Architecture — This is a specific CPU architecture used by a platform. arm64 and x86_64 are both architectures.
A given architecture might be used by multiple platforms. The most obvious example of this arm64, which is used by all of the platforms listed above.
Code built for one platform will not work on another platform, even if both platforms use the same architecture.
Code is usually packaged in either a Mach-O file or a static library. Mach-O is used for executables (MH_EXECUTE), dynamic libraries (MH_DYLIB), bundles (MH_BUNDLE), and object files (MH_OBJECT). These can have a variety of different extensions; the only constant is that .o is always used for a Mach-O containing an object file. Use otool and nm to examine a Mach-O file. Use vtool to quickly determine the platform for which it was built. Use size to get a summary of its size. Use dyld_info to get more details about a dynamic library.
IMPORTANT All the tools mentioned here are documented in man pages. For information on how to access that documentation, see Reading UNIX Manual Pages. There’s also a Mach-O man page, with basic information about the file format.
Many of these tools have old and new variants, using the -classic suffix or llvm- prefix, respectively. For example, there’s nm-classic and llvm-nm. If you run the original name for the tool, you’ll get either the old or new variant depending on the version of the currently selected tools. To explicitly request the old or new variants, use xcrun.
The term Mach-O image refers to a Mach-O that can be loaded and executed without further processing. That includes executables, dynamic libraries, and bundles, but not object files.
A dynamic library has the extension .dylib. You may also see this called a shared library.
A framework is a bundle structure with the .framework extension that has both compile-time and run-time roles:
At compile time, the framework combines the library’s headers and its stub library (stub libraries are explained below).
At run time, the framework combines the library’s code, as a Mach-O dynamic library, and its associated resources.
The exact structure of a framework varies by platform. For the details, see Placing Content in a Bundle.
macOS supports both frameworks and standalone dynamic libraries. Other Apple platforms support frameworks but not standalone dynamic libraries.
Historically these two roles were combined, that is, the framework included the headers, the dynamic library, and its resources. These days Apple ships different frameworks for each role. That is, the macOS SDK includes the compile-time framework and macOS itself includes the run-time one. Most third-party frameworks continue to combine these roles.
A static library is an archive of one or more object files. It has the extension .a. Use ar, libtool, and ranlib to inspect and manipulate these archives.
The static linker, or just the linker, runs at build time. It combines various inputs into a single output. Typically these inputs are object files, static libraries, dynamic libraries, and various configuration items. The output is most commonly a Mach-O image, although it’s also possible to output an object file. The linker may also output metadata, such as a link map (see Using a Link Map to Track Down a Symbol’s Origin).
The linker has seen three major implementations:
ld — This dates from the dawn of Mac OS X.
ld64 — This was a rewrite started in the 2005 timeframe. Eventually it replaced ld completely. If you type ld, you get ld64.
ld_prime — This was introduced with Xcode 15. This isn’t a separate tool. Rather, ld now supports the -ld_classic and -ld_new options to select a specific implementation.
Note During the Xcode 15 beta cycle these options were -ld64 and -ld_prime. I continue to use those names because the definition of new changes over time (some of us still think of ld64 as the new linker ;–).
The dynamic linker loads Mach-O images at runtime. Its path is /usr/lib/dyld, so it’s often referred to as dyld, dyld, or DYLD. Personally I pronounced that dee-lid, but some folks say di-lid and others say dee-why-el-dee.
IMPORTANT Third-party executables must use the standard dynamic linker.
Other Unix-y platforms support the notion of a statically linked executable, one that makes system calls directly. This is not supported on Apple platforms. Apple platforms provide binary compatibility via system dynamic libraries and frameworks, not at the system call level.
Note Apple platforms have vestigial support for custom dynamic linkers (your executable tells the system which dynamic linker to use via the LC_LOAD_DYLINKER load command). This facility originated on macOS’s ancestor platform and has never been a supported option on any Apple platform.
The dynamic linker has seen 4 major revisions. See WWDC 2017 Session 413 (referenced below) for a discussion of versions 1 through 3. Version 4 is basically a merging of versions 2 and 3.
The dyld man page is chock-full of useful info, including a discussion of how it finds images at runtime.
Every dynamic library has an install name, which is how the dynamic linker identifies the library. Historically that was the path where you installed the library. That’s still true for most system libraries, but nowadays a third-party library should use an rpath-relative install name. For more about this, see Dynamic Library Identification.
Mach-O images are position independent, that is, they can be loaded at any location within the process’s address space. Historically, Mach-O supported the concept of position-dependent images, ones that could only be loaded at a specific address. While it may still be possible to create such an image, it’s no longer a good life choice.
Mach-O images have a default load address, also known as the base address. For modern position-independent images this is 0 for library images and 4 GiB for executables (leaving the bottom 32 bits of the process’s address space unmapped). When the dynamic linker loads an image, it chooses an address for the image and then rebases the image to that address. If you take that address and subtract the image’s load address, you get a value known as the slide.
Xcode 15 introduced the concept of a mergeable library. This a dynamic library with extra metadata that allows the linker to embed it into the output Mach-O image, much like a static library. Mergeable libraries have many benefits. For all the backstory, see WWDC 2023 Session 10268 Meet mergeable libraries. For instructions on how to set this up, see Configuring your project to use mergeable libraries.
If you put a mergeable library into a framework structure you get a mergeable framework.
Xcode 15 also introduced the concept of a static framework. This is a framework structure where the framework’s dynamic library is replaced by a static library.
Note It’s not clear to me whether this offers any benefit over creating a mergeable framework.
Earlier versions of Xcode did not have proper static framework support. That didn’t stop folks trying to use them, which caused all sorts of weird build problems.
A universal binary is a file that contains multiple architectures for the same platform. Universal binaries always use the universal binary format. Use the file command to learn what architectures are within a universal binary. Use the lipo command to manipulate universal binaries.
A universal binary’s architectures are either all in Mach-O format or all in the static library archive format. The latter is called a universal static library.
A universal binary has the same extension as its non-universal equivalent. That means a .a file might be a static library or a universal static library.
Most tools work on a single architecture within a universal binary. They default to the architecture of the current machine. To override this, pass the architecture in using a command-line option, typically -arch or --arch.
An XCFramework is a single document package that includes libraries for any combination of platforms and architectures. It has the extension .xcframework. An XCFramework holds either a framework, a dynamic library, or a static library. All the elements must be the same type. Use xcodebuild to create an XCFramework. For specific instructions, see Xcode Help > Distribute binary frameworks > Create an XCFramework.
Historically there was no need to code sign libraries in SDKs. If you shipped an SDK to another developer, they were responsible for re-signing all the code as part of their distribution process. Xcode 15 changes this. You should sign your SDK so that a developer using it can verify this dependency. For more details, see WWDC 2023 Session 10061 Verify app dependencies with digital signatures and Verifying the origin of your XCFrameworks.
A stub library is a compact description of the contents of a dynamic library. It has the extension .tbd, which stands for text-based description (TBD). Apple’s SDKs include stub libraries to minimise their size; for the backstory, read this post. Use the tapi tool to create and manipulate stub libraries. In this context TAPI stands for a text-based API, an alternative name for TBD. Oh, and on the subject of tapi, I’d be remiss if I didn’t mention tapi-analyze!
Stub libraries currently use YAML format, a fact that’s relevant when you try to interpret linker errors. If you’re curious about the format, read the tapi-tbdv4 man page. There’s also a JSON variant documented in the tapi-tbdv5 man page.
Note Back in the day stub libraries used to be Mach-O files with all the code removed (MH_DYLIB_STUB). This format has long been deprecated in favour of TBD.
Historically, the system maintained a dynamic linker shared cache, built at runtime from its working set of dynamic libraries. In macOS 11 and later this cache is included in the OS itself. Libraries in the cache are no longer present in their original locations on disk:
% ls -lh /usr/lib/libSystem.B.dylib
ls: /usr/lib/libSystem.B.dylib: No such file or directory
Apple APIs, most notably dlopen, understand this and do the right thing if you supply the path of a library that moved into the cache. That’s true for some, but not all, command-line tools, for example:
% dyld_info -exports /usr/lib/libSystem.B.dylib
/usr/lib/libSystem.B.dylib [arm64e]:
-exports:
offset symbol
…
0x5B827FE8 _mach_init_routine
% nm /usr/lib/libSystem.B.dylib
…/nm: error: /usr/lib/libSystem.B.dylib: No such file or directory
When the linker creates a Mach-O image, it adds a bunch of helpful information to that image, including:
The target platform
The deployment target, that is, the minimum supported version of that platform
Information about the tools used to build the image, most notably, the SDK version
A build UUID
For more information about the build UUID, see TN3178 Checking for and resolving build UUID problems. To dump the other information, run vtool.
In some cases the OS uses the SDK version of the main executable to determine whether to enable new behaviour or retain old behaviour for compatibility purposes. You might see this referred to as compiled against SDK X. I typically refer to this as a linked-on-or-later check.
Apple tools support the concept of autolinking. When your code uses a symbol from a module, the compiler inserts a reference (using the LC_LINKER_OPTION load command) to that module into the resulting object file (.o). When you link with that object file, the linker adds the referenced module to the list of modules that it searches when resolving symbols.
Autolinking is obviously helpful but it can also cause problems, especially with cross-platform code. For information on how to enable and disable it, see the Build settings reference.
Mach-O uses a two-level namespace. When a Mach-O image imports a symbol, it references the symbol name and the library where it expects to find that symbol. This improves both performance and reliability but it precludes certain techniques that might work on other platforms. For example, you can’t define a function called printf and expect it to ‘see’ calls from other dynamic libraries because those libraries import the version of printf from libSystem.
To help folks who rely on techniques like this, macOS supports a flat namespace compatibility mode. This has numerous sharp edges — for an example, see the posts on this thread — and it’s best to avoid it where you can. If you’re enabling the flat namespace as part of a developer tool, search the ’net for dyld interpose to learn about an alternative technique.
WARNING Dynamic linker interposing is not documented as API. While it’s a useful technique for developer tools, do not use it in products you ship to end users.
Apple platforms use DWARF. When you compile a file, the compiler puts the debug info into the resulting object file. When you link a set of object files into a executable, dynamic library, or bundle for distribution, the linker does not include this debug info. Rather, debug info is stored in a separate debug symbols document package. This has the extension .dSYM and is created using dsymutil. Use symbols to learn about the symbols in a file. Use dwarfdump to get detailed information about DWARF debug info. Use atos to map an address to its corresponding symbol name.
Different languages use different name mangling schemes:
C, and all later languages, add a leading underscore (_) to distinguish their symbols from assembly language symbols.
C++ uses a complex name mangling scheme. Use the c++filt tool to undo this mangling.
Likewise, for Swift. Use swift demangle to undo this mangling.
For a bunch more info about symbols in Mach-O, see Understanding Mach-O Symbols. This includes a discussion of weak references and weak definition. If your code is referencing a symbol unexpectedly, see Determining Why a Symbol is Referenced.
To remove symbols from a Mach-O file, run strip. To hide symbols, run nmedit.
It’s common for linkers to divide an object file into sections. You might find data in the data section and code in the text section (text is an old Unix term for code). Mach-O uses segments and sections. For example, there is a text segment (__TEXT) and within that various sections for code (__TEXT > __text), constant C strings (__TEXT > __cstring), and so on.
Over the years there have been some really good talks about linking and libraries at WWDC, including:
WWDC 2023 Session 10268 Meet mergeable libraries
WWDC 2022 Session 110362 Link fast: Improve build and launch times
WWDC 2022 Session 110370 Debug Swift debugging with LLDB
WWDC 2021 Session 10211 Symbolication: Beyond the basics
WWDC 2019 Session 416 Binary Frameworks in Swift — Despite the name, this covers XCFrameworks in depth.
WWDC 2018 Session 415 Behind the Scenes of the Xcode Build Process
WWDC 2017 Session 413 App Startup Time: Past, Present, and Future
WWDC 2016 Session 406 Optimizing App Startup Time
Note The older talks are no longer available from Apple, but you may be able to find transcripts out there on the ’net.
Historically Apple published a document, Mac OS X ABI Mach-O File Format Reference, or some variant thereof, that acted as the definitive reference to the Mach-O file format. This document is no longer available from Apple. If you’re doing serious work with Mach-O, I recommend that you find an old copy. It’s definitely out of date, but there’s no better place to get a high-level introduction to the concepts. The Mach-O Wikipedia page has a link to an archived version of the document.
For the most up-to-date information about Mach-O, see the declarations and doc comments in <mach-o/loader.h>.
Revision History
2025-08-04 Added a link to Determining Why a Symbol is Referenced.
2025-06-29 Added information about autolinking.
2025-05-21 Added a note about the legacy Mach-O stub library format (MH_DYLIB_STUB).
2025-04-30 Added a specific reference to the man pages for the TBD format.
2025-03-01 Added a link to Understanding Mach-O Symbols. Added a link to TN3178 Checking for and resolving build UUID problems. Added a summary of the information available via vtool. Discussed linked-on-or-later checks. Explained how Mach-O uses segments and sections. Explained the old (-classic) and new (llvm-) tool variants. Referenced the Mach-O man page. Added basic info about the strip and nmedit tools.
2025-02-17 Expanded the discussion of dynamic library identification.
2024-10-07 Added some basic information about the dynamic linker shared cache.
2024-07-26 Clarified the description of the expected load address for Mach-O images.
2024-07-23 Added a discussion of position-independent images and the image slide.
2024-05-08 Added links to the demangling tools.
2024-04-30 Clarified the requirement to use the standard dynamic linker.
2024-03-02 Updated the discussion of static frameworks to account for Xcode 15 changes. Removed the link to WWDC 2018 Session 415 because it no longer works )-:
2024-03-01 Added the WWDC 2023 session to the list of sessions to make it easier to find. Added a reference to Using a Link Map to Track Down a Symbol’s Origin. Made other minor editorial changes.
2023-09-20 Added a link to Dynamic Library Identification. Updated the names for the static linker implementations (-ld_prime is no more!). Removed the beta epithet from Xcode 15.
2023-06-13 Defined the term Mach-O image. Added sections for both the static and dynamic linkers. Described the two big new features in Xcode 15: mergeable libraries and dependency verification.
2023-06-01 Add a reference to tapi-analyze.
2023-05-29 Added a discussion of the two-level namespace.
2023-04-27 Added a mention of the size tool.
2023-01-23 Explained the compile-time and run-time roles of a framework. Made other minor editorial changes.
2022-11-17 Added an explanation of TAPI.
2022-10-12 Added links to Mach-O documentation.
2022-09-29 Added info about .dSYM files. Added a few more links to WWDC sessions.
2022-09-21 First posted.
General
RSS for tagDive into the vast array of tools and services available to developers.
Selecting any option will automatically load the page
Post
Replies
Boosts
Views
Activity
I want to upload my App logo. I am using Expo and I am not sure how to get my logo up? Please help.
Topic:
Developer Tools & Services
SubTopic:
General
I regularly see questions from folks who’ve run into problems with their third-party IDE on macOS. Specifically, the issue is that their IDE is invoking Apple’s command-line tools — things like clang and ld — and that’s failing in some way. This post collects my ideas on how to investigate, and potentially resolve, issues like this.
If you have any questions or comments, please put them in a new thread here on DevForums. Tag it appropriately so that I see it. Good tags include Compiler, Linker, LLVM, and Command Line Tools.
Share and Enjoy
—
Quinn “The Eskimo!” @ Developer Technical Support @ Apple
let myEmail = "eskimo" + "1" + "@" + "apple.com"
Investigating Third-Party IDE Integration Problems
Many third-party IDEs rely on Apple tools. For example, the IDE might run clang to compile C code or run ld to link object files. These IDEs typically don’t include the tools themselves. Rather, they rely on you to install Xcode or Apple’s Command Line Tools package. These are available at Apple > Developer > Downloads
Occasionally I see folks having problems with this. They most typically report that basic stuff, like compiling a simple C program, fails with some mysterious error. If you’re having such a problem, follow the steps below to investigate it.
IMPORTANT Some IDEs come with their own tools for compiling and linking. Such IDEs are not the focus of this post. If you have problems with an IDE like that, contact its vendor.
Select Your Tools
macOS has a concept of the current command-line tools. This can either point to the tools within Xcode or to an installed Command Line Tools package. To see which tools are currently selected, run xcode-select with the --print-path argument. This is what you’ll see if you have Xcode installed in the Applications folder:
% xcode-select --print-path
/Applications/Xcode.app/Contents/Developer
Note All of the tools I discuss here are documented in man pages. If you’re not familiar with those, see Reading UNIX Manual Pages.
And this is what you’ll see with a Command Line Tools package selected.
% xcode-select --print-path
/Library/Developer/CommandLineTools
There are two common problems with this:
It points to something you’ve deleted.
It points to something unexpected.
Run the command above to see the current state. If necessary, change the state using the --switch option. For example:
% xcode-select --print-path
/Applications/Xcode.app/Contents/Developer
% clang -v
Apple clang version 14.0.3 (clang-1403.0.22.14.1)
…
% sudo xcode-select --switch ~/XcodeZone/Xcode-beta.app
% clang -v
Apple clang version 15.0.0 (clang-1500.0.38.1)
…
I have Xcode 14.3 in the Applications folder and thus clang runs Clang 14.0.3. I have Xcode 15.0b5 in ~/XcodeZone, so switching to that yields Clang 15.0.0.
It’s possible to run one specific command with different tools. See Select Your Tools Temporarily, below.
Run a Simple Test
A good diagnostic test is to use the selected command-line tools to compile a trivial test program. Consider this C [1] example:
% cat hello.c
#include <stdio.h>
int main(int argc, char ** argv) {
printf("Hello Cruel World!\n");
return 0;
}
% clang -o hello hello.c
% ./hello
Hello Cruel World!
IMPORTANT If possible, run this from Terminal rather than, say, over SSH.
You may need to expand this test program to exercise your specific case. For example, if your program is hitting an error when it tries to import the Core Foundation framework, add that import to your test program:
% cat hello.c
#include <stdio.h>
#include <CoreFoundation/CoreFoundation.h>
int main(int argc, char ** argv) {
printf("Hello Cruel World!\n");
return 0;
}
When you compile your test program, you might see one of these results:
Your test program compiles.
Your test program fails with a similar error.
Your test program fails with a different error.
I’ll explore each case in turn.
[1] For a C++ example, see C++ Issues, below.
If your test program compiles…
If your test program compiles from the shell, that proves that your basic command-line tools setup is fine. If the same program fails to compile in your IDE, there’s something IDE-specific going on here. I can’t help you with that. I recommend that you escalate the issue via the support channel for your IDE.
If your test program fails with a similar error…
If your test program fails with an error similar to the one you’re seeing in your IDE, there are two possibilities:
There’s a bug in your test program’s code.
There’s an environmental issue that’s affecting your command-line tools setup.
Don’t rule out the first possibility. I regularly see folks bump into problems like this, where it turns out to be a bug in their code. For a specific example, see C++ Issues, below.
Assuming, however, that your test program’s code is OK, it’s time to investigate environmental issues. See Vary Your Environment, below.
If your test program fails with a different error…
If your test program fails with a different error, look at the test program’s code to confirm that it’s correct, and that it accurately reflects the code you’re trying to run in your IDE.
Vary Your Environment
If your test program fails with the same error as you’re seeing in your IDE, and you are sure that the code is correct, it’s time to look for environmental factors. I typically do this with the steps described in the next sections, which are listed from most to least complex.
These steps only tell you where things are going wrong, not what is going wrong. However, that’s often enough to continue the investigation of your issue.
Vary Your Shell
Try running your commands in a different shell. macOS’s default shell is zsh. Try running your commands in bash instead:
% bash
…
bash-3.2$ clang -o hello hello.c
bash-3.2$ ./hello
Hello Cruel World!
Or if you’ve switched your shell to bash, try it in zsh.
Vary Your User Account
Some problems are caused by settings tied to your user account. To investigate whether that’s an issue here:
Use System Settings > Users & Groups to create a new user.
Log in as that user.
Run your test again.
Vary Your Mac
Some problems are system wide, so you need to test on a different Mac. The easiest way to do that is to set up a virtual machine (VM) and run your test there. Or, if you have a separate physical Mac, run your test on that.
Vary Your Site
If you’re working for an organisation, they may have installed software on your Mac that causes problems. If you have a Mac at home, try running your test there.
It’s also possible that your network is causing problems [1]. If you have a laptop, try taking it to a different location to see if that changes things.
[1] I rarely see this when building a simple test program, but it do see it with other stuff, like code signing.
C++ Issues
If you’re using C++, here’s a simple test you can try:
% cat hello.cpp
#include <iostream>
int main()
{
std::cout << "Hello Cruel World!\n";
}
% clang++ -o hello hello.cpp
% ./hello
Hello Cruel World!
A classic problem with C++ relates to name mangling. Consider this example:
% cat hello.c
#include <stdio.h>
#include "hello-core.h"
int main(int argc, char ** argv) {
HCSayHello();
return 0;
}
% cat hello-core.cpp
#include "hello-core.h"
#include <iostream>
extern void HCSayHello() {
std::cout << "Hello Cruel World!\n";
}
% cat hello-core.h
extern void HCSayHello();
% clang -c hello.c
% clang++ -c hello-core.cpp
% clang++ -o hello hello.o hello-core.o
Undefined symbols for architecture x86_64:
"_HCSayHello", referenced from:
_main in hello.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
The issue here is that C++ generates a mangled name for HCSayHello:
% nm hello-core.o | grep HCSayHello
0000000000000000 T __Z10HCSayHellov
whereas C uses the non-mangled name:
% nm hello.o | grep HCSayHello
U _HCSayHello
The fix is an appropriate application of extern "C":
% cat hello-core.h
extern "C" {
extern void HCSayHello();
};
Select Your Tools Temporarily
Sometimes you want to temporarily run a command from a particular tools package. To continue my earlier example, I currently have Xcode 14.3 installed in the Applications folder and Xcode 15.0b5 in ~/XcodeZone. Xcode 14.3 is the default but I can override that with the DEVELOPER_DIR environment variable:
% clang -v
Apple clang version 14.0.3 (clang-1403.0.22.14.1)
…
% DEVELOPER_DIR=~/XcodeZone/Xcode-beta.app/Contents/Developer clang -v
Apple clang version 15.0.0 (clang-1500.0.38.1)
…
Revision History
2025-01-27 Remove the full width characters. These were a workaround for a forums platform bug that’s since been fixed. Made other minor editorial changes.
2023-07-31 First posted.
Topic:
Developer Tools & Services
SubTopic:
General
Tags:
xcselect
Compiler
Linker
Command Line Tools
When I try to install packages through spm it doesn't find the packages.swift file, and with pods I have problems with Foundation. Trying to install Firebase shows that many pods have issues with double quotes. I don't know if it's my PC using everything updated or what, but I'm having a lot of problems and I haven't been able to reconcile my first application. I don't want to give up, and I would like some advice, since you have managed it, I would appreciate some help. I have followed tutorials, cases of people with similar problems, but it always throws some error.
My pc is mac m1
From some point, all new TestFlight submissions cannot be downloaded from any device. The progress bar gets stuck at 75% for several seconds, then install button appears again. The app icon appears on desktop, but when trying to launch, an error alert appears "App cannot be installed now, please try again later". I've tried uploading from multiple Macs with the same result.
Hi,
is there a compiled version of MailCore.swift? I want to build an easy-to-use mail app for my mother, who is 97, has a MacBook Air, but Apple Mail is too complicated for her. chatGPT said I am too stupid to compile it by myself.
Regards Stephan
I admit I am doing something unusual, and I would not be surprised if it didn't work. I am surprised, however, because after performing the equivalent operations on four bundles, all of the bundles work fine on macOS 15.6.1, but only two of them work on macOS 26.1 (beta 2). I don't know what causes the different outcomes.
What I am trying to do is get Java to pass the macOS 26 AppKit UI SDK linkage checking without having to rebuild the JDK using Xcode 26. Rebuilding works for the latest SDK, but it is very inconvenient and may not work for older JDKs. It usually takes a while before the JDK build team successfully transitions to a new Xcode release.
My approach is to use vtool to update the sdk version in the LC_BUILD_VERSION load command of $JAVA_HOME/bin/java, which is the launching executable for the JDK.
I performed this operation on four JDKs: 25, 21, 17, and 11. (I ran vtool on macOS 15.)
It was completely successful on JDK 25 and 21. The JDK launches correctly on macOS 15 and macOS 26. On macOS 26, AppKit uses the new UI, which is the desired outcome. The JDK runs despite that fact that I signed the modified $JAVA_HOME/bin/java with my developer ID, which is inconsistent with the JDK bundle signature. (Redoing the bundle signing is part of the JDK build process; if that were necessary, I would stick with rebuilding the JDK.)
The operation was not successful on JDK 17 and 11. I noticed two problems, which are not obviously related.
When vtool created the new version of the java program, it lost the tool definition.
$ vtool -show-build-version java
java:
Load command 10
cmd LC_BUILD_VERSION
cmdsize 32
platform MACOS
minos 11.0
sdk 11.1
ntools 1
tool LD
version 609.8
$ vtool -set-build-version 1 10.0 26.0 -output a.out java
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/vtool warning: code signature will be invalid for a.out
$ vtool -show-build-version a.out
a.out:
Load command 22
cmd LC_BUILD_VERSION
cmdsize 24
platform MACOS
minos 10.0
sdk 26.0
ntools 0
Adding back the tool definition didn't seem to matter.
When I try to run the revised executable (in the context of the JDK bundle), it works on macOS 15, but on macOS 26, it is rejected as damaged. If I run the revised executable outside the JDK bundle, it runs (but fails because it can't find the rest of the JDK, which is expected).
In all cases, GateKeeper rejects the revised executable because it has not been notarized, but that doesn't seem to stop the program from executing.
Topic:
Developer Tools & Services
SubTopic:
General
Tags:
macOS
Linker
Gatekeeper
Signing Certificates
I have been trying to subscribe a few times from Japan, being a foreigner and i amunable to get validated despite my residence card. it feels a bit difficult to navigate this walkthrough.
Topic:
Developer Tools & Services
SubTopic:
General
I received this message when trying to submit a build using Rork.com. Can anyone tell me what this is and how to fix it?
There is a problem with the request entity - You are not allowed to create 'iOS' profile with App ID 'XXXXXXXX'.
✖ Failed to create Apple provisioning profile
Error: build command failed.
Topic:
Developer Tools & Services
SubTopic:
General
How do I download the iPad Air (5th generation) 18.3 simulator? I activated my Mac and only have version 18.2 available.
I need to test the simulator that they are testing, but I can't because I don't have version 18.3 available. I only have the iPad version 18.2 available and the application works fine on that version.
I have already added logs in different parts of the application, but in the files that you shared with me no log appears. The macOS operating system is macOS Drought.
Topic:
Developer Tools & Services
SubTopic:
General
This browser extension is a doc reading enhancer for the Apple Developer website.
It supports i18n translation, hover link previews, and bilingual display.
Currently, it supports four languages: ja-JP, ko-KR, zh-CN, and zh-TW.
It works with Swift/SwiftUI/Foundation modules now, and it's expected to support Swift Test, Swift Charts, UIKit, Swift Playground, and XCode modules by the end of this month.
For more info, check out: https://appledocs.dev.
You can also visit https://appledocs.dev/progress to see translation progress and vote.
Note: It's only works on Chrome、Edge(In review)、Firefox(In review)
Screenshot:
Topic:
Developer Tools & Services
SubTopic:
General
Tags:
Swift Packages
Developer Tools
Safari Extensions
Apple Intelligence
Lcov config file (.lcovrc) is not present in below default locations: ~./lcovrc
How to link manually created lcovrc file to lcov to customise the behaviour of lcov?
I am integrating On Demand Resources into my Unity game. The resources install without any problems if the internet connection is stable: all resources are installed. While testing various scenarios without an internet connection, I encountered the following problem: if I turn off the internet during installation, I don't get any error messages, but if I turn the internet back on, the download no longer continues (and I still don't get an error). If I reopen the application with a stable internet connection, the download will always be at 0%. Please tell me what I am doing wrong.
#import "Foundation/Foundation.h"
#if ENABLE_IOS_ON_DEMAND_RESOURCES
#import "Foundation/NSBundle.h"
#endif
#include <string.h>
struct CustomOnDemandResourcesRequestData;
typedef void (*CustomOnDemandResourcesRequestCompleteHandler)(struct CustomOnDemandResourcesRequestData* handler, const char* error);
#if ENABLE_IOS_ON_DEMAND_RESOURCES
struct CustomOnDemandResourcesRequestData
{
NSBundleResourceRequest* request;
};
extern "C" CustomOnDemandResourcesRequestData* CustomOnDemandResourcesCreateRequest(const char* const* tags, int tagCount, CustomOnDemandResourcesRequestCompleteHandler handler)
{
NSMutableArray* tagArray = [NSMutableArray array];
for (int i = 0; i < tagCount; i++) {
const char* tag = tags[i];
if (tag != NULL) {
[tagArray addObject:[NSString stringWithUTF8String:tag]];
}
}
NSSet* tagSet = [NSSet setWithArray:tagArray];
CustomOnDemandResourcesRequestData* data = new CustomOnDemandResourcesRequestData();
data->request = [[NSBundleResourceRequest alloc] initWithTags:tagSet];
[data->request beginAccessingResourcesWithCompletionHandler:^(NSError* error) {
dispatch_async(dispatch_get_main_queue(), ^{
const char* errorMessage = error ? [[error localizedDescription] UTF8String] : NULL;
handler(data, errorMessage);
});
}];
return data;
}
extern "C" void CustomOnDemandResourcesRelease(CustomOnDemandResourcesRequestData* data)
{
[data->request endAccessingResources];
delete data;
}
extern "C" float CustomOnDemandResourcesGetProgress(CustomOnDemandResourcesRequestData* data)
{
return data->request.progress.fractionCompleted;
}
extern "C" float CustomOnDemandResourcesGetLoadingPriority(CustomOnDemandResourcesRequestData* data)
{
float priority = (float)data->request.loadingPriority;
return priority;
}
extern "C" void CustomOnDemandResourcesSetLoadingPriority(CustomOnDemandResourcesRequestData* data, float priority)
{
if (priority < 0.0f)
priority = 0.0f;
if (priority > 1.0f)
data->request.loadingPriority = NSBundleResourceRequestLoadingPriorityUrgent;
else
data->request.loadingPriority = (double)priority;
}
extern "C" const char* CustomOnDemandResourcesGetResourcePath(CustomOnDemandResourcesRequestData * data, const char* resource)
{
NSString* resourceStr = [NSString stringWithUTF8String: resource];
NSString* path = [[data->request bundle] pathForResource: resourceStr ofType: nil];
if (path == nil) {
return NULL; // или другое значение по умолчанию
}
const char* result = strdup([path UTF8String]); // копируем строку
return result; // в C# нужно будет освободить память
}
extern "C" void CustomOnDemandResourcesFreeString(const char* str) {
free((void*)str);
}
#else // ENABLE_IOS_ON_DEMAND_RESOURCES
struct CustomOnDemandResourcesRequestData
{
};
extern "C" CustomOnDemandResourcesRequestData* CustomOnDemandResourcesCreateRequest(const char* const* tags, int tagCount, CustomOnDemandResourcesRequestCompleteHandler handler)
{
CustomOnDemandResourcesRequestData* data = new CustomOnDemandResourcesRequestData();
if (handler)
handler(handlerData, NULL);
return data;
}
extern "C" void CustomOnDemandResourcesRelease(CustomOnDemandResourcesRequestData* data)
{
delete data;
}
extern "C" float CustomOnDemandResourcesGetProgress(CustomOnDemandResourcesRequestData* data)
{
return 0.0f;
}
extern "C" float CustomOnDemandResourcesGetLoadingPriority(CustomOnDemandResourcesRequestData* data)
{
return 0.0f;
}
extern "C" void CustomOnDemandResourcesSetLoadingPriority(CustomOnDemandResourcesRequestData* data, float priority)
{
}
extern "C" const char* CustomOnDemandResourcesGetResourcePath(CustomOnDemandResourcesRequestData * data, const char* resource)
{
return NULL;
}
extern "C" void CustomOnDemandResourcesFreeString(const char* str) {
}
#endif // ENABLE_IOS_ON_DEMAND_RESOURCES
Hello,
There seems to be a regression with macOS SDK 15 and dynamically loading libraries if Address Sanitizer is turned on. Seems to only affect Debug builds, and .frameworks. I've also reported this via the Feedback Assistant: FB16513866
Here's a minimal repro, if anyone is interested: https://gist.github.com/peter-esik/6b00432e411be85333e14ae7d953966e
I thought I'd post this here, as according to my web searches, this isn't a very well-known bug at this point.
I am working on a hobby project to develop my own Bluetooth peripheral. The platform for this peripheral is a Espressif ESP32-based TinyS3 from Unexpected Maker. I have defined the bluetooth device & service information using custom UUIDs. Using nRF Connect or Light Blue mobile applications I can discover and connect to my device. I receive confirmation of this BLE connection and modifications to the my BLE Service from my code on my TinyS3.
I am attempting to write a custom software program that uses the onboard Mac Bluetooth hardware to detect this device. I am technically using Qt's Bluetooth infrastructure via PySide6 [python].
Despite being able to see my device in the mobile BLE applications, my software as well as the Mac Bluetooth System Services does not detect my BLE device.
I am broadcasting advertising messages at a 250ms rate, and since they are findable by these mobile applications, I am wondering if MacOS has specific requirements for advertising data for what it considers as a "legitimate/ connectable" device.
Any help would be greatly appreciated. Thank you!
I created a fairplay.cer file using the below commands :
openssl genrsa -out private_key.pem 1024
openssl req -new -key private_key.pem -out request.csr
Here, I manually entered the Country, Organization, etc.
I was supposed to use the below commands to make the same :
openssl genrsa -aes256 -out privatekey.pem 1024
opensslreq-new-sha1-keyprivatekey.pem-outcertreq.csr-subj
"/CN=SubjectName /OU=OrganizationalUnit /O=Organization /C=US"
Owing to this, I am unable to create a .p12 file through Keychain Access. I thus want to generate a new fairplay.cer file for Fairplay 4.x. I want to revoke the certificate in order to generate a new one (as it has a limit of 1 certificate for Fairplay)
Requesting developer support from Apple. Have raised multiple requests over the past 4 days.
i am trying to create key for apn file to use it in firebase fcm for my app but when click on download this error occured
Download Failed Auth Key can only be downloaded once. This auth key has already been downloaded.
what should i do ?
Topic:
Developer Tools & Services
SubTopic:
General
The iPhone set display and brightness to automatic, the App is placed in the dock column at the bottom of the desktop, and the icon showing the dark mode appears in the light mode. Is this a system problem?
device: iPhone 16 pro max
system version: 18.2
Topic:
Developer Tools & Services
SubTopic:
General
I regularly bump into folks confused by this issue, so I thought I’d collect my thoughts on the topic into a single (hopefully) coherent post.
If you have questions or comments, put them in a new thread here on the forums. Feel free to use whatever subtopic and tags that apply to your situation, but make sure to add the Debugging tag so that I see your thread go by.
Share and Enjoy
—
Quinn “The Eskimo!” @ Developer Technical Support @ Apple
let myEmail = "eskimo" + "1" + "@" + "apple.com"
Testing and Debugging Code Running in the Background
I regularly see questions like this:
My background code works just fine in Xcode but fails when I download the app from the App Store.
or this:
… or fails when I run my app from the Home screen.
or this:
How do I step through my background code?
These suggest a fundamental misunderstanding of how the debugger interacts with iOS’s background execution model. The goal of this post is to explain that misunderstanding so that you can effectively test and debug background code.
Note The focus of this post is iOS. The advice here generally applies to any of iOS’s ‘child’ platforms, so iPadOS, tvOS, and so on. However, there will be some platform specific differences, especially on watchOS. This advice here doesn’t apply to macOS. It’s background execution model is completely different than the one used by iOS.
Understand the Fundamentals
The key point to note here is that the debugger prevents your app from suspending. This has important consequences for iOS’s background execution model. Normally:
iOS suspends your app when it’s in the background.
Once your app is suspended, it becomes eligible for termination. The most common reason for this is that the system wants to recover memory, but it can happen for various other reasons. For example, the system might terminate a suspended app in order to update it.
Under various circumstances your app can continue running after moving to the background. A great example of this is the continued processed task feature, introduced in iOS 26 beta.
Alternatively, your app can be resumed or relaunched in the background to perform some task. For example, the region monitor feature of Core Location can resume or relaunch your app in the background when the user enters or leaves a region.
If no app needs to be executing, the system can sleep the CPU.
None of this happens in the normal way if the debugger is attached to your app, and it’s vital that you take that into account when debugging code that runs in the background.
An Example of the Problem
For an example of how this can cause problems, imagine an app that uses an URLSession background session. A background session will resume or relaunch your app in the background when specific events happen. This involves two separate code paths:
If your app is suspended, the session resumes it in the background.
If your app is terminated, it relaunches it in the background.
Neither code path behaves normally if the debugger is attached. In the first case, the app never suspends, so the resume case isn’t properly exercised. Rather, your background session acts like it would if your app were in the foreground. Normally this doesn’t cause too many problems, so this isn’t a huge concern.
On the other hand, the second case is much more problematic. The debugger prevents your app from suspending, and hence from terminating, and thus you can’t exercise this code path at all.
Seek Framework-Specific Advice
The above is just an example, and there are likely other things to keep in mind when debugging background code for a specific framework. Consult the documentation for the framework you’re working with to see if it has specific advice.
Note For URLSession background sessions, check out Testing Background Session Code.
The rest of this post focuses on the general case, offering advice that applies to all frameworks that support background execution.
Run Your App Outside of Xcode
When debugging background execution, launch your app from the Home screen. For day-to-day development:
Run the app from Xcode in the normal way (Product > Run).
Stop it.
Run it again from the Home screen.
Alternatively, install a build from TestFlight. This accurately replicates the App Store install experience.
Write Code with Debugging in Mind
It’s obvious that, if you run the app without attaching the debugger, you won’t be able to use the debugger to debug it. Rather:
Extract the core logic of your code into libraries, and then write extensive unit tests for those libraries. You’ll be able to debug these unit tests with the debugger.
Add log points to help debug your integration with the system.
Treat your logging as a feature of your product. Carefully consider where to add log points and at what level to log. Check this logging code into your source code repository and ship it — or at least the bulk of it — as part of your final product. This logging will be super helpful when it comes to debugging problems that only show up in the field.
My general advice is that you use the system log for these log points. See Your Friend the System Log for lots of advice on that front.
One of the great features of the system log is that disabled log points are very cheap. In most cases it’s fine to leave these in your final product.
Attach and Detach
In some cases it really is helpful to debug with the debugger. One option here is to attach to your running app, debug a specific thing, and then detach from it. Specifically:
To attach to a running app, choose Debug > Attach to Process > YourAppName in Xcode.
To detach, choose Debug > Detach.
Understand Force Quit
iOS allows users to remove an app from the multitasking UI. This is commonly known as force quit, but that’s not a particularly accurate term:
The multitasking UI doesn’t show apps that are running, it shows apps that have been run by the user. The UI shows recently run apps regardless of whether they’re in the foreground, running in the background, suspended, or terminated. So, removing an app from the UI may not actually quit anything.
Removing an app sets a flag that prevents the app from being launched in the background. That flag gets cleared when the user next launches the app manually.
Note In some circumstances iOS will not honour this flag. The exact cases where this happens are not documented and have changed over time.
Keep these behaviours in mind as you debug your background execution code. For example, imagine you’re trying to test the URLSession background relaunch code path discussed above. If you force quit your app, you’ll never hit this code path because iOS won’t relaunch your app in the background. Rather, add a debug-only button that causes your app to call exit.
IMPORTANT This suggestion is for debugging only. Don’t include a Quit button in your final app! This is specifically proscribed by QA1561.
Alternatively, if you’re attached to your app with Xcode, simply choose Product > Stop. This is like calling exit; it has no impact on your app’s ability to run in the background.
Test With Various Background App Refresh Settings
iOS puts users in control of background execution via the options in Settings > General > Background App Refresh. Test how your app performs with the following settings:
Background app refresh turned off overall
Background app refresh turned on in general but turned off for your app
Background app refresh turned on in general and turned on for your app
IMPORTANT While these settings are labelled Background App Refresh, they affect subsystems other than background app refresh. Test all of these cases regardless of what specific background execution feature you’re using.
Test Realistic User Scenarios
In many cases you won’t be able to fully test background execution code at your desk. Rather, install a TestFlight build of your app and then use the device as a normal user would. For example:
To test Core Location background execution properly, actual leave your office and move around as a user might.
To test background app refresh, use your app regularly during the day and then put your device on charge at night.
Testing like this requires two things:
Patience
Good logging
The system log may be sufficient here, but you might need to investigate other logging solutions that are more appropriate for your product.
These testing challenges are why it’s critical that you have unit tests to exercise your core logic. It takes a lot of time to run integration tests like this, so you want to focus on integration issues. Before starting your integration tests, make sure that your unit tests have flushed out any bugs in your core logic.
Revision History
2025-08-12 Made various editorial changes.
2025-08-11 First posted.
--- This post is easier to read with BBEdit and C++ colouring.---
We get strange problems with breakpoints appearing after migration (MacBook x86_64 Sequoia to Mac M3 arm64 Sequoia).
Context
We have kept our app on the MacBook and experimented no problems.
We use clang++ and lldb.
Xcode is installed but we use only CommandLineTools (no XCode project) -- and git on our lab forge.
After using the Apple migration tool, we got many problems in compiling and link-edit, in particular for dylibs.
We uninstalled all these tools and reinstalled them, using Homebrew for llvm and lld, and from AppleStore for Xcode.
We also added to our CPPFLAGS -arch arm64 -w -g -O0.
We use 'make' recursively (in principle, 0 or 1 Makefile per folder.
Problems
Our app crashes unexpectedly:
without lldb:
...Serveur: serveur.out
...
stop reason = EXC_BREAKPOINT (code=1, subcode=0x1000c662c) at descripteursDeNoeuds.cpp:947:15
with lldb:
...Serveur: lldb serveur.out -arch aarch64
(lldb) process launch
...
Process 2081 stopped
thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BREAKPOINT (code=1, subcode=0x1000c6388)
frame #0: 0x00000001000c6388 serveur.out`creerDescrDLING(m=1, bImpr=false) at descripteursDeNoeuds.cpp:947:15
We can set breakpoints, but the location is OK relative to some files, and "pending" for the file where the crash seems to occur.
...Serveur: lldb serveur.out -arch aarch64
(lldb) target create --arch=aarch64 "serveur.out"
Current executable set to '/Users/boitet/ariane-y/Ariane-Y_prog_2013/Moniteurs/Moniteur-AY/Serveur/serveur.out' (arm64).
(lldb) br set -f initDling.cpp -l 150
Breakpoint 1: where = serveur.out`initDling(std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator>) + 1336 at initDling.cpp:150:30, address = 0x00000001000e0ebc
(lldb) br set -f descripteurDeNoeuds.cpp -l 886
Breakpoint 2: no locations (pending).
WARNING: Unable to resolve breakpoint to any actual locations.
(lldb) br set -f descripteurDeNoeuds.cpp -l 947
Breakpoint 3: no locations (pending).
WARNING: Unable to resolve breakpoint to any actual locations.
(lldb) br set -f initDling.cpp -l 153
Breakpoint 4: where = serveur.out`initDling(std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator>) + 1364 at initDling.cpp:153:23, address = 0x00000001000e0ed8
(lldb) br set -f descripteurDeNoeuds.cpp -l 912
Breakpoint 5: no locations (pending).
WARNING: Unable to resolve breakpoint to any actual locations.
(lldb) br set -f descripteurDeNoeuds.cpp -l 3344
Breakpoint 6: no locations (pending).
WARNING: Unable to resolve breakpoint to any actual locations.
==> We can set breakpoints in the caller (initDling) but not in descripteurDeNoeuds.cpp.
==> Here, we set 2 "normal" breakpoints at lines 150 and 153 of initDling.cpp, and they work well: normal stop, step-over
==> descripteurDeNoeuds.cpp contains 1 master procedure (creerDescrDepuisNoeud) that calls more specific procedures (like creerDescrDLING)
==> continuation
(lldb) process launch
Process 2081 launched: '/Users/boitet/ariane-y/Ariane-Y_prog_2013/Moniteurs/Moniteur-AY/Serveur/serveur.out' (arm64)
"==============> main (du serveur)
... $$$ 4: initDling: créer les descripteurs de nœud des nœuds de cet arbre
$$$ 5: initDling : --> creerDescrDepuisNoeud(j=1, 0x14a068000), i = 1, gauche(j) = 2, droit(j) = 1, benj(j) = 1
Process 2081 stopped
thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
frame #0: 0x00000001000e0ebc serveur.out`initDling(nomFich="../../../INCL/fichInitDling.arbDS") at initDling.cpp:150:30
147 /*** <-TRACE / }
148 149 /**************************************/
-> 150 rc = creerDescrDepuisNoeud(j, paxml);
151 /**************************************/
152 153 / ->TRACE ***/ if (tr>1) {
(lldb) th step-over
============================================================================
$$$ 4: creerDescrDepuisNoeud (mPar = 1, pAxmlPar = 0x14a068000)
$$$ 5: creerDescrDepuisNoeud -- boucle : nomBalise = DLING, strTempo = ANNOTATIONS, trouve = 0, k = 482
$$$ 5: creerDescrDepuisNoeud -- boucle : nomBalise = DLING, strTempo = Corpus, trouve = 0, k = 483
...
==> strange EXC_BREAKPOINT
...
indNOEUD : 1
adrDESCR : 105553137336320
"==> arrêt forcé, descripteurDeNoeuds.cpp -l 966: on attend 1 seconde
"==> et on exécute 'n = n / 0;' avec n = 20... mais on a ENSUITE :
"==> stop reason = EXC_BREAKPOINT (code=1, subcode=0x1000c662c) at descripteursDeNoeuds.cpp:947:15
==> The instruction 'n = n / 0;' mentioned in the message is NOT executed as it was commented out (line 964).
==> There is no division by 0 in this code.
==> the last 3 lines of the trace are produced by cout instructions, at lines 962--965
==> system-originated EXC_BREAKPOINT, at a wrong line (947) in any case!
Process 2081 stopped
thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BREAKPOINT (code=1, subcode=0x1000c6388)
frame #0: 0x00000001000c6388 serveur.out`creerDescrDLING(m=1, bImpr=false) at descripteursDeNoeuds.cpp:947:15
944 if (pAxml->lAttr.benj(i)) fini = true; else i = pAxml->lAttr.droit(i);
945 } // while (!fini)
946 // Imprimer le descripteur si le 2° paramètre (booléen) est vrai
-> 947 if (bImpr || bDescr) // breakpoint set -f descripteurDeNoeuds.cpp -l 947 ne va pas
948 { cout<<"--------------------------------------------------------"<<endl;
949 cout<<"--- DescrDLING("<<m<<"), "<<"pDescr="<<pDescr<<" ---"<<endl;
950 cout<<"codeBalAY : "<codeBalAY<<endl;
(lldb)
==> but we are at line 966, not 947
==> And at line 967, there is nothing special:
if (bImpr || bDescr) // breakpoint set -f descripteurDeNoeuds.cpp -l 947 ne va pas
{ cout<<"--------------------------------------------------------"<<endl;
cout<<"--- DescrDLING("<<m<<"), "<<"pDescr="<<pDescr<<" ---"<<endl;
==> continuation, interruption and backtrace
(lldb) p (bImpr || bDescr)
(bool) true
(lldb) p bImpr
(bool) false
(lldb) p bDescr
(bool) true
(lldb) (bool) true
(lldb) bt
thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BREAKPOINT (code=1, subcode=0x1000c6388)
frame #0: 0x00000001000c6388 serveur.out`creerDescrDLING(m=1, bImpr=false) at descripteursDeNoeuds.cpp:947:15
frame #1: 0x00000001000dd710 serveur.out`creerDescrDepuisNoeud(mPar=1, pAxmlPar=0x000000014a068000) at descripteursDeNoeuds.cpp:3406:41
...
==>
==> After that, we are blocked, no step or continue instruction works. Then we quit.
We could not find this exact subcode (0x1000c6388) on the Web.
We found a post mentioning a similar problem, with another subcode (0x100308448).
https://stackoverflow.com/questions/45413088/error-exc-breakpoint-code-1-subcode-0x100308448
But the author worked under Xcode, and we don't.
Topic:
Developer Tools & Services
SubTopic:
General