Skip to content

Commit

Permalink
Merge branch 'main' into lcian/feat/spring-profiles-event-processor
Browse files Browse the repository at this point in the history
  • Loading branch information
lcian authored Feb 11, 2025
2 parents 4befd05 + 5e31a6b commit e9dbace
Show file tree
Hide file tree
Showing 19 changed files with 228 additions and 18 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/agp-matrix.yml
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ jobs:
java-version: '17'

- name: Setup Gradle
uses: gradle/actions/setup-gradle@6962c6c931ff9effc947259cc1b9c6edba90b9d3 # pin@v3
uses: gradle/actions/setup-gradle@aa23778d2dc6f6556fcc7164e99babbd8c3134e4 # pin@v3
with:
gradle-home-cache-cleanup: true
cache-encryption-key: ${{ secrets.GRADLE_ENCRYPTION_KEY }}
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ jobs:
java-version: '17'

- name: Setup Gradle
uses: gradle/actions/setup-gradle@6962c6c931ff9effc947259cc1b9c6edba90b9d3 # pin@v3
uses: gradle/actions/setup-gradle@aa23778d2dc6f6556fcc7164e99babbd8c3134e4 # pin@v3
with:
gradle-home-cache-cleanup: true
cache-encryption-key: ${{ secrets.GRADLE_ENCRYPTION_KEY }}
Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/codeql-analysis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -34,13 +34,13 @@ jobs:
java-version: '17'

- name: Setup Gradle
uses: gradle/actions/setup-gradle@6962c6c931ff9effc947259cc1b9c6edba90b9d3 # pin@v3
uses: gradle/actions/setup-gradle@aa23778d2dc6f6556fcc7164e99babbd8c3134e4 # pin@v3
with:
gradle-home-cache-cleanup: true
cache-encryption-key: ${{ secrets.GRADLE_ENCRYPTION_KEY }}

- name: Initialize CodeQL
uses: github/codeql-action/init@dd746615b3b9d728a6a37ca2045b68ca76d4841a # pin@v2
uses: github/codeql-action/init@9e8d0789d4a0fa9ceb6b1738f7e269594bdd67f0 # pin@v2
with:
languages: 'java'

Expand All @@ -49,4 +49,4 @@ jobs:
./gradlew buildForCodeQL
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@dd746615b3b9d728a6a37ca2045b68ca76d4841a # pin@v2
uses: github/codeql-action/analyze@9e8d0789d4a0fa9ceb6b1738f7e269594bdd67f0 # pin@v2
2 changes: 1 addition & 1 deletion .github/workflows/enforce-license-compliance.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Setup Gradle
uses: gradle/actions/setup-gradle@6962c6c931ff9effc947259cc1b9c6edba90b9d3 # pin@v3
uses: gradle/actions/setup-gradle@aa23778d2dc6f6556fcc7164e99babbd8c3134e4 # pin@v3
with:
gradle-home-cache-cleanup: true

Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/generate-javadocs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ jobs:
java-version: '17'

- name: Setup Gradle
uses: gradle/actions/setup-gradle@6962c6c931ff9effc947259cc1b9c6edba90b9d3 # pin@v3
uses: gradle/actions/setup-gradle@aa23778d2dc6f6556fcc7164e99babbd8c3134e4 # pin@v3
with:
gradle-home-cache-cleanup: true

Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/integration-tests-benchmarks.yml
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ jobs:
java-version: '17'

- name: Setup Gradle
uses: gradle/actions/setup-gradle@6962c6c931ff9effc947259cc1b9c6edba90b9d3 # pin@v3
uses: gradle/actions/setup-gradle@aa23778d2dc6f6556fcc7164e99babbd8c3134e4 # pin@v3
with:
gradle-home-cache-cleanup: true
cache-encryption-key: ${{ secrets.GRADLE_ENCRYPTION_KEY }}
Expand Down Expand Up @@ -89,7 +89,7 @@ jobs:
java-version: '17'

- name: Setup Gradle
uses: gradle/actions/setup-gradle@6962c6c931ff9effc947259cc1b9c6edba90b9d3 # pin@v3
uses: gradle/actions/setup-gradle@aa23778d2dc6f6556fcc7164e99babbd8c3134e4 # pin@v3
with:
gradle-home-cache-cleanup: true
cache-encryption-key: ${{ secrets.GRADLE_ENCRYPTION_KEY }}
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/integration-tests-ui-critical.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ jobs:
java-version: '17'

