opentelemetry-dotnet-instrumentation icon indicating copy to clipboard operation
opentelemetry-dotnet-instrumentation copied to clipboard

AccessViolation when running auto-instrumentation from nuget package

Open cabadam opened this issue 1 year ago • 1 comments

Bug Report

Symptom

Describe the bug I followed the instructions here: https://opentelemetry.io/docs/zero-code/net/nuget-packages/

When I run instrument.cmd .\OpenTelemetryAutoWorker.exe, an exception is logged:

Fatal error. System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt. Repeat 2 times:

at OpenTelemetry.AutoInstrumentation.NativeMethods+Windows.AddInstrumentations(System.String, OpenTelemetry.AutoInstrumentation.NativeCallTargetDefinition[], Int32)

at OpenTelemetry.AutoInstrumentation.NativeMethods.AddInstrumentations(System.String, OpenTelemetry.AutoInstrumentation.NativeCallTargetDefinition[]) at OpenTelemetry.AutoInstrumentation.Instrumentation.RegisterBytecodeInstrumentations(Payload) at OpenTelemetry.AutoInstrumentation.Instrumentation.Initialize() at System.RuntimeMethodHandle.InvokeMethod(System.Object, Void**, System.Signature, Boolean) at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(System.Object, System.Reflection.BindingFlags) at System.Reflection.MethodBase.Invoke(System.Object, System.Object[]) at OpenTelemetry.AutoInstrumentation.Loader.Loader.TryLoadManagedAssembly() at OpenTelemetry.AutoInstrumentation.Loader.Loader..cctor() at OpenTelemetry.AutoInstrumentation.Loader.Loader..ctor() at System.RuntimeType.CreateInstanceDefaultCtor(Boolean, Boolean) at System.RuntimeType.CreateInstanceImpl(System.Reflection.BindingFlags, System.Reflection.Binder, System.Object[], System.Globalization.CultureInfo) at System.Reflection.Assembly.CreateInstance(System.String) at StartupHook.Initialize() at System.RuntimeMethodHandle.InvokeMethod(System.Object, Void**, System.Signature, Boolean) at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(System.Object, System.Reflection.BindingFlags) at System.StartupHookProvider.CallStartupHook(StartupHookNameOrPath) at System.StartupHookProvider.ProcessStartupHooks(System.String)

Expected behavior The application launches and runs.

Runtime environment (please complete the following information):

  • OpenTelemetry Automatic Instrumentation version: 1.7.0
  • OS: Windows 11
  • .NET version: .NET 8.0

Reproduce

A sample application that demonstrates the issue is here: A sample application that demonstrates the issue is here: https://github.com/cabadam/OpenTelemetryAutoWorker

Steps to reproduce the behavior:

  1. Create a new application using the Worker Service template.
  2. Add a Nuget reference to OpenTelemetry.AutoInstrumentation.
  3. Build the solution (it should succeed).
  4. Execute the instrumentation command on the compiled executable.

Logs attached: logs.zip

cabadam avatar Aug 13 '24 02:08 cabadam

I'm able to reproduce if app is built/published without specifying runtime identifier.

lachmatt avatar Aug 13 '24 13:08 lachmatt

Scripts were expected to be run from the output of build/publish with runtime identifier specified. Improvements were made to the NuGet package/scripts to make this expectation more transparent:

  • existence of the native profiler at the expected location is being verified by the launch scripts, with a warning being issued and a fallback to a detected architecture from runtimes dir in case of native profiler not being present in the publish output root (https://github.com/open-telemetry/opentelemetry-dotnet-instrumentation/pull/3594)
  • warning is issued when app is published without specifying runtime identifier (https://github.com/open-telemetry/opentelemetry-dotnet-instrumentation/pull/3601)

lachmatt avatar Sep 18 '24 11:09 lachmatt

I'm closing the issue as underlying problem was addressed, @cabadam feel free to reopen if you disagree.

lachmatt avatar Sep 20 '24 10:09 lachmatt