Aracılığıyla paylaş


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 StackSnapshotCallbackiç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) DoStackSnapshotilk 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.