From d42d208cb8b3fd295b29931603859a23458130e1 Mon Sep 17 00:00:00 2001 From: r1viollet Date: Tue, 8 Jul 2025 11:34:08 +0200 Subject: [PATCH 1/2] Split debug - publish debug info - Publish debug info - Add a linker flag to ensure build ID is added (even on musl) --- ddprof-lib/build.gradle | 32 ++++++++++++++++++++++++++++++++ gradle/configurations.gradle | 2 +- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/ddprof-lib/build.gradle b/ddprof-lib/build.gradle index 93d664fa..7fa88137 100644 --- a/ddprof-lib/build.gradle +++ b/ddprof-lib/build.gradle @@ -165,6 +165,12 @@ def setupDebugExtraction(config, linkTask) { // Create an extra folder for the debug symbols copyTask.dependsOn copyDebugTask } + + // Wire up the debug info JAR to depend on debug files being copied + def debugInfoJarTask = tasks.findByName("debugInfoJar") + if (debugInfoJarTask != null) { + debugInfoJarTask.dependsOn copyDebugTask + } } } @@ -257,6 +263,17 @@ tasks.register('copyExternalLibs', Copy) { } } +// Copy debug files from external libraries if they exist +tasks.register('copyExternalDebugFiles', Copy) { + if (project.hasProperty("with-libs")) { + from(project.getProperty("with-libs")) { + include "**/*.debug" + include "**/*.dSYM/**" + } + into libraryTargetBase('release-debug') + "/META-INF/native-libs" + } +} + def cloneAPTask = tasks.register('cloneAsyncProfiler') { description = 'Clones async-profiler repo if directory is missing or updates it if commit hash differs' inputs.file("${rootDir}/gradle/ap-lock.properties") @@ -598,6 +615,20 @@ tasks.register('javadocJar', Jar) { from javadoc.destinationDir } +tasks.register('debugInfoJar', Jar) { + archiveBaseName = libraryName + archiveClassifier = 'debugInfo' + archiveVersion = component_version + from files(libraryTargetBase('release-debug')) { + include "**/*" + } + + // When using external libraries, depend on copyExternalDebugFiles + if (project.hasProperty("with-libs")) { + dependsOn copyExternalDebugFiles + } +} + tasks.register('scanBuild', Exec) { workingDir "${projectDir}/src/test/make" commandLine 'scan-build' @@ -667,6 +698,7 @@ publishing { } publication.artifact sourcesJar publication.artifact javadocJar + publication.artifact debugInfoJar publication.groupId = 'com.datadoghq' publication.artifactId = 'ddprof' diff --git a/gradle/configurations.gradle b/gradle/configurations.gradle index 6207f231..7b3cce60 100644 --- a/gradle/configurations.gradle +++ b/gradle/configurations.gradle @@ -119,7 +119,7 @@ def commonLinuxCompilerArgs = [ "-DCOUNTERS" ] -def commonLinuxLinkerArgs = ["-ldl", "-Wl,-z,defs", "--verbose", "-lpthread", "-lm", "-lrt", "-v"] +def commonLinuxLinkerArgs = ["-ldl", "-Wl,-z,defs", "--verbose", "-lpthread", "-lm", "-lrt", "-v", "-Wl,--build-id"] def commonMacosCompilerArgs = commonLinuxCompilerArgs + ["-D_XOPEN_SOURCE", "-D_DARWIN_C_SOURCE"] From b5723a7be018ae8dc041d82032a4045a1c1c0069 Mon Sep 17 00:00:00 2001 From: r1viollet Date: Wed, 9 Jul 2025 18:06:30 +0200 Subject: [PATCH 2/2] Wire the debug info into the main JAR --- ddprof-lib/build.gradle | 36 ++++++------------------------------ 1 file changed, 6 insertions(+), 30 deletions(-) diff --git a/ddprof-lib/build.gradle b/ddprof-lib/build.gradle index 2b5782ac..51438cbc 100644 --- a/ddprof-lib/build.gradle +++ b/ddprof-lib/build.gradle @@ -83,6 +83,9 @@ def createDebugExtractionTask(config, linkTask) { description = 'Extract debug symbols from release library' workingDir project.buildDir + // Declare outputs so Gradle knows what files this task creates + outputs.file getDebugFilePath(config) + doFirst { def sourceFile = linkTask.get().linkedFile.get().asFile def debugFile = getDebugFilePath(config) @@ -127,7 +130,7 @@ def createDebugCopyTask(config, extractDebugTask) { } dependsOn extractDebugTask from file("$buildDir/lib/main/${config.name}/${osIdentifier()}/${archIdentifier()}/debug") - into file(libraryTargetPath(config.name + '-debug')) + into file(libraryTargetPath(config.name)) include '**/*.debug' include '**/*.dSYM/**' } @@ -165,12 +168,6 @@ def setupDebugExtraction(config, linkTask) { // Create an extra folder for the debug symbols copyTask.dependsOn copyDebugTask } - - // Wire up the debug info JAR to depend on debug files being copied - def debugInfoJarTask = tasks.findByName("debugInfoJar") - if (debugInfoJarTask != null) { - debugInfoJarTask.dependsOn copyDebugTask - } } } @@ -258,19 +255,10 @@ tasks.register('copyExternalLibs', Copy) { from(project.getProperty("with-libs")) { include "**/*.so" include "**/*.dylib" - } - into "${projectDir}/build/classes/java/main/META-INF/native-libs" - } -} - -// Copy debug files from external libraries if they exist -tasks.register('copyExternalDebugFiles', Copy) { - if (project.hasProperty("with-libs")) { - from(project.getProperty("with-libs")) { include "**/*.debug" include "**/*.dSYM/**" } - into libraryTargetBase('release-debug') + "/META-INF/native-libs" + into "${projectDir}/build/classes/java/main/META-INF/native-libs" } } @@ -450,6 +438,7 @@ buildConfigNames().each { name -> if (!project.hasProperty('skip-native')) { dependsOn copyTask } + from sourceSets.main.output.classesDirs from files(libraryTargetBase(name)) { include "**/*" @@ -615,19 +604,7 @@ tasks.register('javadocJar', Jar) { from javadoc.destinationDir } -tasks.register('debugInfoJar', Jar) { - archiveBaseName = libraryName - archiveClassifier = 'debugInfo' - archiveVersion = component_version - from files(libraryTargetBase('release-debug')) { - include "**/*" - } - // When using external libraries, depend on copyExternalDebugFiles - if (project.hasProperty("with-libs")) { - dependsOn copyExternalDebugFiles - } -} tasks.register('scanBuild', Exec) { workingDir "${projectDir}/src/test/make" @@ -698,7 +675,6 @@ publishing { } publication.artifact sourcesJar publication.artifact javadocJar - publication.artifact debugInfoJar publication.groupId = 'com.datadoghq' publication.artifactId = 'ddprof'