open-telemetry/opentelemetry-dotnet-instrumentation

AccessViolation when running auto-instrumentation from nuget package

cabadam opened this issue · 3 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

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

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 (#3594)
  • warning is issued when app is published without specifying runtime identifier (#3601)

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