Aracılığıyla paylaş


Dökümler hakkında SSS

Bu makalede.NET'te dökümleri toplama hakkında sık sorulan sorular yanıtlar.

Linux'ta döküm toplama neden başarısız oluyor?

Döküm toplamayı uygulamak için .NET işlemleri createdump adlı bir alt işlem oluşturur. Bu alt işlem Linux API ptrace() kullanır ve döküm dosyasına yazılan iş parçacığı ve bellek verilerine erişmek için /proc dosya sisteminden okur. API kullanımına birçok Linux dağıtımında varsayılan güvenlik ayarları tarafından izin verilse de, bazen daha az yaygın bir güvenlik yapılandırması erişimi reddeder. Uygulamanın konsolunda yazılan createdump işleminin çıkışını görebilirsiniz, örneğin:

[createdump] The process or container does not have permissions or access: open(/proc/1234/mem) FAILED Permission denied (13)

Erişimin reddedilebileceğinin bir nedeni, güvenlik korumalı alanı bir güvenlik korumalı alanı, bir bpf filtresi kullanarak çağrıya müdahale eder. Open Container Initiative teknolojisini kullanan bir kapsayıcıda çalışan uygulamalar için profilin seccomp çağrısına ptraceizin vermesi gerekir. Örneğin, Dockerkapsayıcı çalışma zamanı olarak kaputun altında kapsayıcılı kullanır. Başlatılırken, yalnızca kapsayıcı konağı 4.8'den yüksek bir çekirdek sürümüne sahipse veya özellik kapsayıcıda belirtilmişse CAP_SYS_PTRACE izin veren ptrace varsayılan bir seccomp profili belirtir.

Çağrılar kesilmezse çekirdek çeşitli yerleşik erişim denetimleri yapar. ptrace() belgeleri, bunların nasıl yapıldığını açıklayan "Ptrace erişim modu denetimi" başlıklı, sonuna yakın ayrıntılı bir açıklama içerir. /proc dosya sistemine erişirken aynı ptrace erişim modu denetiminin bir çeşitlemesi de kullanılır. Aşağıda, gerçekleştirilen güvenlik denetimlerinin kısaltılmış bir özeti ve erişimin reddedilebileceği yerler verilmiştir:

  • Arama işleminin hedef işlemle aynı kullanıcı kimliğine sahip olması veya arama işleminin CAP_SYS_PTRACE olması gerekir. Bunların hiçbiri doğru değilse erişim reddedilir. .NET çalışma zamanı createdump başlatılırken kullanıcı hesabını değiştirmek için hiçbir şey yapmadığından, kullanıcı kimlikleri eşleşmelidir ve bu adım başarılı olmalıdır.
  • createdump'un CAP_SYS_PTRACE yoksa (varsayılan olarak yoktur), atılan hedef işlemin "döküm edilebilir" olarak işaretlenmesi gerekir. Varsayılan olarak, Linux'ta çoğu işlem döküme alınır, ancak prctl() öğesini PR_SET_DUMPABLE seçeneğiyle çağırarak bu ayarı değiştirebilirsiniz. Setcap aracını kullanarak bir işleme özellikler eklerseniz, bu durum işlemin dökümü alınamaz hale getirmesine de neden olabilir. Döküm atanabilir ayarın daha ayrıntılı bir açıklaması ve devre dışı bırakılmasının nedenleri için Linux belgelerine bakın.
  • Etkinleştirilmiş tüm Linux güvenlik modülleri (LSM) numaralandırılır ve her birinin erişimi onaylaması gerekir. Ne yazık ki, bir LSM erişimi reddederse, hangisinin sorumlu olduğunu bilmek için tekdüzen linux raporlama mekanizması yoktur. Bunun yerine, sisteminizde hangilerinin etkinleştirildiğini belirlemeniz ve ardından her birini ayrı ayrı araştırmanız gerekir. Hangi LSM'lerin etkin olduğunu şu şekilde çalıştırarak belirleyebilirsiniz: cat /sys/kernel/security/lsm. Tüm LSM'ler sorumlu olsa da Yama, SELinux ve AppArmor genellikle ilgili olanlardır.

