Skip to content

Commit efe2687

Browse files
authored
Preserve the function relative address when parsing a crash (#10544)
Preserve the function relative address when parsing a crash Co-authored-by: andrea.marziali <andrea.marziali@datadoghq.com>
1 parent 10f7474 commit efe2687

9 files changed

Lines changed: 12 additions & 16 deletions

File tree

dd-java-agent/agent-crashtracking/src/main/java/datadog/crashtracking/parsers/HotspotCrashLogParser.java

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -126,12 +126,9 @@ private StackFrame parseLine(String line) {
126126
}
127127

128128
// Extract function name if present (after the bracket)
129+
// Keep the relative address offset as part of the function name
129130
if (libend + 3 < line.length() && !line.endsWith("]")) {
130-
int plusIdx = line.lastIndexOf('+');
131-
functionName =
132-
plusIdx > libend
133-
? line.substring(libend + 3, plusIdx).trim()
134-
: line.substring(libend + 3).trim();
131+
functionName = line.substring(libend + 3).trim();
135132
}
136133
}
137134
}
@@ -152,9 +149,8 @@ private StackFrame parseLine(String line) {
152149
remaining = remaining.substring(0, lastSpace).trim();
153150
}
154151
}
155-
// Check for + offset
156-
int plusIdx = remaining.lastIndexOf('+');
157-
functionName = plusIdx > -1 ? remaining.substring(0, plusIdx).trim() : remaining;
152+
// Keep the relative address offset as part of the function name
153+
functionName = remaining;
158154
}
159155
break;
160156
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"timestamp":"2024-09-20T13:19:06Z","ddsource":"crashtracker","error":{"is_crash":true,"type":"UNKNOWN","message":"Process terminated by signal UNKNOWN","source_type":"crashtracking","stack":{"format":"CrashTrackerV1","frames":[{"function":"__pthread_clockjoin_ex","path":"libpthread.so.0","relative_address":"0x9cd5"}]}}}
1+
{"timestamp":"2024-09-20T13:19:06Z","ddsource":"crashtracker","error":{"is_crash":true,"type":"UNKNOWN","message":"Process terminated by signal UNKNOWN","source_type":"crashtracking","stack":{"format":"CrashTrackerV1","frames":[{"function":"__pthread_clockjoin_ex+0x255","path":"libpthread.so.0","relative_address":"0x9cd5"}]}}}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"ddsource":"crashtracker","error":{"is_crash":true,"type":"OutOfMemory","message":"Java heap space","source_type":"crashtracking","stack":{"format":"CrashTrackerV1","frames":[{"function":"VMError::report_and_die()","path":"libjvm.dylib","relative_address":"0x565d30"},{"function":"report_vm_error(char const*, int, char const*, char const*)","path":"libjvm.dylib","relative_address":"0x1941a0"},{"function":"report_java_out_of_memory(char const*)","path":"libjvm.dylib","relative_address":"0x1943d8"},{"function":"CollectedHeap::common_mem_allocate_noinit(KlassHandle, unsigned long, Thread*)","path":"libjvm.dylib","relative_address":"0x70430"},{"function":"TypeArrayKlass::allocate_common(int, bool, Thread*)","path":"libjvm.dylib","relative_address":"0x53eba8"},{"function":"InterpreterRuntime::newarray(JavaThread*, BasicType, int)","path":"libjvm.dylib","relative_address":"0x285b6c"},{"function":"datadog.smoketest.crashtracking.CrashtrackingTestApplication.main([Ljava/lang/String;)V","line":105},{"function":"~StubRoutines::call_stub"},{"function":"JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*)","path":"libjvm.dylib","relative_address":"0x28f86c"},{"function":"jni_invoke_static(JNIEnv_*, JavaValue*, _jobject*, JNICallType, _jmethodID*, JNI_ArgumentPusher*, Thread*)","path":"libjvm.dylib","relative_address":"0x2d3b44"},{"function":"jni_CallStaticVoidMethod","path":"libjvm.dylib","relative_address":"0x2d7160"},{"function":"JavaMain","path":"java","relative_address":"0x6404"},{"function":"_pthread_start","path":"libsystem_pthread.dylib","relative_address":"0x6f94"},{"function":"thread_start","path":"libsystem_pthread.dylib","relative_address":"0x1d34"},{"function":"datadog.smoketest.crashtracking.CrashtrackingTestApplication.main([Ljava/lang/String;)V","line":105},{"function":"~StubRoutines::call_stub"}]}}}
1+
{"ddsource":"crashtracker","error":{"is_crash":true,"type":"OutOfMemory","message":"Java heap space","source_type":"crashtracking","stack":{"format":"CrashTrackerV1","frames":[{"function":"VMError::report_and_die()+0x468","path":"libjvm.dylib","relative_address":"0x565d30"},{"function":"report_vm_error(char const*, int, char const*, char const*)+0x5c","path":"libjvm.dylib","relative_address":"0x1941a0"},{"function":"report_java_out_of_memory(char const*)+0xfc","path":"libjvm.dylib","relative_address":"0x1943d8"},{"function":"CollectedHeap::common_mem_allocate_noinit(KlassHandle, unsigned long, Thread*)+0x128","path":"libjvm.dylib","relative_address":"0x70430"},{"function":"TypeArrayKlass::allocate_common(int, bool, Thread*)+0xfc","path":"libjvm.dylib","relative_address":"0x53eba8"},{"function":"InterpreterRuntime::newarray(JavaThread*, BasicType, int)+0x48","path":"libjvm.dylib","relative_address":"0x285b6c"},{"function":"datadog.smoketest.crashtracking.CrashtrackingTestApplication.main([Ljava/lang/String;)V","line":105},{"function":"~StubRoutines::call_stub"},{"function":"JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*)+0x840","path":"libjvm.dylib","relative_address":"0x28f86c"},{"function":"jni_invoke_static(JNIEnv_*, JavaValue*, _jobject*, JNICallType, _jmethodID*, JNI_ArgumentPusher*, Thread*)+0x294","path":"libjvm.dylib","relative_address":"0x2d3b44"},{"function":"jni_CallStaticVoidMethod+0x188","path":"libjvm.dylib","relative_address":"0x2d7160"},{"function":"JavaMain+0xa10","path":"java","relative_address":"0x6404"},{"function":"_pthread_start+0x88","path":"libsystem_pthread.dylib","relative_address":"0x6f94"},{"function":"thread_start+0x8","path":"libsystem_pthread.dylib","relative_address":"0x1d34"},{"function":"datadog.smoketest.crashtracking.CrashtrackingTestApplication.main([Ljava/lang/String;)V","line":105},{"function":"~StubRoutines::call_stub"}]}}}

