X86 tek adımlı hata ayıklama özelliği ne kadar yavaş?


3

X86 mimarisi bir donanım sağlar tek adım hata ayıklama için tuzak. Çalışan programı ne kadar yavaşlatıyor?

Örneğin, bir işlemin tek adımından başka bir şey yapmamak için bir Linux çekirdek işlevi oluşturulmuşsa, bu işlem ne kadar yavaş çalışacak? İyi bir tahmini olan var mı?

Bir haftayı iş parçacığı hatalarını izleyerek geçirdikten sonra merak ediyorum. Bu böceklerin çoğalması iyi olurdu. Tahmin edilebilir bir şekilde bir ipliğin bir talimatı ile diğer bir talimatın yürütülmesi arasında değişen iki sıralı olarak gerçekleştirilen bir özelliğe ne dersiniz? Ben bir bit dizesi üretecek olan sahte rasgele sayı üretecini düşünüyorum - 0, konu 1'de bir komut yürütmek anlamına gelir, 1, konu 2'de bir komut yürütmek anlamına gelir.

Ardından PRNG'yi tohumlayabilir ve talimatların tekrarlanabilir bir araya getirilmesini sağlayabilirsiniz. Farklı PRNG tohumları farklı serpiştirme düzenleri üretecektir. Bir grup PRNG tohumunun altında bir test davası açabilir ve bir başarısızlığı tetikleyen birini bulursanız, çoğaltın.

Böyle bir şeyin yapıldığını duyan var mı?

Güncelleştirme:

Nasıl yapılabilir?

4 işlemci durumunuz ve 2 çekirdeğinizin olduğu Core i5 gibi bir şey üzerinde çalıştığımızı varsayalım. Tek adımlı tuzağı, kullanıcı alanından çekirdek alanına kadar ileri ve geri götürmek için kullanıyoruz. Demek devletlerin ikisi bu, değil mi? O zaman diğer çekirdeği kullanıcı alanı ve çekirdek alanı durumlarıyla diğer çekirdeğe koştuk, değil mi? İki çekirdek ipliğini senkronize eden bir spinlock (muhtemelen iki spinlock) gibi bir şey var. Her biri birer kilitleme yaparken, diğeri kullanıcı alanını birkaç komutla ilerletir, sonra rolleri senkronize eder ve paylaşırlar.

Görünüşe göre, doğru sayıda dişe ve çekirdeğe sahibiz, böylece her şey bir anda çipe sığar. Ama ne kadar hızlı çalışıyor?

Sadece deneyebiliriz. Birileri bazı çekirdek kodlarını yazabilir. Ya da belki birileri bilir.

Bütün bu süslü şeyler bu yeni çiplerin yaptığı. Olurdum etkilendim ve çabuk olsaydı, tamamen şaşırmadım.


Donanım tek adım tuzağı bir özelliğidir x86 mimarisi ve Intel işlemcilere özgü değildir.
bwDraco

Yanıtlar:


1

Tek adımlı tuzak, her komut tamamlandıktan sonra bir istisna oluşturarak çalışır. Bu tuzağın genel kullanımı, hata ayıklayıcınızın bu istisnayı yakalaması ve bir sonraki talimatla "adım atmadan" önce olaylara bakmanıza izin vermesidir.

Bunu izlemek için yapmayı, kodunuzun ne yaptığına dair ayrıntılı bir günlük oluşturmayı düşünüyorsanız, izleyiciniz / hata ayıklayıcınız bir istisna işleyicisi olarak çağrılır, oturum açmak istediğiniz her şeyi kaydeder ve ardından istisnayı reddeder - tekrarlayın . Bunun izini sürdüğünüz kodun yürütme oranını yavaşlatacağını umuyorum.

Birden fazla iş parçacığından serpiştirme talimatlarına ilişkin fikirlerinizle ilgili olarak, serileştirme sorununuzu çözmenin yolu bu değildir. Tasarımda - kesinlikle - çözmeniz gerekir.


Kanıtlanabilir tasarıma bakış açınız için teşekkür ederiz! O kadar iyi bir programcı değilim. Sadece 15.000 satırlık C, C ++, C ++ 11 kargaşasını, C ++ 11 işleri, satır içi derlemesini, her türlü GNU bağımlılıklarını karıştırıp karıştırdıkları Intel ilkel satırlarını birleştiriyorum hoffman . Tarif ettiğim gibi bir hata ayıklama aracına sahip olmak isterdim!
Brent Baccala

Daha ciddiye, orijinal yayınımın güncellenmesinde açıkladığım gibi, iz / hata ayıklayıcının hiç dahil olması gerektiğini düşünmüyorum. Özel bir çekirdek modülü denir.
Brent Baccala

Tarif ettiğiniz gibi bir hata ayıklama aracı hiç de fena bir fikir değil. Sadece var olmayan seri hale getirme hatalarını bulmaya, düzeltmeye veya kanıtlamaya çalışmanın harika bir yol olmadığını söylüyorum.
Jamie Hanrahan

1
... normal hızda çalışıyorsa. Olduğu gibi, yavaşlama serileştirme sorunlarını da gizleyebilir. (Ya da onları ortaya çıkarabilir ...)
Jamie Hanrahan

0

Yaklaşımınız yararlı görünüyor ve ben de benzer bir sorun hakkında düşündüm.
Bu nasıl yapılabilir? (Statik analiz veya yansıma ve coroutinler de dahil olmak üzere bazı alternatif yollar vardır) .
Ancak, yönteminiz, durumda olmanız durumunda iki alternatif yolla büyük ölçüde optimize edilebilir rasgele Birden fazla talimatın üzerine çıkacağım (belki de birçok talimatın üzerinde bile yapılıyor, ki bu da yapılacak doğal bir şey):

1) Diziye başlamadan önce bir sonraki komut dizisinin rastgele uzunluğunu belirleyin. Sökücü kullanın ve koymak int 3 sekansın sonunda, tek adım yerine.

2) kullanmak istemiyorsanız int 3 nedense veya demonte edicinize tamamen güvenmiyorsanız, tek adımlamayı kullanabilir ve sonra yürütülen talimatları yeni bir hafıza alanına kopyalayabilirsiniz.
Şimdi, bir dahaki sefere rastgele üretici, aynı program konumundan başlayarak aynı miktarda sıralı adım uygulamaya karar verir, sadece kopyalanan talimatları içeren yeni hafıza alanına atlayın ve orada tek bir adım atmadan bu sıranın sonuna kadar çalıştırın. Komut dizisinin sonunda, hata ayıklama yapınıza geri dönmeniz gerekir.

Her iki yaklaşım için de çağrılar, atlamalar ve koşullu atlamalar için özel işlem eklemeniz gerekir.

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.