- name: Setup Gradle
uses: gradle/actions/setup-gradle@6962c6c931ff9effc947259cc1b9c6edba90b9d3 # pin@v3
uses: gradle/actions/setup-gradle@aa23778d2dc6f6556fcc7164e99babbd8c3134e4 # pin@v3
with:
gradle-home-cache-cleanup: true
cache-encryption-key: ${{ secrets.GRADLE_ENCRYPTION_KEY }}
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/integration-tests-ui.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ jobs:
java-version: '17'

- name: Setup Gradle
uses: gradle/actions/setup-gradle@6962c6c931ff9effc947259cc1b9c6edba90b9d3 # pin@v3
uses: gradle/actions/setup-gradle@aa23778d2dc6f6556fcc7164e99babbd8c3134e4 # pin@v3
with:
gradle-home-cache-cleanup: true
cache-encryption-key: ${{ secrets.GRADLE_ENCRYPTION_KEY }}
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/release-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ jobs:
java-version: '17'

- name: Setup Gradle
uses: gradle/actions/setup-gradle@6962c6c931ff9effc947259cc1b9c6edba90b9d3 # pin@v3
uses: gradle/actions/setup-gradle@aa23778d2dc6f6556fcc7164e99babbd8c3134e4 # pin@v3
with:
gradle-home-cache-cleanup: true

Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ jobs:
steps:
- name: Get auth token
id: token
uses: actions/create-github-app-token@136412a57a7081aa63c935a2cc2918f76c34f514 # v1.11.2
uses: actions/create-github-app-token@67e27a7eb7db372a1c61a7f9bdab8699e9ee57f7 # v1.11.3
with:
app-id: ${{ vars.SENTRY_RELEASE_BOT_CLIENT_ID }}
private-key: ${{ secrets.SENTRY_RELEASE_BOT_PRIVATE_KEY }}
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/system-tests-backend.yml
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ jobs:
java-version: '17'

- name: Setup Gradle
uses: gradle/actions/setup-gradle@6962c6c931ff9effc947259cc1b9c6edba90b9d3 # pin@v3
uses: gradle/actions/setup-gradle@aa23778d2dc6f6556fcc7164e99babbd8c3134e4 # pin@v3
with:
gradle-home-cache-cleanup: true

