Вопрос:

Значение error_code mcontext_t в руке

c

24 просмотра

1 ответ

35 Репутация автора

Мы используем следующие фрагменты кода, чтобы напечатать информацию о контексте пользователя в обработчике, зарегистрированном через sigaction:

ucontext_t *p = (ucontext_t *)context;
fprintf(out, "pc %x\n", p->uc_mcontext.arm_pc);
fprintf(out, "fault addr %x\n", p->uc_mcontext.fault_address);
fprintf(out, "error %lu\n", p->uc_mcontext.error_code);

Кто-нибудь знает, в чем смысл uc_mcontext.error_code. Где я могу найти список возможных кодов ошибок? Благодарю.

Автор: wthung Источник Размещён: 12.06.2019 12:41

Ответы (1)


0 плюса

45569 Репутация автора

«Иногда, когда адрес ошибки равен 0, код ошибки равен 23. Что означает 23?»

Если вы начнете с источника сигнала для arm в /arch/arm/kernel/signal.h , вы обнаружите, что структура определена в /arch/arm/include/uapi/asm/sigcontext.h

И тогда вы найдете error_codeопределен как unsigned longв struct sigcontext, например,

struct sigcontext {
    unsigned long trap_no;
    unsigned long error_code;
    unsigned long oldmask;
    unsigned long arm_r0;
    unsigned long arm_r1;
    unsigned long arm_r2;
    unsigned long arm_r3;
    unsigned long arm_r4;
    unsigned long arm_r5;
    unsigned long arm_r6;
    unsigned long arm_r7;
    unsigned long arm_r8;
    unsigned long arm_r9;
    unsigned long arm_r10;
    unsigned long arm_fp;
    unsigned long arm_ip;
    unsigned long arm_sp;
    unsigned long arm_lr;
    unsigned long arm_pc;
    unsigned long arm_cpsr;
    unsigned long fault_address;
};

( примечание: структура отличается для arm64)

Затем, чтобы узнать, что такое ошибка номер ( errno) 23, вы должны начать с /arch/arm/kernel/signal.c и посмотреть, что linux/errno.hвключено, и следовать по пути /include/linux/errno.h, который ведет к / include / uapi / asm-generic / errno.h и, наконец, приводит вас к /include/uapi/asm-generic/errno-base.h

#ifndef _ASM_GENERIC_ERRNO_BASE_H
#define _ASM_GENERIC_ERRNO_BASE_H

#define EPERM        1  /* Operation not permitted */
...
#define ENFILE      23  /* File table overflow */
...

( примечание: первые 38 кодов ошибок являются общими для всех процессов и архитектур, хотя некоторые не могут возникать на определенных архитектурах. Таким образом, причина, по которой они находятся под определением _ASM_GENERIC_ERRNO_BASE_H)

Который вы можете затем использовать любую общую ссылку для поиска, как man 3 errno, которая объясняет:

   ENFILE          Too many open files in system (POSIX.1-2001).  On
                   Linux, this is probably a result of encountering the
                   /proc/sys/fs/file-max limit (see proc(5)).

Вы также можете обратиться к документации по libc Коды ошибок, чтобы найти:

Macro: int ENFILE

    “Too many open files in system.” There are too many distinct file 
    openings in the entire system. Note that any number of linked 
    channels count as just one file opening; see Linked Channels. This 
    error never occurs on GNU/Hurd systems.

И то, и другое ясно указывает на проблему «слишком много открытых файлов в системе» . Теперь вам нужно выяснить, почему это происходит в вашем коде.

( примечание: в качестве ярлыка вы можете просто выполнить поиск, например, там, "linux error 23"где вы найдете необходимую информацию, например, « Ошибки: системные ошибки Linux» , но, не делая обратного отслеживания, обратите пристальное внимание на то, сколько лет информации о расположении файла , поскольку errnoтеперь он может находиться в совершенно ином месте дерева, чем то, что указано на старых страницах - как в случае со ссылкой выше)

Автор: David C. Rankin Размещён: 12.06.2019 02:48
Вопросы из категории :
32x32