Soru İnt 3 neden hata ayıklayıcısını durdurmak yerine 64-bit bir SIGSEGV üretir?


32 bit modda programlamada kullandım int 3 Programlarımda hata ayıklayıcı ile belirli bir yerde durmak için çok fazla (kaynağa talimatı yerleştirme). Şimdi 64 bitten işe yaramıyor gibi görünüyor, gdb altında çok sıradan bir SIGSEGV üretiyor ve programı umutsuzluğun ötesinde yok ediyor ("Program SIGSEGV, Segmentation fault" sinyali ile sonlandırıldı. Program artık mevcut değil. ") 64 bit modun başka bir mekanizmaya sahip olup olmadığını veya bazı önbellek boşaltma yapmam gerekip gerekmediğini merak ediyorum ( int 3 bu durumda dinamik olarak oluşturulmuş bir işlem kodudur (0xcc), bir jit benzeri koddur).


16
2017-09-03 08:31


Menşei


Hangi işletim sistemi / sürümü? - Ciro Santilli 新疆改造中心 六四事件 法轮功


Cevaplar:


BarsMonster'ın cevabı gösteriyor ki __asm__("int3"); 64 bit platformlarda çalışmayacak. Bu - en azından bugün (2014) - doğru değil.

Aşağıdaki kod bir üzerinde çalışacaktır amd64 platformu:

breakpoint.c

int main() {
    int i;     
    for(i=0; i<3;i++) {
        __asm__("int3");
    }
}

Önemsiz bir şekilde derleyin: gcc -c breakpoint.c ve başla gdb a.out:

(gdb) run
Starting program: /tmp/a.out 

Program received signal SIGTRAP, Trace/breakpoint trap.
0x00000000004004fb in main ()

Gördünüz mü, gdb sınırda durur.


8
2017-08-21 21:31



Sadece tarih yerine kernel versiyonunu söylemelisin :-) - Ciro Santilli 新疆改造中心 六四事件 法轮功
@CiroSantilli 六四 事件 法轮功 纳米比亚 威 视 İyi nokta. Ne yazık ki artık söyleyemem. Emin olduğum tek şey, 3.x.y çekirdekti. Benim mevcut çekirdeğim 3.19.0 ve hala çalışıyor. - hek2mgl


__debugbreak ()

Bugün bir meslektaşım sormak için geldi   "int 3" işlevi nasıl alınır?   64bit platformları. "İnt 3" nedir?   Bu montaj talimatı   bir kesme noktası oluşturmak için kullanılır. En azından   bu x86 için talimat   işlemci ve hayal edebileceğiniz gibi   çok platforma özeldir.

64bit platformlarda yok   satır içi montaj, böylece   "__asm ​​int 3". Şimdi ne yapmalı? İyi   daha az bilinen bir yapı var   aslında kullanmak daha iyidir   tüm platformlarda çalışır (x64,   Itanium ve x86), hangisi   __debugbreak (). Bu Visual C ++ derleyici intrinsic (Visual içinde tanımlanmış   C ++ 2005 altında vc \ include \ intrin.h,   diğer serin iç tonlarca)   Bu etkili "int 3" hareket edecek   tüm platformlarda.

DebugBreak, Win32 işlev çağrısı   hala etrafında, ama genel olarak   __debugbreak () benim tercihim, eğer başka bir nedenden ötürü değil   işlev çağrısı (bu bir derleyici   intrinsic) ve hata ayıklamasına ihtiyacınız yok   okunabilir bir çağrı yığını almak için semboller.

C ++ yazarsanız muhtemelen   taşınabilir olmayan yazmak istemiyorum   derleme, ve bu sadece bir tane daha   olması gereken yer.

http://blogs.msdn.com/b/kangsu/archive/2005/09/07/462232.aspx


20
2017-09-03 08:36



Bu çok bilgilendirici bir cevaptır, ama benim sorumda belirttiğim gibi, dinamik olarak kod üretiyordum ve bu da derleyici içsel kuralları dışlıyor. Benim sıradan derleyici Visual C ++ değil, benim platform Windows, söz değil. Ayrıca, int 3, en azından 64 bit linux her zamanki gibi davrandığı için yanlıştır. Ayrıca, derleyici bağlı olarak, 64 bit modunda satır içi derleme var. - dsign
hala sadece x86 üzerinde çalışıyor? - Damian
MS IDE'leri için sorun değil, ama Eclipse ve GCC kullanıyorsam ne olur? - Mawg


Ahh, anladım, üzgünüm. İdam için sayfaları korumam gerekiyordu. Int 3 hala geçerli bir hata ayıklama tuzağıdır.


12
2017-09-03 09:24



Ayrıntılar? Akıl yürüten beyinler bilmek ister. - BeeOnRope
Bu soru yedi yıl önceydi, bu yüzden yaptığımın ayrıntılarını hatırlamak zor. Bunun çok basit olduğunu hatırlıyorum, sanırım mmap (2) 'yi aradım ve sadece PROT_EXEC bayrağını ekledim. Yoksa mprotect (2) miydi? - dsign
Muhtemelen infaz asla int3 Çünkü kod bir okuma / yazma / yürütme sayfasındaydı. Yani sadece oraya atlama, içerikten bağımsız olarak bir segfault'a neden oldu. Ve evet, PROT_READ|PROT_EXEC|PROT_WRITE mmap için doğru yaklaşım olmalıdır. Ya da bir okuma / yazma sayfası ile başlayabilir, daha sonra bitirdikten sonra mprotect ile okumak / yürütmek için çevirebilirsin, böylece hiçbir zaman bir write + exec sayfasının eşlenmiş olması (güvenlik nedeniyle). - Peter Cordes


Asla kullanmamanızı tavsiye ederim asm int 3 tüm yapı tipleri için çalıştığı gibi. Kodunuzun bir yerinde bir çizgiyi unutursunuz ve bu büyük sıkıntılar anlamına gelebilir. Alternatif kullanmaktır __debugbreak sadece hata ayıklama modunda geçerlidir.


0
2017-11-12 14:06