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:
- Create a new application using the Worker Service template.
- Add a Nuget reference to OpenTelemetry.AutoInstrumentation.
- Build the solution (it should succeed).
- 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)