Bir hata ayıklayıcı nasıl çalışır?


170

Bir hata ayıklayıcının nasıl çalıştığını merak ediyorum. Özellikle zaten çalıştırılabilir çalıştırılabilir 'bağlı' olabilir. Derleyicinin kodu makine diline çevirdiğini anlıyorum, ancak hata ayıklayıcı neye bağlı olduğunu nasıl bilebilir?



@Oktalist Bu makale ilginç ancak Linux'ta hata ayıklama için API düzeyinde soyutlamadan bahsediyor. Sanırım OP kaputun altında daha fazla şey bilmek istiyor.
smwikipedia

Yanıtlar:


96

Bir hata ayıklayıcının nasıl çalıştığının ayrıntıları, hata ayıkladığınız ve işletim sisteminin ne olduğuna bağlı olacaktır. Windows'da yerel hata ayıklama için MSDN: Win32 Hata Ayıklama API'sı hakkında bazı ayrıntıları bulabilirsiniz .

Kullanıcı hata ayıklayıcıya hangi işlemin ekleneceğini ada veya işlem kimliğine göre söyler. Bu bir adsa, hata ayıklayıcı işlem kimliğini arar ve bir sistem çağrısı yoluyla hata ayıklama oturumu başlatır; Windows altında bu DebugActiveProcess olacaktır .

Hata ayıklayıcı eklendikten sonra, herhangi bir kullanıcı arayüzü için olduğu gibi bir olay döngüsüne girecektir, ancak pencereleme sisteminden gelen olaylar yerine, işletim sistemi hata ayıklanan işlemde ne olduğuna bağlı olarak olaylar üretecektir - örneğin bir istisna. Bkz. WaitForDebugEvent .

Hata ayıklayıcı, hedef işlemin sanal belleğini okuyabilir ve yazabilir ve hatta işletim sistemi tarafından sağlanan API'ler aracılığıyla kayıt değerlerini ayarlayabilir. Windows için hata ayıklama işlevleri listesine bakın .

Hata ayıklayıcı, adreslerden değişken adlarına ve kaynak kodundaki konumlara çevirmek için sembol dosyalarındaki bilgileri kullanabilir. Sembol dosyası bilgileri ayrı bir API grubudur ve işletim sisteminin temel bir parçası değildir. Windows'da bu, Debug Interface Access SDK'sı aracılığıyla yapılır .

Yönetilen bir ortamda (.NET, Java, vb.) Hata ayıklama yapıyorsanız, işlem tipik olarak benzer görünecektir, ancak sanal makine ortamı temel işletim sistemi yerine hata ayıklama API'sını sağladığı için ayrıntılar farklıdır.


5
Bu soru aptalca gelebilir, ancak program içinde belirli bir adrese ulaşılırsa işletim sistemi nasıl takip eder. Örneğin, 0x7710cafe adresinde bir kırılma noktası ayarlanır. Talimat işaretçisi değiştikçe işletim sisteminin (veya belki de CPU'nun) talimat işaretçisini tüm kırılma noktası adresleriyle karşılaştırması gerekir, yoksa yanılıyor muyum? Bu nasıl çalışıyor ..?
görünen

3
@StefanFalk Bazı alt düzey ayrıntıları ( x86'da) ele alan bir cevap yazdım .
Jonathon Reinhart

Değişken adlarının adreslerle tam olarak nasıl eşleştiğini açıklayabilir misiniz? Uygulama her çalıştırıldığında değişkenler için aynı bellek adreslerini kullanıyor mu? Her zaman kullanılabilir bellekten eşlendiğini varsaymıştım, ancak baytların uygulamanın bellek alanındaki doğrudan aynı noktaya eşlenip eşlenmeyeceğini hiç düşünmemiştim. Bu büyük bir güvenlik sorunu gibi görünüyor.
James Joshua Street

@JamesJoshuaStreet Bunun hata ayıklayıcıya özgü bir ayrıntı olduğunu hayal ediyorum.
moonman239

Bu cevap bir şey ortaya koyuyor. Ancak op'un bazı API soyutlamalarından ziyade bazı düşük düzey ayrıntılarla daha fazla ilgilendiğini düşünüyorum.
smwikipedia

63

Anladığım kadarıyla:

X86'daki yazılım kesme noktaları için, hata ayıklayıcı komutun ilk baytını CC( int3) ile değiştirir. Bu WriteProcessMemoryWindows ile yapılır . CPU bu talimatı aldığında ve çalıştırdığında int3, bu işlem CPU'nun hata ayıklama istisnası oluşturmasına neden olur. İşletim sistemi bu kesmeyi alır, işlemin hata ayıklandığını fark eder ve hata ayıklayıcı sürecine kesme noktasının vurulduğunu bildirir.

Kesme noktası vurulduktan ve işlem durdurulduktan sonra, hata ayıklayıcı kesme noktaları listesine bakar ve yerine CCoradaki baytla değiştirir . Ayıklayıcı setleri TF, Tuzak Bayrak içinde EFLAGS(değiştirerek CONTEXT) ve işlemi devam eder. Bindirme Bayrağı CPU'nun bir INT 1sonraki talimatta otomatik olarak tek adımlı bir istisna ( ) oluşturmasına neden olur .

Hata ayıklanan işlem bir dahaki sefere durduğunda, hata ayıklayıcı yeniden kesme noktası komutunun ilk baytını ile değiştirir CCve işlem devam eder.

Bu tam olarak tüm hata ayıklayıcılar tarafından nasıl uygulandığından emin değilim, ama bu mekanizma kullanarak kendini hata ayıklamayı başaran bir Win32 programı yazdım. Tamamen yararsız, ama eğitici.


25

Linux'ta bir işlemde hata ayıklama, ptrace (2) sistem çağrısı ile başlar . Bu makalede , ptracebazı basit hata ayıklama yapılarını uygulamak için nasıl kullanılacağı hakkında büyük bir öğretici vardır .


1
Does (2)bize daha fazla (veya daha az) "ptrace bir sistem çağrısıdır" den bir şey söyleyeyim?
Lazer

5
@ESKay, hayır pek değil. (2)Kılavuz bölüm numarası. Manuel bölümlerin açıklaması için en.wikipedia.org/wiki/Man_page#Manual_sections adresine bakın .
Adam Rosenfield

2
@AdamRosenfield 2. bölümün özellikle "Sistem Çağrıları" olması dışında. Dolaylı olarak, evet, bunun ptracebir sistem çağrısı olduğunu söyler .
Jonathon Reinhart

1
Daha pratik olarak, (2)bize man 2 ptracedoğru sayfayı yazabileceğimizi ve alabileceğimizi söyler - burada önemli değil, çünkü ptraceanlaşılacak başka bir şey yok , ama Linux man printfile karşılaştırmak için man 3 printf.
ince

9

Windows işletim sistemindeyseniz bunun için harika bir kaynak John Robbins'in "Microsoft .NET ve Microsoft Windows için Uygulamalarda Hata Ayıklama" olacaktır:

(veya daha eski sürüm: "Uygulamalarda Hata Ayıklama" )

Kitapta, birkaç basit (ancak çalışan) hata ayıklayıcının kodunu içeren bir hata ayıklayıcının nasıl çalıştığı hakkında bir bölüm vardır.

Unix / Linux hata ayıklama ayrıntılarına aşina olmadığımdan, bu şeyler diğer işletim sistemleri için hiç geçerli olmayabilir. Ancak, çok karmaşık bir konuya giriş olarak, ayrıntıların ve API'ların olmasa bile kavramların herhangi bir işletim sistemine 'port' olması gerektiğini tahmin ediyorum.


3

Hata ayıklamayı anlamak için bir diğer değerli kaynak Intel CPU el kitabıdır (Intel® 64 ve IA-32 Architectures Yazılım Geliştirici El Kitabı). Bölüm 3A, bölüm 16'da, özel istisnalar ve donanım hata ayıklama kayıtları gibi hata ayıklama donanım desteğini tanıttı. Bu bölümden:

T (trap) bayrağı, TSS - TSS'sinde T bayrağı ayarlanmış bir göreve geçilmeye çalışıldığında bir hata ayıklama istisnası (#DB) oluşturur.

Window veya Linux'un bu bayrağı kullanıp kullanmadığından emin değilim, ancak bu bölümü okumak çok ilginç.

Umarım bu birine yardımcı olur.


2

Sanırım burada cevaplanması gereken iki ana soru var:

1. Hata ayıklayıcı bir istisna olduğunu nasıl bilebilir?

Hata ayıklanan bir işlemde kural dışı durum oluştuğunda, hata ayıklayıcı, hedef işlemde tanımlanan kullanıcı istisna işleyicilerine kural dışı duruma yanıt verme şansı verilmeden önce işletim sistemi tarafından bildirilir. Hata ayıklayıcı bu (birinci şans) kural dışı durum bildirimini işlememeyi seçerse, kural dışı durum gönderme dizisi daha da ilerler ve hedef iş parçacığına, bunu yapmak istiyorsa kural dışı durumu işlemek için bir şans verilir. SEH istisnası hedef işlem tarafından işlenmezse, hata ayıklayıcıya, hedef işlemde işlenmeyen bir özel durum oluştuğunu bildirmek için ikinci bir şans bildirimi adı verilen başka bir hata ayıklama olayı gönderilir. Kaynak

resim açıklamasını buraya girin


2. Hata ayıklayıcı bir kesme noktasında nasıl durduğunu nasıl bilir?

Basitleştirilmiş cevap : Programa bir kırılma noktası eklediğinizde, hata ayıklayıcı kodunuzu o noktada bir yazılım kesmesi olan int3 komutuyla değiştirir . Sonuç olarak program askıya alınır ve hata ayıklayıcı çağrılır.


1

Anladığım kadarıyla, bir uygulama veya DLL dosyasını derlediğinizde, ne derlerse işlevler ve değişkenleri temsil eden simgeler içerir.

Bir hata ayıklama derlemeniz olduğunda, bu semboller bir sürüm derlemesinden çok daha ayrıntılıdır, böylece hata ayıklayıcının size daha fazla bilgi vermesine izin verir. Hata ayıklayıcıyı bir işleme eklediğinizde, şu anda hangi işlevlere erişildiğine bakar ve buradan kullanılabilir tüm hata ayıklama simgelerini çözer (derlenmiş dosyanın iç kısımlarının nasıl göründüğünü bildiği için, bellekte ne olduğunu belirleyebilir , içeriğin, şamandıraların, dizelerin vb. içeriğiyle). İlk afişin dediği gibi, bu bilgiler ve bu sembollerin nasıl çalıştığı ortama ve dile bağlıdır.


2
Bu sadece sembollerle ilgili. Hata ayıklamada sembollerden çok daha fazlası var.
Jonathon Reinhart
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.