Al utilizar la API no administrada para el marco .NET para perfilar un proceso .NET en proceso, es posible buscar el puntero de instrucción IL correlacionado con el puntero de instrucción nativa proporcionado a la función StackSnapshotCallback?Cómo mapea un puntero de instrucción nativa a IL
Como probablemente sea obvio, estoy tomando una instantánea de la pila actual, y me gustaría proporcionar información sobre el número de archivo y línea en el volcado de la pila. El Managed Stack Explorer lo hace al consultar ISymUnmanagedMethod::GetSequencePoints
. Esto es genial, pero los puntos de secuencia están asociados a los desplazamientos, y hasta ahora he supuesto que estos son desplazamientos desde el comienzo del método (en lenguaje intermedio).
En un comentario de seguimiento a su publicación de blog Profiler stack walking: Basics and beyond, David Broman indica que este mapeo se puede lograr usando ICorDebugCode::GetILToNativeMapping
. Sin embargo, esto no es ideal, ya que para obtener esta interfaz es necesario adjuntar a mi proceso otro proceso de depurador.
Me gustaría evitar ese paso porque me gustaría seguir siendo capaz de ejecutar mi aplicación desde el depurador de Visual Studio mientras tomo estas instantáneas. Hace que sea más fácil hacer clic en el número de línea en la ventana de salida y acceder al código en cuestión.
La funcionalidad es posible ... puede escupir un rastro de pila numerado en línea dentro del código administrado, la única pregunta, es accesible. Además, no quiero usar la funcionalidad System::Diagnostics::StackTrace
o System::Environment::StackTrace
porque, por motivos de rendimiento, necesito retrasar el vaciado real de la pila ... por lo que es deseable guardar el costo de resolución de los nombres de los métodos y la ubicación del código para más tarde. ... junto con la capacidad de entremezclar marcos nativos y gestionados.
Pequeño error aquí - frame.pc en la línea 17 del primer fragmento de código debe ser "instructionPtr", que es el parámetro UINT_PTR ip de su devolución de llamada DoStackSnapshot. ¡Gracias, amigo Steven! Realmente me ayudaste :) –
Hrm ... buen punto. No recuerdo de dónde salió frame.pc. Tal vez estaba tratando de dejar en claro lo que se estaba utilizando. En cualquier caso, el valor real con un comentario acerca de dónde viene parece prudente. Editado Gracias por el puntero. – Steven