ICorProfilerInfo2::DoStackSnapshot Yöntemi
Belirtilen iş parçacığı için yığında yönetilen çerçeveleri gösterir ve bir geri çağırma aracılığıyla profil oluşturucuya bilgi gönderir.
Sözdizimi
HRESULT DoStackSnapshot(
[in] ThreadID thread,
[in] StackSnapshotCallback *callback,
[in] ULONG32 infoFlags,
[in] void *clientData,
[in, size_is(contextSize), length_is(contextSize)] BYTE context[],
[in] ULONG32 contextSize);
Parametreler
thread
[in] Hedef iş parçacığının kimliği.
null değerinin geçirilmesi thread
geçerli iş parçacığının anlık görüntüsünü verir. ThreadID
Farklı bir iş parçacığı geçirilirse, ortak dil çalışma zamanı (CLR) bu iş parçacığını askıya alır, anlık görüntüyü gerçekleştirir ve sürdürür.
callback
[in] Profil oluşturucuya yönetilen çerçeveler ve yönetilmeyen çerçevelerin her çalıştırması hakkında bilgi sağlamak için CLR tarafından çağrılan StackSnapshotCallback yönteminin uygulanmasına yönelik bir işaretçi.
StackSnapshotCallback
yöntemi, profil oluşturucu yazıcısı tarafından uygulanır.
infoFlags
[in] tarafından her çerçeve StackSnapshotCallback
için geri geçirilecek veri miktarını belirten COR_PRF_SNAPSHOT_INFO sabit listesi değeri.
clientData
[in] doğrudan geri çağırma işlevine geçirilen istemci verilerine bir StackSnapshotCallback
işaretçi.
context
[in] Yığın adımlarını görmek için kullanılan Win32 CONTEXT
yapısının işaretçisi. Win32 CONTEXT
yapısı CPU yazmaçlarının değerlerini içerir ve CPU'nun belirli bir zamanda durumunu temsil eder.
Tohum, yığının üst kısmında yönetilmeyen yardımcı kod varsa CLR'nin yığın adımını nereden başlatacaklarını belirlemesine yardımcı olur; aksi takdirde, tohum yoksayılır. Zaman uyumsuz bir yürüyüş için bir tohum sağlanmalıdır. Zaman uyumlu bir yürüyüş yapıyorsanız, hiçbir tohum gerekli değildir.
context
parametresi yalnızca parametresinde COR_PRF_SNAPSHOT_CONTEXT bayrağı geçirildiyse infoFlags
geçerlidir.
contextSize
[in] parametresi tarafından context
başvurulan yapının boyutuCONTEXT
.
Açıklamalar
için thread
null değerinin geçirilmesi geçerli iş parçacığının anlık görüntüsünü verir. Anlık görüntüler yalnızca hedef iş parçacığı o sırada askıya alınırsa diğer iş parçacıklarından alınabilir.
Profil oluşturucu yığında gezinmek istediğinde öğesini çağırır DoStackSnapshot
. CLR bu çağrıdan dönmeden önce, yığındaki her yönetilen çerçeve (veya yönetilmeyen çerçeve çalıştırması) için bir kez birkaç kez çağrır StackSnapshotCallback
. Yönetilmeyen çerçevelerle karşılaşıldığında, bunları kendiniz yürümeniz gerekir.
Yığının yürünme sırası, çerçevelerin yığına nasıl gönderildiğinin tersidir: önce yaprak (son itilen) çerçeve, en son ana (ilk itilen) çerçeve.
Yönetilen yığınlarda gezinmek için profil oluşturucuyu programlama hakkında daha fazla bilgi için bkz. .NET Framework 2.0'da Profil Oluşturucu Yığını Yürüyüşü: Temel Bilgiler ve Ötesi.
Yığın kılavuzu, aşağıdaki bölümlerde açıklandığı gibi zaman uyumlu veya zaman uyumsuz olabilir.
Zaman Uyumlu Yığın Kılavuzu
Zaman uyumlu yığın yürüyüşü, bir geri çağırmaya yanıt olarak geçerli iş parçacığının yığınını yürümeyi içerir. Dengeli dağıtma veya askıya alma gerektirmez.
Profil oluşturucunuzun ICorProfilerCallback (veya ICorProfilerCallback2) yöntemlerinden birini çağıran CLR'ye yanıt olarak geçerli iş parçacığının yığınında gezinmek için çağrısı yaptığınızda zaman uyumlu bir çağrı DoStackSnapshot
yaparsınız. ICorProfilerCallback::ObjectAllocated gibi bir bildirimde yığının nasıl göründüğünü görmek istediğinizde bu yararlı olur. Yalnızca yönteminizin ICorProfilerCallback
içinden çağrısı DoStackSnapshot
yaparak ve thread
parametrelerinde context
null değerini geçirirsiniz.
Zaman Uyumsuz Yığın Kılavuzu
Zaman uyumsuz yığın yürüyüşü, bir geri çağırmaya yanıt olarak değil, geçerli iş parçacığının yönerge işaretçisini ele geçirerek farklı bir iş parçacığı yığınını yürümeyi veya geçerli iş parçacığının yığınını yürümeyi gerektirir. Yığının üst kısmı bir platform çağrısının (PInvoke) veya COM çağrısının parçası olmayan yönetilmeyen kod ancak CLR'nin kendisinde yardımcı kodsa zaman uyumsuz bir yürüyüş için çekirdek gerekir. Örneğin, tam zamanında (JIT) derleme veya çöp toplama işlemine yönelik kod yardımcı koddur.
En üstteki yönetilen çerçeveyi bulana kadar hedef iş parçacığını doğrudan askıya alıp yığınını kendiniz yürüyerek bir tohum elde edebilirsiniz. Hedef iş parçacığı askıya alındıktan sonra hedef iş parçacığının geçerli yazmaç bağlamını alın. Ardından, ICorProfilerInfo::GetFunctionFromIP çağrısı yaparak yazmaç bağlamının yönetilmeyen kodu işaret edip etmediğini belirleyin; sıfıra eşit bir FunctionID
değer döndürürse, çerçeve yönetilmeyen koddur. Şimdi, yönetilen ilk çerçeveye ulaşana kadar yığında yürüyün ve ardından bu çerçevenin yazmaç bağlamını temel alarak dengeli bağlamı hesaplayın.
Zaman uyumsuz yığın yürüyüşüne başlamak için tohum bağlamınızla çağrısında DoStackSnapshot
bulunur. Bir tohum sağlamazsanız, DoStackSnapshot
yığının üst kısmındaki yönetilen çerçeveleri atlayabilir ve sonuç olarak size tamamlanmamış bir yığın yürüyüşü sağlayacaktır. Bir çekirdek sağlarsanız, JIT ile derlenmiş veya Yerel Görüntü Oluşturucu (Ngen.exe) tarafından oluşturulan koda işaret etmelidir; aksi takdirde hata DoStackSnapshot
kodunu döndürür CORPROF_E_STACKSNAPSHOT_UNMANAGED_CTX.
Zaman uyumsuz yığın yürüyüşleri, aşağıdaki yönergeleri izlemediğiniz sürece kilitlenmelere veya erişim ihlallerine kolayca neden olabilir:
İş parçacıklarını doğrudan askıya aldığınızda, yalnızca yönetilen kodu hiç çalıştırmamış bir iş parçacığının başka bir iş parçacığını askıya alabileceğini unutmayın.
İş parçacığının yığın adımları tamamlanana kadar her zaman ICorProfilerCallback::ThreadDestroyed geri çağırmanızda engelleyin.
Profil oluşturucunuz çöp toplamayı tetikleyebilen bir CLR işlevine çağrı yaparken kilit tutmayın. Yani, sahip olan iş parçacığı çöp toplamayı tetikleyen bir çağrı yapabilirse kilit tutmayın.
Profil oluşturucunuzun oluşturduğu bir iş parçacığından çağrı DoStackSnapshot
yaparsanız, ayrı bir hedef iş parçacığının yığınında yürüyebilmeniz için kilitlenme riski de vardır. Oluşturduğunuz iş parçacığı belirli ICorProfilerInfo*
yöntemleri (dahil) DoStackSnapshot
ilk kez girdiğinde, CLR bu iş parçacığında iş parçacığı başına CLR'ye özgü başlatma gerçekleştirir. Profil oluşturucunuz yığında yürümeye çalıştığınız hedef iş parçacığını askıya aldıysa ve hedef iş parçacığı bu iş parçacığı başına başlatmayı gerçekleştirmek için gereken bir kilide sahip olduysa kilitlenme oluşur. Bu kilitlenmeyi önlemek için, ayrı bir hedef iş parçacığını izlemek için profil oluşturucu tarafından oluşturulan iş parçacığınızdan ilk çağrıyı DoStackSnapshot
yapın, ancak önce hedef iş parçacığını askıya alma. Bu ilk çağrı, iş parçacığı başına başlatmanın kilitlenme olmadan tamamlanmasını sağlar. Başarılı olursa ve en az bir çerçeve bildirirse DoStackSnapshot
, bu noktadan sonra profil oluşturucu tarafından oluşturulan iş parçacığının herhangi bir hedef iş parçacığını askıya alması ve bu hedef iş parçacığının yığınında gezinme çağrısında DoStackSnapshot
bulunmaları güvenli olacaktır.
Gereksinimler
Platform: Bkz. Sistem Gereksinimleri.
Üstbilgi: CorProf.idl, CorProf.h
Kitaplığı: CorGuids.lib
.NET Framework Sürümleri: 2.0 sürümünden itibaren kullanılabilir
Ayrıca bkz.
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin