GDB bir yürütmeyi nasıl duraklatır


16

Bildiğiniz gibi, hata ayıklama için yürütmeyi duraklatmak için GDB'yi kullanabilir ve kodumuzda kesme noktaları ayarlayabiliriz.

Sorularım, GDB bir işlemi nasıl duraklatır ve i rörneğin kullanarak kayıtların içeriğini görüntülemenize izin verir . Bu kayıtlar diğer işletim sistemleri tarafından sürekli olarak kullanılmıyor mu? nasıl yazılmazlar?

Canlı verilerin değil, yalnızca içeriğin anlık görüntüsü mü?


2
İşletim sistemi programınızı bir süre duraklatmaya ve farklı bir tane çalıştırmaya karar verdiğinde, tüm kayıtların üzerine nasıl yazılmaz?
user253751

CppCon 2018: Simon Brand “C ++ Hata Ayıklayıcıları Nasıl Çalışır” youtube.com/watch?v=0DDrseUomfU
Robert Andrzejuk

Yanıtlar:


24

Mimariye göre biraz değişir, ancak önemli noktalar neredeyse evrensel olarak geçerlidir:

  • Kesme servisi, ISR'yi çalıştırmadan önce CPU durumunun (kayıtlar dahil) belleğe kaydedilmesine ve ISR çıktıkça geri yüklenmesine neden olur.

  • Bir kesme servisi rutini, bu kayıtların kaydedildiği bellek konumunun içeriğini değiştirirse, bir bağlam anahtarı gerçekleştirebilir . Her iş parçacığının, iş parçacığı çalışmadığında kayıtlarının kaydedildiği bir bellek bölgesi vardır.

  • Bağlam anahtarı, bir parçacığının G / Ç, senkronizasyon, önceliğinin ne olduğu, sinyal iletimi vb.

  • Hata ayıklayıcı, iş parçacığının çalıştırılamayacağını garanti eden askıya alma sayısını artırabilir. Sonra iş parçacığının kaydedilmiş kayıt kopyasını inceleyebilir (ve değiştirebilir).


14

@BenVoigt'ın harika bilgilerine ek olarak, bazı eklemeler yapmama izin ver:

Hata ayıklayıcı tarafından hata ayıklanan işlemdeki bir makine kodu değeri (bir yönerge veya bir yönerge) değiştirilerek, kodda, kırılmak istenen (kaynak) satıra karşılık gelen konumda belirli bir tuzak yönergesi ile bir kesme noktası ayarlanır. Bu özel tuzak talimatı bir kesme noktası olarak kullanılmak içindir - hata ayıklayıcı bunu bilir ve işletim sistemi de bilir.

Hata ayıklanan işlem / iş parçacığı tuzak yönergesine çarptığında, @Ben sürecini tetikleyen, daha sonra devam etmekte olan iş parçacığını askıya alan (CPU durumunu belleğe kaydetmeyi de içeren) bir bağlam takasının yarısını içeren, açıklanır. Bu tuzak bir kesme noktası tuzağı olduğundan, işletim sistemi, hata ayıklama işleminin belki de @Ben tarafından açıklanan bir mekanizma kullanılarak askıya alınmasını sağlar ve hata ayıklayıcıyı bildirir ve sonunda sürdürür.

Hata ayıklayıcı, hata ayıklanan askıya alınan işlemin / iş parçacığının kayıtlı durumuna erişmek için sistem çağrılarını kullanır.

Hata ayıklayıcı (şimdi belirli tuzak talimatına sahip olan) kod satırını yürütmek (sürdürmek) için, hata ayıklayıcı, kesme noktası tuzak talimatı ile üzerine yazdığı orijinal makine kodu değerini geri yükleyecektir, muhtemelen başka bir yere başka bir tuzak ayarlayacaktır (örneğin, tek adım, veya kullanıcı yeni kesme noktaları oluşturur) ve işlemi / iş parçacığını çalıştırılabilir olarak işaretleyebilir, belki de @Ben'de açıklandığı gibi bir mekanizma kullanarak.

Gerçek detaylar daha karmaşık olabilir, çünkü uzun süre çalışan bir kırılma noktasını tutmak, gerçek kod için kırılma noktası tuzağını değiştirmek gibi bir şey yapmak anlamına gelir, böylece çizgi çalışabilir ve ardından kesme noktasını tekrar geri takas edebilir ...

