Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 

System.AppDomain으로부터 .NET Profiler의 AppDomainID 구하는 방법

.NET Profiler의 AppDomainCreationFinished 콜백에는 AppDomainID 값이 있습니다.

ICorProfilerCallback::AppDomainCreationFinished Method
; https://learn.microsoft.com/en-us/dotnet/framework/unmanaged-api/profiling/icorprofilercallback-appdomaincreationfinished-method

이 값 역시 메모리 상의 위치 값이며 실행 시마다 변경되는데, 당연히 System.AppDomain 타입의 Id 속성값과는 별개의 값입니다.

그렇다면 어떻게 Managed 환경의 AppDomain.CurrentDomain과 .NET Profiler의 AppDomainID 값을 연관시킬 수 있을까요? 우선, AppDomain 타입의 경우 공식적으로 이에 대한 값을 제공하지 않습니다.

단지, private 필드로 2.0에서는 _dummyField라는 이름으로, 4.0에서는 _pDomain이라는 이름으로 보유하고 있는데 따라서 Reflection을 통해 이 값들을 접근해 AppDomainID 값을 구할 수는 있습니다.

using System;
using System.Reflection;

class Program
{
    static unsafe void Main(string[] args)
    {
        long result = GetCurrentAppDomainID();
        Console.WriteLine(result);
    }

    private static long GetCurrentAppDomainID()
    {
        Type domainType = typeof(AppDomain);

        long id = TryGetAppDomainId(domainType, "_dummyField");
        if (id == 0)
        {
            id = TryGetAppDomainId(domainType, "_pDomain");
        }

        return id;
    }

    static private long TryGetAppDomainId(Type domainType, string fieldName)
    {
        try
        {
            FieldInfo field = domainType.GetField(fieldName, System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
            if (field == null)
            {
                return 0;
            }

            object objValue = field.GetValue(AppDomain.CurrentDomain);
            if (objValue == null)
            {
                return 0;
            }

            return ((IntPtr)objValue).ToInt64();
        }
        catch { }

        return 0;
    }
}

private 필드를 접근하는 것이 찜찜하죠? ^^ 다행히 더 좋은 방법이 있습니다. 어차피 .NET Profiler DLL 모듈과 연동하기 위해 AppDomainID가 필요한 것이므로 Profiler DLL에게 물어보면 됩니다. 그리고 DLL 측에서는 다음의 메서드들을 이용해 AppDomainID 값을 반환해 주면 됩니다.

ICorProfilerInfo::GetCurrentThreadID Method
; https://learn.microsoft.com/en-us/dotnet/framework/unmanaged-api/profiling/icorprofilerinfo-getcurrentthreadid-method

ICorProfilerInfo2::GetThreadAppDomain Method
; https://learn.microsoft.com/en-us/dotnet/framework/unmanaged-api/profiling/icorprofilerinfo2-getthreadappdomain-method




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]







[최초 등록일: ]
[최종 수정일: 11/7/2023]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 



2016-02-21 04시26분
정성태

... 46  47  48  49  50  51  52  [53]  54  55  56  57  58  59  60  ...
NoWriterDateCnt.TitleFile(s)
12295정성태8/24/20209364오류 유형: 639. Bitvise - Address is already in use; bind() in ListeningSocket::StartListening() failed: Windows error 10013: An attempt was made to access a socket ,,,
12293정성태8/24/202010721Windows: 171. "Administered port exclusions" 설명
12292정성태8/20/202011972.NET Framework: 932. C# - ETW 관련 Win32 API 사용 예제 코드 (1)파일 다운로드2
12291정성태8/15/202010913오류 유형: 638. error 1297: Device driver does not install on any devices, use primitive driver if this is intended.
12290정성태8/11/202011623.NET Framework: 931. C# - IP 주소에 따른 국가별 위치 확인 [8]파일 다운로드1
12289정성태8/6/20209070개발 환경 구성: 502. Portainer에 윈도우 컨테이너를 등록하는 방법
12288정성태8/5/20209040오류 유형: 637. WCF - The protocol 'net.tcp' does not have an implementation of HostedTransportConfiguration type registered.
12287정성태8/5/20209538오류 유형: 636. C# - libdl.so를 DllImport로 연결 시 docker container 내에서 System.DllNotFoundException 예외 발생
12286정성태8/5/202010424개발 환경 구성: 501. .NET Core 용 container 이미지 만들 때 unzip이 필요한 경우
12285정성태8/4/202010746오류 유형: 635. 윈도우 10 업데이트 - 0xc1900209 [2]
12284정성태8/4/202010137디버깅 기술: 169. Hyper-V의 VM에 대한 메모리 덤프를 뜨는 방법
12283정성태8/3/202010666디버깅 기술: 168. windbg - 필터 드라이버 확인하는 확장 명령어(!fltkd) [2]
12282정성태8/2/20209433디버깅 기술: 167. windbg 디버깅 사례: AppDomain 간의 static 변수 사용으로 인한 crash (2)
12281정성태8/2/202011946개발 환경 구성: 500. (PDB 연결이 없는) DLL의 소스 코드 디버깅을 dotPeek 도구로 해결하는 방법
12280정성태8/2/202011075오류 유형: 634. 오라클 (평생) 무료 클라우드 VM 생성 후 SSH 접속 시 키 오류 발생 [2]
12279정성태7/29/202011907개발 환경 구성: 499. 닷넷에서 접근해보는 InterSystems의 Cache 데이터베이스파일 다운로드1
12278정성태7/23/20209318VS.NET IDE: 149. ("Binary was not built with debug information" 상태로) 소스 코드 디버깅이 안되는 경우
12277정성태7/23/202010730개발 환경 구성: 498. DEVPATH 환경 변수의 사용 예 - .NET Reflector의 (PDB 연결이 없는) DLL의 소스 코드 디버깅
12276정성태7/23/20209947.NET Framework: 930. 개발자를 위한 닷넷 어셈블리 바인딩 - DEVPATH 환경 변수
12275정성태7/22/202012497개발 환경 구성: 497. 닷넷에서 접근해보는 InterSystems의 IRIS Data Platform 데이터베이스파일 다운로드1
12274정성태7/21/202011858개발 환경 구성: 496. Azure - Blob Storage Account의 Location 이전 방법 [1]파일 다운로드1
12273정성태7/18/202013481개발 환경 구성: 495. Azure - Location이 다른 웹/DB 서버의 경우 발생하는 성능 하락
12272정성태7/16/20208513.NET Framework: 929. (StrongName의 버전 구분이 필요 없는) .NET Core 어셈블리 바인딩 규칙 [2]파일 다운로드1
12271정성태7/16/202010543.NET Framework: 928. .NET Framework의 Strong-named 어셈블리 바인딩 (2) - 런타임에 바인딩 리디렉션파일 다운로드1
12270정성태7/16/202011330오류 유형: 633. SSL_CTX_use_certificate_file - error:140AB18F:SSL routines:SSL_CTX_use_certificate:ee key too small
12269정성태7/16/20208405오류 유형: 632. .NET Core 웹 응용 프로그램 - The process was terminated due to an unhandled exception.
... 46  47  48  49  50  51  52  [53]  54  55  56  57  58  59  60  ...