Closed
Description
Description
App crashes when iOS starts using its own ICU code.
I'm guessing it's because of a symbol clash with Mono's ICU symbols.
Reproduction Steps
- Install Xcode 15.3 beta 3.
- Create a new iOS project:
dotnet new ios
- Add this to FinishedLaunching in AppDelegate.cs:
var date = NSDate.Now;
var locale = NSLocale.SystemLocale;
var str = date.DescriptionWithLocale (locale);
- Run in an iOS 17.4 simulator
Note: an iOS 17.2 simulator works just fine.
Expected behavior
No crash.
Actual behavior
Crash:
Thread 0 Crashed:: tid_103 Dispatch queue: com.apple.main-thread
0 libsystem_kernel.dylib 0x1129293b0 __pthread_kill + 8
1 libsystem_pthread.dylib 0x112557130 pthread_kill + 256
2 libsystem_c.dylib 0x1801655c0 abort + 104
3 libmonosgen-2.0.dylib 0x113316bcc sigabrt_signal_handler.cold.1 + 48
4 libmonosgen-2.0.dylib 0x113043a60 sigabrt_signal_handler + 196
5 libsystem_platform.dylib 0x1123237e0 _sigtramp + 52
6 libsystem_pthread.dylib 0x112557130 pthread_kill + 256
7 libsystem_c.dylib 0x1801655c0 abort + 104
8 libsystem_malloc.dylib 0x1801e378c malloc_vreport + 900
9 libsystem_malloc.dylib 0x1801e3950 malloc_report + 60
10 libsystem_malloc.dylib 0x1801d78a0 find_zone_and_free + 456
11 libicucore.A.dylib 0x181dbf2a0 icu::Locale::setToBogus() + 48
12 libicucore.A.dylib 0x181dc0c44 icu::Locale::operator=(icu::Locale const&) + 36
13 libicucore.A.dylib 0x181f2e5f4 icu::number::LocalizedNumberFormatter::LocalizedNumberFormatter(icu::number::impl::MacroProps&&, icu::Locale const&) + 212
14 libicucore.A.dylib 0x181eda738 icu::DecimalFormat::touch(UErrorCode&) + 204
15 libicucore.A.dylib 0x181edade8 icu::DecimalFormat::DecimalFormat(icu::UnicodeString const&, icu::DecimalFormatSymbols*, UNumberFormatStyle, UErrorCode&) + 328
16 libicucore.A.dylib 0x181f491b0 icu::NumberFormat::makeInstance(icu::Locale const&, UNumberFormatStyle, signed char, UErrorCode&) + 1600
17 libicucore.A.dylib 0x181f489e8 icu::LocaleCacheKey<icu::SharedNumberFormat>::createObject(void const*, UErrorCode&) const + 84
18 libicucore.A.dylib 0x181e6dae0 icu::UnifiedCache::_get(icu::CacheKeyBase const&, icu::SharedObject const*&, void const*, UErrorCode&) const + 140
19 libicucore.A.dylib 0x181f495d0 0x181dbd000 + 1623504
20 libicucore.A.dylib 0x181f48b10 0x181dbd000 + 1620752
21 libicucore.A.dylib 0x181f4864c icu::NumberFormat::createInstance(icu::Locale const&, UNumberFormatStyle, UErrorCode&) + 92
22 libicucore.A.dylib 0x181dcacf4 icu::SimpleDateFormat::initialize(icu::Locale const&, UErrorCode&) + 544
23 libicucore.A.dylib 0x181dc6030 icu::SimpleDateFormat::construct(icu::DateFormat::EStyle, icu::DateFormat::EStyle, icu::Locale const&, UErrorCode&) + 1952
24 libicucore.A.dylib 0x181dc5838 icu::SimpleDateFormat::SimpleDateFormat(icu::DateFormat::EStyle, icu::DateFormat::EStyle, icu::Locale const&, UErrorCode&) + 160
25 libicucore.A.dylib 0x181dc5720 icu::DateFormat::create(icu::DateFormat::EStyle, icu::DateFormat::EStyle, icu::Locale const&) + 144
26 libicucore.A.dylib 0x181dc5590 udat_open + 392
27 CoreFoundation 0x18049f540 __cficu_udat_open + 68
28 CoreFoundation 0x1803c3d68 __ResetUDateFormat + 484
29 CoreFoundation 0x1803c367c __CreateCFDateFormatter + 320
30 CoreFoundation 0x18049b4c0 -[NSDate descriptionWithLocale:] + 96
31 libxamarin-dotnet-debug.dylib 0x1129fcb8c xamarin_dyn_objc_msgSend + 160
32 newios 0x109125ab8 wrapper_managed_to_native_ObjCRuntime_Messaging_NativeHandle_objc_msgSend_NativeHandle_intptr_intptr_ObjCRuntime_NativeHandle + 168
33 newios 0x10843723c Foundation_NSDate_DescriptionWithLocale_Foundation_NSLocale + 140 (NSDate.g.cs:173)
34 newios 0x104f5a504 newios_AppDelegate_FinishedLaunching_UIKit_UIApplication_Foundation_NSDictionary + 500 (AppDelegate.cs:17)
Full crash report: https://gist.github.com/rolfbjarne/9fcedeb59d0521c4c9bb931056bba15c
Regression?
Yes. Fortunately it seems to only affect the simulator, and not device.
Known Workarounds
Disable globalization and make the app link mono statically works:
<PropertyGroup>
<_LibXamarinLinkMode>static</_LibXamarinLinkMode>
<_LibMonoLinkMode>static</_LibMonoLinkMode>
<InvariantGlobalization>true</InvariantGlobalization>
</PropertyGroup>
<Target Name="_FixMonoLinkMode" AfterTargets="_MonoReadAvailableComponentsManifest">
<ItemGroup>
<_MonoRuntimeComponentLinking Remove="dynamic" />
<_MonoRuntimeComponentLinking Include="static" RuntimeIdentifier="iossimulator-arm64" />
</ItemGroup>
</Target>
Configuration
$ dotnet --info
.NET SDK:
Version: 8.0.100
Commit: 57efcf1350
Workload version: 8.0.100-manifests.5638171e
Runtime Environment:
OS Name: Mac OS X
OS Version: 14.4
OS Platform: Darwin
RID: osx-arm64
Base Path: /usr/local/share/dotnet/sdk/8.0.100/
.NET workloads installed:
Workload version: 8.0.100-manifests.5638171e
[ios]
Installation Source: SDK 8.0.100
Manifest Version: 17.2.8022/8.0.100
Manifest Path: /usr/local/share/dotnet/sdk-manifests/8.0.100/microsoft.net.sdk.ios/17.2.8022/WorkloadManifest.json
Install Type: FileBased
Host:
Version: 8.0.0
Architecture: arm64
Commit: 5535e31a71
.NET SDKs installed:
8.0.100 [/usr/local/share/dotnet/sdk]
.NET runtimes installed:
Microsoft.AspNetCore.App 8.0.0 [/usr/local/share/dotnet/shared/Microsoft.AspNetCore.App]
Microsoft.NETCore.App 8.0.0 [/usr/local/share/dotnet/shared/Microsoft.NETCore.App]
Other architectures found:
x64 [/usr/local/share/dotnet/x64]
registered at [/etc/dotnet/install_location_x64]
Environment variables:
Not set
global.json file:
Not found
Other information
No response