dd-java-agent/agent-crashtracking/src/test/resources/golden/errortracking/sample-crash-for-telemetry.txt

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"timestamp":"2025-11-24T09:43:29+01:00","ddsource":"crashtracker","error":{"is_crash":true,"type":"OutOfMemory","message":"Java heap space","source_type":"crashtracking","stack":{"format":"CrashTrackerV1","frames":[{"function":"VMError::report_and_die(int, char const*, char const*, char*, Thread*, unsigned char*, void*, void*, char const*, int, unsigned long)","path":"libjvm.dylib","relative_address":"0xaa5f24"},{"function":"report_fatal(VMErrorType, char const*, int, char const*, ...)","path":"libjvm.dylib","relative_address":"0x314c74"},{"function":"report_java_out_of_memory(char const*)","path":"libjvm.dylib","relative_address":"0x315248"},{"function":"MemAllocator::Allocation::check_out_of_memory()","path":"libjvm.dylib","relative_address":"0x7d9764"},{"function":"MemAllocator::allocate() const","path":"libjvm.dylib","relative_address":"0x7da2f4"},{"function":"CollectedHeap::array_allocate(Klass*, unsigned long, int, bool, JavaThread*)","path":"libjvm.dylib","relative_address":"0x2c3de4"},{"function":"OptoRuntime::new_array_C(Klass*, int, JavaThread*)","path":"libjvm.dylib","relative_address":"0x8ea9ec"},{"function":"~RuntimeStub::_new_array_Java","relative_address":"0x00000001124cb638"},{"function":"java.nio.ByteBuffer.allocate(I)Ljava/nio/ByteBuffer;"},{"function":"datadog.communication.serialization.FlushingBuffer.<init>(ILdatadog/communication/serialization/ByteBufferConsumer;)V","line":6},{"function":"datadog.trace.agent.common.writer.PayloadDispatcherImpl.selectMapper()V","line":126},{"function":"datadog.trace.agent.common.writer.PayloadDispatcherImpl.addTrace(Ljava/util/List;)V","line":1},{"function":"datadog.trace.agent.common.writer.TraceProcessingWorker$TraceSerializingHandler.onEvent(Ljava/lang/Object;)V","line":22},{"function":"datadog.trace.agent.common.writer.TraceProcessingWorker$TraceSerializingHandler.consumeFromPrimaryQueue()V","line":21},{"function":"datadog.trace.agent.common.writer.TraceProcessingWorker$TraceSerializingHandler.runDutyCycle()V","line":12},{"function":"datadog.trace.agent.common.writer.TraceProcessingWorker$TraceSerializingHandler.run()V","line":1},{"function":"java.lang.Thread.runWith(Ljava/lang/Object;Ljava/lang/Runnable;)V"},{"function":"java.lang.Thread.run()V"},{"function":"~StubRoutines::call_stub","relative_address":"0x00000001123b0140"}]}}} ==> expected: <{data_schema_version=1.0, error={is_crash=true, kind=OutOfMemory, message=Java heap space, source_type=Crashtracking, stack={format=CrashTrackerV1, frames=[{function=VMError::report_and_die(int, char const*, char const*, char*, Thread*, unsigned char*, void*, void*, char const*, int, unsigned long), path=libjvm.dylib, relative_address=0xaa5f24}, {function=report_fatal(VMErrorType, char const*, int, char const*, ...), path=libjvm.dylib, relative_address=0x314c74}, {function=report_java_out_of_memory(char const*), path=libjvm.dylib, relative_address=0x315248}, {function=MemAllocator::Allocation::check_out_of_memory(), path=libjvm.dylib, relative_address=0x7d9764}, {function=MemAllocator::allocate() const, path=libjvm.dylib, relative_address=0x7da2f4}, {function=CollectedHeap::array_allocate(Klass*, unsigned long, int, bool, JavaThread*), path=libjvm.dylib, relative_address=0x2c3de4}, {function=OptoRuntime::new_array_C(Klass*, int, JavaThread*), path=libjvm.dylib, relative_address=0x8ea9ec}, {function=~RuntimeStub::_new_array_Java, relative_address=0x00000001124cb638}, {function=java.nio.ByteBuffer.allocate(I)Ljava/nio/ByteBuffer;}, {function=datadog.communication.serialization.FlushingBuffer.<init>(ILdatadog/communication/serialization/ByteBufferConsumer;)V, line=6}, {function=datadog.trace.agent.common.writer.PayloadDispatcherImpl.selectMapper()V, line=126}, {function=datadog.trace.agent.common.writer.PayloadDispatcherImpl.addTrace(Ljava/util/List;)V, line=1}, {function=datadog.trace.agent.common.writer.TraceProcessingWorker$TraceSerializingHandler.onEvent(Ljava/lang/Object;)V, line=22}, {function=datadog.trace.agent.common.writer.TraceProcessingWorker$TraceSerializingHandler.consumeFromPrimaryQueue()V, line=21}, {function=datadog.trace.agent.common.writer.TraceProcessingWorker$TraceSerializingHandler.runDutyCycle()V, line=12}, {function=datadog.trace.agent.common.writer.TraceProcessingWorker$TraceSerializingHandler.run()V, line=1}, {function=java.lang.Thread.runWith(Ljava/lang/Object;Ljava/lang/Runnable;)V}, {function=java.lang.Thread.run()V}, {function=~StubRoutines::call_stub, relative_address=0x00000001123b0140}]}}, incomplete=false, metadata={family=java, library_name=dd-trace-java, library_version=1.59.0-SNAPSHOT~896c1ad986}, proc_info={pid=74045}, timestamp=2025-11-24T09:43:29+01:00, uuid=a4194cd6-8cb3-45fd-9bd9-3af83e0a3ad3, version_id=0}> but was: <{timestamp=2025-11-24T09:43:29+01:00, ddsource=crashtracker, error={is_crash=true, type=OutOfMemory, message=Java heap space, source_type=crashtracking, stack={format=CrashTrackerV1, frames=[{function=VMError::report_and_die(int, char const*, char const*, char*, Thread*, unsigned char*, void*, void*, char const*, int, unsigned long), path=libjvm.dylib, relative_address=0xaa5f24}, {function=report_fatal(VMErrorType, char const*, int, char const*, ...), path=libjvm.dylib, relative_address=0x314c74}, {function=report_java_out_of_memory(char const*), path=libjvm.dylib, relative_address=0x315248}, {function=MemAllocator::Allocation::check_out_of_memory(), path=libjvm.dylib, relative_address=0x7d9764}, {function=MemAllocator::allocate() const, path=libjvm.dylib, relative_address=0x7da2f4}, {function=CollectedHeap::array_allocate(Klass*, unsigned long, int, bool, JavaThread*), path=libjvm.dylib, relative_address=0x2c3de4}, {function=OptoRuntime::new_array_C(Klass*, int, JavaThread*), path=libjvm.dylib, relative_address=0x8ea9ec}, {function=~RuntimeStub::_new_array_Java, relative_address=0x00000001124cb638}, {function=java.nio.ByteBuffer.allocate(I)Ljava/nio/ByteBuffer;}, {function=datadog.communication.serialization.FlushingBuffer.<init>(ILdatadog/communication/serialization/ByteBufferConsumer;)V, line=6}, {function=datadog.trace.agent.common.writer.PayloadDispatcherImpl.selectMapper()V, line=126}, {function=datadog.trace.agent.common.writer.PayloadDispatcherImpl.addTrace(Ljava/util/List;)V, line=1}, {function=datadog.trace.agent.common.writer.TraceProcessingWorker$TraceSerializingHandler.onEvent(Ljava/lang/Object;)V, line=22}, {function=datadog.trace.agent.common.writer.TraceProcessingWorker$TraceSerializingHandler.consumeFromPrimaryQueue()V, line=21}, {function=datadog.trace.agent.common.writer.TraceProcessingWorker$TraceSerializingHandler.runDutyCycle()V, line=12}, {function=datadog.trace.agent.common.writer.TraceProcessingWorker$TraceSerializingHandler.run()V, line=1}, {function=java.lang.Thread.runWith(Ljava/lang/Object;Ljava/lang/Runnable;)V}, {function=java.lang.Thread.run()V}, {function=~StubRoutines::call_stub, relative_address=0x00000001123b0140}]}}}
1+
{"timestamp":"2025-11-24T09:43:29+01:00","ddsource":"crashtracker","error":{"is_crash":true,"type":"OutOfMemory","message":"Java heap space","source_type":"crashtracking","stack":{"format":"CrashTrackerV1","frames":[{"function":"VMError::report_and_die(int, char const*, char const*, char*, Thread*, unsigned char*, void*, void*, char const*, int, unsigned long)+0x480 (debug.cpp:271)","path":"libjvm.dylib","relative_address":"0xaa5f24"},{"function":"report_fatal(VMErrorType, char const*, int, char const*, ...)+0x88","path":"libjvm.dylib","relative_address":"0x314c74"},{"function":"report_java_out_of_memory(char const*)+0xd8","path":"libjvm.dylib","relative_address":"0x315248"},{"function":"MemAllocator::Allocation::check_out_of_memory()+0x8c","path":"libjvm.dylib","relative_address":"0x7d9764"},{"function":"MemAllocator::allocate() const+0xf4","path":"libjvm.dylib","relative_address":"0x7da2f4"},{"function":"CollectedHeap::array_allocate(Klass*, unsigned long, int, bool, JavaThread*)+0x34","path":"libjvm.dylib","relative_address":"0x2c3de4"},{"function":"OptoRuntime::new_array_C(Klass*, int, JavaThread*)+0x68","path":"libjvm.dylib","relative_address":"0x8ea9ec"},{"function":"~RuntimeStub::_new_array_Java","relative_address":"0x00000001124cb638"},{"function":"java.nio.ByteBuffer.allocate(I)Ljava/nio/ByteBuffer;"},{"function":"datadog.communication.serialization.FlushingBuffer.<init>(ILdatadog/communication/serialization/ByteBufferConsumer;)V","line":6},{"function":"datadog.trace.agent.common.writer.PayloadDispatcherImpl.selectMapper()V","line":126},{"function":"datadog.trace.agent.common.writer.PayloadDispatcherImpl.addTrace(Ljava/util/List;)V","line":1},{"function":"datadog.trace.agent.common.writer.TraceProcessingWorker$TraceSerializingHandler.onEvent(Ljava/lang/Object;)V","line":22},{"function":"datadog.trace.agent.common.writer.TraceProcessingWorker$TraceSerializingHandler.consumeFromPrimaryQueue()V","line":21},{"function":"datadog.trace.agent.common.writer.TraceProcessingWorker$TraceSerializingHandler.runDutyCycle()V","line":12},{"function":"datadog.trace.agent.common.writer.TraceProcessingWorker$TraceSerializingHandler.run()V","line":1},{"function":"java.lang.Thread.runWith(Ljava/lang/Object;Ljava/lang/Runnable;)V"},{"function":"java.lang.Thread.run()V"},{"function":"~StubRoutines::call_stub","relative_address":"0x00000001123b0140"}]}}}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"data_schema_version":"1.0","error":{"is_crash":true,"kind":"UNKNOWN","message":"Process terminated by signal UNKNOWN","source_type":"Crashtracking","stack":{"format":"CrashTrackerV1","frames":[{"function":"__pthread_clockjoin_ex","path":"libpthread.so.0","relative_address":"0x9cd5"}]}},"incomplete":false,"metadata":{"family":"java","library_name":"dd-trace-java","library_version":"1.59.0-SNAPSHOT~896c1ad986"},"os_info":{"architecture":"aarch64","bitness":"64","os_type":"Mac OS X","version":{"Semantic":[15,7,1]}},"proc_info":{"pid":576034},"timestamp":"2024-09-20T13:19:06Z","uuid":"a4194cd6-8cb3-45fd-9bd9-3af83e0a3ad3","version_id":0}
1+
{"data_schema_version":"1.0","error":{"is_crash":true,"kind":"UNKNOWN","message":"Process terminated by signal UNKNOWN","source_type":"Crashtracking","stack":{"format":"CrashTrackerV1","frames":[{"function":"__pthread_clockjoin_ex+0x255","path":"libpthread.so.0","relative_address":"0x9cd5"}]}},"incomplete":false,"metadata":{"family":"java","library_name":"dd-trace-java","library_version":"1.60.0-SNAPSHOT~cffe9c6085"},"os_info":{"architecture":"aarch64","bitness":"64","os_type":"Mac OS X","version":{"Semantic":[15,7,1]}},"proc_info":{"pid":576034},"timestamp":"2024-09-20T13:19:06Z","uuid":"a4194cd6-8cb3-45fd-9bd9-3af83e0a3ad3","version_id":0}

0 commit comments

Comments
 (0)