.NET Framework 용 관리되지 않는 API를 사용하여 in-process .NET 프로세스를 프로파일 링하는 경우 해당 프로세스와 관련된 IL 명령어 포인터를 조회 할 수 있습니까? StackSnapshotCallback 함수에 제공된 네이티브 명령어 포인터?네이티브에서 일리노이 명령 포인터를 처리 중일 때 어떻게 처리합니까?
아마도 현재 스택의 스냅 샷을 찍고 있으며 스택 덤프에 파일 및 줄 번호 정보를 제공하려고합니다. 관리 스택 탐색기은 ISymUnmanagedMethod::GetSequencePoints
을 쿼리하여이 작업을 수행합니다. 이것은 훌륭하지만, 시퀀스 포인트는 오프셋과 관련되어 있으며, 나는 지금까지 (중간 언어에서) 메소드의 시작부터 오프셋이라고 가정했습니다.
그의 블로그 게시물 Profiler stack walking: Basics and beyond에 대한 후속 댓글에서 David Broman은이 매핑이 ICorDebugCode::GetILToNativeMapping
을 사용하여 달성 될 수 있음을 나타냅니다. 그러나이 인터페이스를 가져 오려면 다른 프로세스에서 디버거 프로세스에 연결해야하므로 이상적인 것은 아닙니다.
나는 이러한 스냅 샷을 찍는 동안 Visual Studio 디버거 내에서 응용 프로그램을 계속 실행할 수 있기를 원하기 때문에이 단계를 피하고 싶습니다. 출력 창에서 행 번호를 클릭하고 해당 코드로 쉽게 이동합니다.
기능이 가능합니다. 관리 코드 내부에서 줄 번호가 지정된 스택 추적을 뱉어 낼 수 있습니다. 유일한 질문인데 액세스 할 수 있습니다. 또한 성능상의 이유로 스택의 실제 덤프를 지연시켜야하므로 System::Diagnostics::StackTrace
또는 System::Environment::StackTrace
기능을 사용하고 싶지 않습니다. 나중에 메서드 이름과 코드 위치를 확인하는 비용을 절약하는 것이 바람직합니다. ... 네이티브 프레임과 관리 프레임을 섞어 사용할 수 있습니다.
여기서 작은 실수는 - 첫 번째 코드 조각의 17 번째 줄에있는 frame.pc가 "instructionPtr"이어야하며 이는 DoStackSnapshot 콜백의 UINT_PTR ip 매개 변수입니다. 스티븐 감사합니다! 당신은 정말로 나를 도왔습니다 :) –
Hrm ... 좋은 지적. 나는 frame.pc가 어디에서 왔는지 기억이 안 난다. 어쩌면 내가 사용하고 있던 것이 무엇인지 분명히하려고 노력했을 것입니다. 어쨌든 어디서 오는지에 대한 의견이있는 실제 가치는 신중하게 보입니다. 편집 됨. 포인터 주셔서 감사. – Steven