linux segfault расшифровка error


# ./a.out
Segmentation fault

Подобные сообщение видели многие. Об этой ошибке можно узнать больше если заглянуть в логи ядра, /var/log/messages.

Там можно увидеть строку примерно следующего содержания:


kernel: [2030603.046719] a.out[30170]: segfault at 7fffb45666d8 ip 000000000040067b sp 00007fffb45666e0 error 6 in a.out[400000+1000]

Эта строка генерируется ядром в arch/x86/mm/fault.c


printk("%s%s[%d]: segfault at %lx ip %p sp %p error %lx",
 task_pid_nr(tsk) > 1 ? KERN_INFO : KERN_EMERG,
 tsk->comm, task_pid_nr(tsk), address,
 (void *)regs->ip, (void *)regs->sp, error_code);

print_vma_addr(KERN_CONT " in ", regs->ip);

 printk(KERN_CONT "\n");

Интерес представляет error_code, который процессор ставит при page_fault, а linux в дальнейшем выводит его в лог. Описание можно найти в “Intel® 64 and IA-32 Architectures Software Developer’s Manual  Volume 3A: System Programming Guide, Part 1” –  “Interrupt 14—Page-Fault Exception (#PF)”

Таким образом error_code дает дополнительную информацию об ошибке.

Часто возникающие ошибки и соответствующие им error_code:

Лимит размера стека – error_code 6

Запись в read only память – error_code 7

Чтение памяти по адресу 0 – error_code 4

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s