AppArmor ve SELinux'un her ikisi de zengin yapılandırma ve raporlama mekanizmalarına sahiptir, bu nedenle onlarla nasıl çalışacağınızı öğrenmeniz gerekiyorsa, her projenin kendi belgelerini görüntülemek en iyisidir. Yama yalnızca tek bir yapılandırma ayarına sahiptir ve bu ayar şu şekilde çalıştırılarak görüntülenebilir:

cat /proc/sys/kernel/yama/ptrace_scope

Bu komut geçerli Yama ptrace güvenlik ilkesini gösteren bir sayı verir:

  • 0: Klasik ptrace izinleri.
  • 1: Kısıtlanmış ptrace.
  • 2: Yalnızca yönetici ekleme.
  • 3: Ekleme yok.

Yama' nın 0 ve 1 ilkeleri kapsamında createdump için erişim vermesi gerekir, ancak 2. ve 3. ilkeler kapsamında erişim reddedilir. İlke 3 her zaman erişimi reddeder ve ilke 2 varsayılan olarak çalışmaz çünkü createdump normalde CAP_SYS_PTRACE özelliğine sahip değildir.

Linux'ta neden yalnızca dotnet-dump veya kilitlenme işlemim yükseltilmiş olarak çalışıyorsa dökümleri alıyorum?

Bazı Linux tabanlı sistemler, CAP_SYS_PTRACE özelliğine sahip olmak için döküm toplayan tüm işlemleri gerektiren güvenlik ilkeleriyle yapılandırılır. Normalde işlemler bu özelliğe sahip değildir, ancak yükseltilmiş olarak çalıştırmak bunu etkinleştirmenin bir yoludur. Linux güvenlik ilkelerinin döküm toplamayı nasıl etkilediğinin daha ayrıntılı bir açıklaması için bkz. 'Linux'ta döküm toplama neden başarısız oluyor?'.

Kapsayıcı içinde çalışırken neden dökümleri toplamıyorum?

Herhangi bir Open Container Initiative teknolojisi altında çalışan uygulamalar için profilin seccompptrace() çağrısına izin vermesi gerekir. Örneğin, Dockerkapsayıcı çalışma zamanı olarak kaputun altında kapsayıcılı kullanır. Çalışma zamanını başlatırken, yalnızca kapsayıcı konağı 4.8'den yüksek bir çekirdek sürümüne sahipse veya özellik belirtilmişse CAP_SYS_PTRACE izin veren ptrace varsayılan bir seccomp profili belirtir.

Linux güvenlik ilkelerinin döküm toplamayı nasıl etkilediğinin daha ayrıntılı bir açıklaması için 'Döküm toplama neden Linux'ta başarısız oluyor?' sorusuna bakın.

MacOS'ta dökümleri neden toplayamam?

macOS'ta kullanımı ptrace , hedef işlemin konağına düzgün bir şekilde hak kazanmasını gerektirir. Gerekli en düşük yetkilendirmeler hakkında bilgi için bkz. Varsayılan yetkilendirmeler.

.NET uygulamamdaki sorunları tanılamaya yardımcı olmak için dökümleri nasıl kullanabileceğim hakkında nereden daha fazla bilgi edinebilirim?

"Uyumlu bir çerçeve sürümü bulmak mümkün değildi" sorununu nasıl çözebilirim?

Linux'ta ortam DOTNET_ROOT değişkeni ayarlandığında doğru klasöre işaret etmelidir. Başka bir .NET sürümüne işaret ettiğinde her dotnet-dump zaman bu hatayı üretir. DOTNET_ROOT Ortam değişkeni ayarlı olmadığında farklı bir hata oluşturulur ("Bu uygulamayı çalıştırmak için .NET'i yüklemelisiniz").