2011-07-31 13 views
6

Gdb'deki işlem için sinyal bilgisi (hangi sinyallerin etkinleştirildiği, hangi bloke edilenler, ne işleyicileri/seçenekleri) almanın bir yolu var mı? info signals var, ama bu bana gdb'nin sinyal işleme bilgilerini veriyor ve hata ayıklama işlemi için bu bilgiye ihtiyacım var - ör. Belirli bir sinyali engelleyip engellemediğini veya bu sinyal için hangi işleyicinin yüklendiğini görmek için.GDB'de işlem sinyali bilgileri nasıl alınır?

Geçerliyse gdb GNU gdb 6.3.50-20050815 (Apple version gdb-1515) (Sat Jan 15 08:33:48 UTC 2011)'dur.

cevap

9

Bir çalışma sürecine eklendiğinizi ve bir çekirdek dökümün incelenmediğini ve gdb'nin sembollere erişebileceğini varsayarsak, hangi sinyaller gibi bilgileri belirlemek için POSIX sinyal işleme işlevlerini çağırmanız gerekir (gdb aracılığıyla). engellenir ve kayıt sinyali işleyicileri nelerdir.

(gdb) call malloc(sizeof(struct sigaction)) 
$1 = (void *) 0x... 
(gdb) call malloc(sizeof(struct sigaction)) 
$2 = (void *) 0x... 
(gdb) call memset($2, 0, sizeof(struct sigaction)) 
... 
(gdb) call sigaction(11, $2, $1) 
$... = 0 
(gdb) print *((struct sigaction *)$1) 
<prints struct sigaction info> 

Bu bilgi size adresini belirlemek için izin vermelidir:

Örneğin, aşağıdaki gibi bir şey bir işleyici sigaction işlevini kullanarak bir SIGSEGV == 11 sinyali için kayıtlı olup olmadığını belirlemek için kullanılabilir işleyici olarak hangi işlevin kullanıldığını belirlemek için bunu 'bilgi sembolü' komutuna iletebilirsiniz.

Hangi sinyallerin engellendiğini belirlemek için benzer işlemler gerçekleştirilebilir.

Ayrıca, özel GDB değişkeni $ _siginfo sizin için kullanılabilir. Daha fazla bilgi için buraya bakın: http://sourceware.org/gdb/onlinedocs/gdb/Signals.html

Benim tahminim, Apple/darwin hedefleri için $ _siginfo'nun mevcut olmamasına rağmen.

+0

$ _siginfo gerçekten kullanılamıyor, ancak manuel yöntem bir çekicilik gibi çalışır (bir düzeltme ile - gdb, dönüş türlerini manuel olarak belirtmeyi gerektirir). Teşekkürler! – StasM

+1

"malloc", "memset" ya da "sigaction" için ikinci argümana geçmeniz gerekmez, sadece 0 (NULL) 'i geçmeniz gerekir, ayrıca' gdb 'ile ilgili' __sigaction 'kullanmanız gerekebilir. * işlev * 'sigaction' yerine * struct *. Örneğin. call malloc (sizeof (struct sigaction)) 'bir kez, sonra' __sigaction (11,0, $ 1) '' derhal ara. – vladr

İlgili konular