Expand Down
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
- Add split apks info to the `App` context ([#3193](https://github.com/getsentry/sentry-java/pull/3193))
- Expose new `withSentryObservableEffect` method overload that accepts `SentryNavigationListener` as a parameter ([#4143](https://github.com/getsentry/sentry-java/pull/4143))
- This allows sharing the same `SentryNavigationListener` instance across fragments and composables to preserve the trace
- (Internal) Add API to filter native debug images based on stacktrace addresses ([#4089](https://github.com/getsentry/sentry-java/pull/4089))

### Fixes

Expand Down
1 change: 1 addition & 0 deletions sentry-android-core/api/sentry-android-core.api
Original file line number Diff line number Diff line change
Expand Up @@ -212,6 +212,7 @@ public abstract class io/sentry/android/core/EnvelopeFileObserverIntegration : i
public abstract interface class io/sentry/android/core/IDebugImagesLoader {
public abstract fun clearDebugImages ()V
public abstract fun loadDebugImages ()Ljava/util/List;
public abstract fun loadDebugImagesForAddresses (Ljava/util/Set;)Ljava/util/Set;
}

public final class io/sentry/android/core/InternalSentrySdk {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import io.sentry.protocol.DebugImage;
import java.util.List;
import java.util.Set;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.Nullable;

Expand All @@ -11,5 +12,8 @@ public interface IDebugImagesLoader {
@Nullable
List<DebugImage> loadDebugImages();

@Nullable
Set<DebugImage> loadDebugImagesForAddresses(Set<String> addresses);

void clearDebugImages();
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import io.sentry.protocol.DebugImage;
import java.util.List;
import java.util.Set;
import org.jetbrains.annotations.Nullable;

final class NoOpDebugImagesLoader implements IDebugImagesLoader {
Expand All @@ -19,6 +20,11 @@ public static NoOpDebugImagesLoader getInstance() {
return null;
}

@Override
public @Nullable Set<DebugImage> loadDebugImagesForAddresses(Set<String> addresses) {
return null;
}

@Override
public void clearDebugImages() {}
}
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,8 @@ class SentryAndroidOptionsTest {

private class CustomDebugImagesLoader : IDebugImagesLoader {
override fun loadDebugImages(): List<DebugImage>? = null
override fun loadDebugImagesForAddresses(addresses: Set<String>?): Set<DebugImage>? = null

override fun clearDebugImages() {}
}
}
1 change: 1 addition & 0 deletions sentry-android-ndk/api/sentry-android-ndk.api
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ public final class io/sentry/android/ndk/DebugImagesLoader : io/sentry/android/c
public fun <init> (Lio/sentry/android/core/SentryAndroidOptions;Lio/sentry/ndk/NativeModuleListLoader;)V
public fun clearDebugImages ()V
public fun loadDebugImages ()Ljava/util/List;
public fun loadDebugImagesForAddresses (Ljava/util/Set;)Ljava/util/Set;
}

public final class io/sentry/android/ndk/NdkScopeObserver : io/sentry/ScopeObserverAdapter {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,9 @@
import io.sentry.util.AutoClosableReentrantLock;
import io.sentry.util.Objects;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.VisibleForTesting;
Expand All @@ -25,7 +27,7 @@ public final class DebugImagesLoader implements IDebugImagesLoader {

private final @NotNull NativeModuleListLoader moduleListLoader;

private static @Nullable List<DebugImage> debugImages;
private static volatile @Nullable List<DebugImage> debugImages;

/** we need to lock it because it could be called from different threads */
protected static final @NotNull AutoClosableReentrantLock debugImagesLock =
Expand Down Expand Up @@ -54,6 +56,8 @@ public DebugImagesLoader(
debugImages = new ArrayList<>(debugImagesArr.length);
for (io.sentry.ndk.DebugImage d : debugImagesArr) {
final DebugImage debugImage = new DebugImage();
debugImage.setCodeFile(d.getCodeFile());
debugImage.setDebugFile(d.getDebugFile());
debugImage.setUuid(d.getUuid());
debugImage.setType(d.getType());
debugImage.setDebugId(d.getDebugId());
Expand All @@ -75,7 +79,92 @@ public DebugImagesLoader(
return debugImages;
}

/** Clears the caching of debug images on sentry-native and here. */
/**
* Loads debug images for the given set of addresses.
*
* @param addresses Set of memory addresses to find debug images for
* @return Set of matching debug images, or null if debug images couldn't be loaded
*/
public @Nullable Set<DebugImage> loadDebugImagesForAddresses(
final @NotNull Set<String> addresses) {
try (final @NotNull ISentryLifecycleToken ignored = debugImagesLock.acquire()) {
final @Nullable List<DebugImage> allDebugImages = loadDebugImages();
if (allDebugImages == null) {
return null;
}
if (addresses.isEmpty()) {
return null;
}

final Set<DebugImage> referencedImages = filterImagesByAddresses(allDebugImages, addresses);
if (referencedImages.isEmpty()) {
options
.getLogger()
.log(
SentryLevel.WARNING,
"No debug images found for any of the %d addresses.",
addresses.size());
return null;
}

return referencedImages;
}
}

/**
* Finds all debug image containing the given addresses. Assumes that the images are sorted by
* address, which should always be true on Linux/Android and Windows platforms
*
* @return All matching debug images or null if none are found
*/
private @NotNull Set<DebugImage> filterImagesByAddresses(
final @NotNull List<DebugImage> images, final @NotNull Set<String> addresses) {
final Set<DebugImage> result = new HashSet<>();

for (int i = 0; i < images.size(); i++) {
final @NotNull DebugImage image = images.get(i);
final @Nullable DebugImage nextDebugImage =
(i + 1) < images.size() ? images.get(i + 1) : null;
final @Nullable String nextDebugImageAddress =
nextDebugImage != null ? nextDebugImage.getImageAddr() : null;

for (final @NotNull String rawAddress : addresses) {
try {
final long address = Long.parseLong(rawAddress.replace("0x", ""), 16);

final @Nullable String imageAddress = image.getImageAddr();
if (imageAddress != null) {
try {
final long imageStart = Long.parseLong(imageAddress.replace("0x", ""), 16);
final long imageEnd;

final @Nullable Long imageSize = image.getImageSize();
if (imageSize != null) {
imageEnd = imageStart + imageSize;
} else if (nextDebugImageAddress != null) {
imageEnd = Long.parseLong(nextDebugImageAddress.replace("0x", ""), 16);
} else {
imageEnd = Long.MAX_VALUE;
}
if (address >= imageStart && address < imageEnd) {
result.add(image);
// once image is added we can skip the remaining addresses and go straight to the
// next
// image
break;
}
} catch (NumberFormatException e) {
// ignored, invalid debug image address
}
}
} catch (NumberFormatException e) {
// ignored, invalid address supplied
}
}
}
return result;
}

@Override
public void clearDebugImages() {
try (final @NotNull ISentryLifecycleToken ignored = debugImagesLock.acquire()) {
Expand Down
Loading

0 comments on commit e9dbace

Please sign in to comment.