Few cents about my commits

Debugger: Local variable resolution rework, first results


Have completed most of code rework responsible for debug information preparation for debugger and frame local variable resolution during debug.

Reasons for this:

  • there is no direct link between Java variable and local variable begin generated in LLVM IR code. Previous implementation expect one local per variable. Some times it is not true;
  • Soot performs split of local variable into multiple at each assignment and not always it is not always possible to pack them back, as result same java variable could be represented different memory location (at different part of code);
  • previous implementation was resolving variables base on line number (of code and variable visibility). All this cause broken in case of multi statements lines;
  • sometimes compilers put broken debug information in class file (e.g. kotlin) as result it is not valid source for decisions.

What was changed:

Details will be provided in separate post but some facts are bellow:

Why RoboVM crashes in Antarctica


Spoiler: because Apple uses Penguins to review application in Antarctica! (or just set region to Antarctica)

PR311. Kees van Dieren tried to release app to Apple with RoboVM 2.3.4 and it got rejected. It was crashing due NPE at following:

public DecimalFormatSymbols(Locale locale) {
    try {
        currency = Currency.getInstance(locale);
        currencySymbol = currency.getSymbol(locale); // <== here
        intlCurrencySymbol = currency.getCurrencyCode();
    } catch (IllegalArgumentException e) {

Currency.getInstance() can return null as per spec for countries without currencies, such as Antarctica. Currently icu.dat that is embedded in RoboVM has two counties with XXX currency: AQ, CP.
The fix is simple, to use no currency currency object with code XXX in this case:

--- compiler/rt/libcore/luni/src/main/java/java/text/DecimalFormatSymbols.java	(date 1529655383000)
+++ compiler/rt/libcore/luni/src/main/java/java/text/DecimalFormatSymbols.java	(date 1529660632000)
@@ -97,6 +97,11 @@
         this.locale = locale;
         try {
             currency = Currency.getInstance(locale);
+            if (currency == null) {
+                // dkimitsa: for some countries there is no currecy like Antarctida AQ so pick currency
+                // directcly by no currency code
+                currency = Currency.getInstance("XXX");
+            }
             currencySymbol = currency.getSymbol(locale);
             intlCurrencySymbol = currency.getCurrencyCode();
         } catch (IllegalArgumentException e) {

bugfix: auto signature, auto profile was picking Distribution configuration, wrong


Time to start 2.3.5 with fix. Fix to own code that was intended to fix auto-signature pickup (PR293). It fixes a lot of stuff but introduced bug, that auto mode was picking distribution configuration (identity and profile). This will not work for debug/run configuration case. Fix is simple: consider only development identities:

--- Pair<SigningIdentity, ProvisioningProfile> pair = ProvisioningProfile.find(ProvisioningProfile.list(), SigningIdentity.list(), bundleId);
+++ Pair<SigningIdentity, ProvisioningProfile> pair = ProvisioningProfile.find(ProvisioningProfile.list(), SigningIdentity.list("/(?i)iPhone Developer|iOS Development/"), bundleId);

RoboVM 2.3.4 released, what's new


It took a while for this release, compiler and gradle plugging is already on Maven and plugins will be available soon for download.

Kotlin: Local variable resolution is not easy as LocalVariableTable often broken


Keep working on local variable resolution for Kotlin and while having a progress there a bunch of WTF cases related to debug information that is included in Kotlin. Happily it is related to synthetic variable that are inserted by Kotlin, usually it goes into following cases:

  1. variable defined to be in some slot within specific bytecode range but this slot is not populated;
  2. same as first but in specified local variable slot there is leftover data and it is has not compatible type.

Here is bytecode that demonstrates issue 2:

bugfix #306: enabling TLSv1.2 support


Debugger: variable resolution for Kotlin


Short update on debugger support for kotlin.
Recent fixes (#1, #2) unblocked debugger for kotlin but variable resolution is still broken. It still produces following error messages on synthetic kotlin code for lambdas and collections:

[ERROR] Unable to resolve variable $i$a$1$forEach in method test, class com.test.ViewController

This happen as this variable was declared in synthetic code and this code is out scope defined in debug information for this variable.
Code for variable resolution was pending to upgrade long time ago and best case would be to have variable information without dependency to debug information.
But not so fast: it is not always possible to do it straight away without assumptions and debug information. Integer types case is described bellow.

fixing ERROR ITMS-90725: "SDK Version Issue: iOS app updates submitted to the App Store will need to be built with the iOS 11.0 SDK or later


check PR301 for fix.
Kees van Dieren asked for solution about the issue he has with submitting app to apple store. Issue he had is following:

ITMS-90725: SDK Version Issue - In July 2018, iOS app updates submitted to the App Store will need to be built with the iOS ‘11.0’ SDK or later, included in Xcode [9.0] or later. Make sure to update Xcode for future app deliveries. After you’ve corrected the issues, you can use Xcode or Application Loader to upload a new binary to iTunes Connect.

After checking list of possible source of problems following poped up:

$ otool -l IosEsLauncher | grep -A 4 LC_VERSION_MIN_IPHONEOS
cmdsize 16
version 8.0
sdk n/a
Load command 10

sdk n/a – come-on I had it with home made SDK on windows/linux and it should not happen on Mac but it there as well.

Root case

Framework target: EXC_BAD_ACCESS on NPE in try-catch block


Application with RoboVM target crashes with EXC_BAD_ACCESS, investigation shows that this happens on null pointer exception (NPE) that enclosed in corresponding try-catch block and shall not break away? Already covered in Tutorial: Crash Reporters and java exceptions.
Root case is same – signals.
Solution is same – use Signals.installSignals.
Post bellow describes how to deal with it and introduces changes into framework template.

iOS 11.4 bindings