Bu kayıtlar diğer işletim sistemleri tarafından sürekli olarak kullanılmıyor mu? nasıl yazılmazlar?

@Ben'in açıkladığı gibi, işlemcilerin zaman dilimleme kullanarak birden çok işlem / iş parçacığı tarafından paylaşılmasına olanak tanıyan zaten var olan iş parçacığı askıya alma / sürdürme özelliğini ( çoklu görevin bağlam değiştirme / değiştirme ) kullanılması.

Canlı verilerin değil, yalnızca içeriğin anlık görüntüsü mü?

İkisi de. Kesme isabet iplik askıya olduğundan, Askıya alma sırasında canlı verilerin anlık (CPU kayıtları, vb ..) ve CPU kayıt değerlerinin yetkili usta iplik be devam gerektiği işlemciye geri . Hata ayıklayıcının kullanıcı arabirimini CPU kayıtlarını (hata ayıklanan işlemin) okumak ve / veya değiştirmek için kullanırsanız, sistem çağrılarını kullanarak bu anlık görüntüyü / master'ı okur ve / veya değiştirir.


1
Pek çok işlemci mimarisi, örneğin IP (komut işaretçisi) bir kesme noktası kaydında depolanan adrese eşit olduğunda tetiklenen hata ayıklama tuzaklarını destekleyerek kodu yeniden yazma gereğini korur. (IP dışındaki kayıtları eşleştirerek, veri kesme noktaları elde edebilir ve her komuttan sonra yakalayarak tek adım alabilirsiniz) Kod açık bir bellekte olmadığı sürece, açıkladığınız şey elbette mümkündür.
Ben Voigt

Re son paragrafta "CPU kayıtlarını değiştirirseniz ...", "CUP kayıtlarının kaydedilmiş kopyasını değiştirirseniz ..." demek istediğinizi düşünüyorum. Daha sonra işletim sistemi devam ettiğinde, değiştirilen veriler geri yazılır gerçek kayıtlara.
jamesqf

@jamesqf, evet, teşekkürler!
Erik Eidt

@BenVoigt, kabul etti. hata ayıklayıcılar sınırsız sayıda kesme noktasını işleyebilirken, donanım sıfır veya birkaçını işleyebilir, bu nedenle hata ayıklayıcı biraz hokkabazlık yapmak zorundadır.
Erik Eidt

@jamesqf: Kopya olarak tanımlamak biraz yanıltıcıdır. İş parçacığı çalışmıyorken iş parçacığı durumu için resmi depolama alanıdır.
Ben Voigt

5

Açıkçası, en azından çoğu durumda, gdb'nin kendisi yürütmeyi duraklatmaz. Aksine, gdb işletim sistemini sorar ve işletim sistemi yürütmeyi duraklatır.

Bu başlangıçta farksız bir ayrım gibi görünebilir - ama dürüst olmak gerekirse, gerçekten bir fark var. Fark şudur: bu yetenek zaten tipik işletim sisteminde yerleşiktir, çünkü iş parçacığının yürütülmesini duraklatması ve yeniden başlatması gerekir - bir iş parçacığının çalışması için zamanlanmadığında (örn. şu anda kullanılamıyorsa) işletim sisteminin çalışması planlanana kadar duraklatması gerekir.

Bunu yapmak için, işletim sisteminin tipik olarak her iş parçacığı için makinenin geçerli durumunu kaydetmek üzere bir bellek bloğu vardır. Bir iş parçacığını duraklatması gerektiğinde, makinenin geçerli durumu bu alana kaydedilir. Bir iş parçacığının devam ettirilmesi gerektiğinde, makinenin durumu bu alandan geri yüklenir.

Hata ayıklayıcının bir iş parçacığını duraklatması gerektiğinde, iş parçacığını diğer nedenlerle tam olarak aynı şekilde durdurur. Ardından, duraklatılmış iş parçacığının durumunu okumak için hata ayıklayıcı iş parçacığının kayıtlı durumuna bakar. Durumu değiştirirseniz, hata ayıklayıcı kaydedilen duruma yazar; bu durumda iş parçacığı devam ettirildiğinde etkili olur.

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.