Nedeni bilmek isterseniz, nal işleyicisi, gibi bir şey: Eğer kayıt olmak gerekiyor yere sonra
void handler(int signum, siginfo_t *info, void *context)
{
struct sigaction action = {
.sa_handler = SIG_DFL,
.sa_sigaction = NULL,
.sa_mask = 0,
.sa_flags = 0,
.sa_restorer = NULL
};
fprintf(stderr, "Fault address: %p\n", info->si_addr);
switch (info->si_code) {
case SEGV_MAPERR:
fprintf(stderr, "Address not mapped.\n");
break;
case SEGV_ACCERR:
fprintf(stderr, "Access to this address is not allowed.\n");
break;
default:
fprintf(stderr, "Unknown reason.\n");
break;
}
/* unregister and let the default action occur */
sigaction(SIGSEGV, &action, NULL);
}
Ve:
struct sigaction action = {
.sa_handler = NULL,
.sa_sigaction = handler,
.sa_mask = 0,
.sa_flags = SA_SIGINFO,
.sa_restorer = NULL
};
if (sigaction(SIGSEGV, &action, NULL) < 0) {
perror("sigaction");
}
Temel olarak SIGSEGV teslim edildiğinde yangınlar ve bazı ek bilgi almak yönünde bir işaret kayıt, alıntı adam sayfa:
The following values can be placed in si_code for a SIGSEGV signal:
SEGV_MAPERR address not mapped to object
SEGV_ACCERR invalid permissions for mapped object
f iki temel nedenlerle bu harita veya bir seg hatası aldınız - ya eriştiğiniz sayfa hiç eşlenmedi, ya da o sayfaya ne tür bir girişimde bulunmuş olursanız olun.
Sinyal işleyici tetiklendikten sonra, kayıtların kaydını kaldırır ve varsayılan eylemi değiştirir. Bu, normal yoldan yakalanabilmesi için tekrar gerçekleştirilemeyen işlemlere neden olur. Bu, bir sayfa hatasının normal bir davranışıdır (önceliğin bir seg hatası alması), böylece talep çağrıları gibi şeyler çalışır.
['backtrace'] (http://linux.die.net/man/3/backtrace) işlevini kullanabilirsiniz. Fakat programınızı bir hata ayıklayıcısında çalıştırmanızı öneririm, yalnızca backtrace'i görmenize izin vermez, aynı zamanda çağrı yığınına çıkıp değişkenleri incelemenize izin verir. –
"çekirdek döküm dosyaları hakkında bilgi" - Onları kesinlikle öneriyorum. Her şeyi belleğe döküyorlar ve daha sonra bunları gdb ve doğru çalıştırılabilir ile açabilirsiniz. Bu size tam olarak ne olduğunu görme şansı verecektir (bellek dağınık olmadıkça, ama bu oldukça nadir durumdur) - herhangi bir değişkenin değerlerini, backtrace, konularını, vb. (Elbette, maksimum hata ayıklığına sahip olmak güzel olurdu) Bu tür bir soruşturma için seviye ve optimizasyon yok) –
hmm .. '' ptr' tür 'char'' dır, ancak '' merhaba ''türü' char *' dır. Muhtemelen bir karakter atamalısınız ('* ptr = 'h';') veya bir 'memmove() 'kullanın veya doğru olması için örnek için benzer.olduğu gibi, dizge sabitinin adresini alır, onu tamsayıya çevirir, 1 bayta indirir ve daha sonra '* ptr' – SingleNegationElimination