Unhandled Exception: Microsoft.Diagnostics.NETCore.Client.ServerNotAvailableException: Unable to connect to Process
Microsoft.Diagnostics.NETCore.Client를 사용해,
Microsoft.Diagnostics.NETCore.Client
; https://www.nuget.org/packages/Microsoft.Diagnostics.NETCore.Client/
테스트로 덤프를 뜨는 shell script를 만들어 실행했더니,
$ cat test.sh
coproc dotnet /app/ConsoleApp1/bin/Release/net8.0/linux-x64/ConsoleApp1.dll
process_id=`/bin/ps -aux | grep "ConsoleApp1.dll" | grep -v "grep" | awk '{print $2}'`
/app/mdump/bin/Release/net8.0/linux-x64/publish/mdump $process_id /app/${process_id}.dmp
분명 "ConsoleApp1.dll" 프로세스는 실행되고 있었지만 WriteDump를 호출하는 부분에서 이런 예외가 발생합니다.
Unhandled Exception: Microsoft.Diagnostics.NETCore.Client.ServerNotAvailableException: Unable to connect to Process 219. Please verify that /tmp/ is writable by the current user. If the target process has environment variable TMPDIR set, please set TMPDIR to the same directory. Please see https://aka.ms/dotnet-diagnostics-port for more information
at Microsoft.Diagnostics.NETCore.Client.PidIpcEndpoint.GetDefaultAddress(Int32) + 0x1f3
at Microsoft.Diagnostics.NETCore.Client.PidIpcEndpoint.Connect(TimeSpan) + 0x17
at Microsoft.Diagnostics.NETCore.Client.IpcClient.SendMessageGetContinuation(IpcEndpoint, IpcMessage) + 0x1c
at Microsoft.Diagnostics.NETCore.Client.IpcClient.SendMessage(IpcEndpoint, IpcMessage) + 0x1a
at Microsoft.Diagnostics.NETCore.Client.DiagnosticsClient.WriteDump(DumpType, String, WriteDumpFlags) + 0x36
at mdump.Program.Main(String[] args) + 0x114
at mdump!<BaseAddress>+0x1671fc
사실, 원인은 잘 모르겠습니다. 예외 메시지에서 219라고 나온 Process ID도 정확하고, tmp 디렉터리도 분명히 writable인데다, 그렇다고 TMPDIR로 경로를 다르게 바꾼다 해도 문제가 해결되지 않습니다. 그런데, 혹시나 싶어 sleep을 넣었더니,
coproc dotnet /app/ConsoleApp1/bin/Release/net8.0/linux-x64/ConsoleApp1.dll
sleep 1
process_id=`/bin/ps -aux | grep "ConsoleApp1.dll" | grep -v "grep" | awk '{print $2}'`
/app/mdump/bin/Release/net8.0/linux-x64/publish/mdump $process_id /app/$PREFIX-$process_id.dmp
잘 됩니다. ^^;
뭐랄까, WriteDump 시 대상 프로세스 측에 닷넷 런타임의 초기화가 덜 이뤄진 것인지... 라는 짐작만 하게 됩니다.
그나저나, Bash Shell에서 환경변수를 이런 식으로 사용하면,
$ TEST=5
$ PID=100
$ echo "RESULT: $TEST_$PID"
RESULT: 100
의도했던 "5_100"이 아닌 "100"이 나옵니다. 밑줄("_")까지 사라진 것도 희한한데요, 왜냐하면 bash에서 변수는 "
$" 접두사로 시작하지만 끝나는 접미사는 없기 때문에 유효한 변수 식별자를 모두 찾아서 치환하기 때문입니다. 즉, "
$TEST_"가 하나의 변수로 인식된 것이고 그 값은 (null)이기 때문에 결국 "100"이 출력됩니다.
만약, 변수 영역을 확실히 지정하고 싶다면 중괄호를 이용해 감쌀 수 있습니다.
$ echo "RESULT: ${TEST}_$PID"
RESULT: 5_100
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]