如何在 Linux 内核中找到信号处理程序定义?
Posted
技术标签:
【中文标题】如何在 Linux 内核中找到信号处理程序定义?【英文标题】:How to find signal handlers definitions in Linux kernel? 【发布时间】:2011-04-09 06:47:20 【问题描述】:我目前正在处理"Creation of Postmortem data logger in Linux on Intel architecture"
。
它只不过是核心实用程序的创建。
任何人都可以分享有关各种信号(SIGSEGV,SIGABRT,SIGFPE etc
)的信号处理程序如何在 Linux 内核内部实现的应用程序崩溃时产生core dump
的详细信息。我需要根据自己的用户特定需求重新编写这些信号处理程序并重建内核。它使我的内核生成具有用户特定需求的核心文件(在应用程序崩溃时),例如显示registers,stackdump and backtrace etc
。
谁能分享一下它的详细信息.... 提前感谢所有回复者:)
【问题讨论】:
【参考方案1】:您可能根本不需要修改内核 - 内核支持在发生核心转储时调用用户空间应用程序。来自core(5)
man page:
自内核 2.6.19 起,Linux 支持 的替代语法
/proc/sys/kernel/core_pattern
文件。 如果这个文件的第一个字符是 管道符号 (|
),然后 该行的其余部分被解释 作为要执行的程序。反而 被写入磁盘文件时, 核心转储作为标准输入给出 到程序。
【讨论】:
【参考方案2】:实际的转储代码取决于转储的格式。对于 ELF 格式,请查看 fs/binfmt_elf.c
文件。我有一个elf_dump_core
函数。 (与其他格式相同。)
这是由kernel/signal.c
中的get_signal_to_deliver
触发的,它调用fs/exec.c
中的do_coredump
,它调用处理程序。
【讨论】:
嗨,马特,非常感谢您的回答。我从 get_signal_to_deliver() 得到了您的方法。但我的问题是这种方法之前的问题。即信号处理程序是如何在内部实现的???。如何定义处理程序,以便它们具有处理每个信号的某种机制???。例如,如果发生“分段错误”,那么“SIGSEGV”信号是如何在内部生成的。此外,如何在内部处理它以使消息“核心转储”。在这里,在“do_coredump()”中创建具有特定大小限制的核心转储文件是次要部分。如果你有我的问题,请回复:)【参考方案3】:LXR, the Linux Cross-Reference,当您想了解 Linux 内核中的某些操作时,通常会很有帮助。它是内核源代码的浏览和搜索工具。
搜索“核心转储”会返回很多命中,但最有希望的两个是fs/exec.c
和fs/proc/kcore.c
(很有希望,因为文件名相当通用,特别是你不想开始与特定于架构的东西)。 kcore.c
实际上是用于内核转储,但fs/exec.c
中的命中是在函数do_coredump
中,这是转储进程内核的主要函数。从那里,您既可以阅读该函数以查看它的作用,也可以搜索以查看它的调用位置。
do_coredump
中的大部分代码都是关于确定是否转储核心以及转储的位置。要转储的内容在最后处理:binfmt->core_dump(&cprm)
,即这取决于可执行格式(ELF、a.out、...)。所以你的下一个搜索是core_dump
struct 字段,特别是它的“用法”;然后选择对应于可执行格式的命中。 ELF 可能是您想要的,因此您可以使用elf_core_dump
函数。
话虽如此,从您对目标的描述来看,我不相信您真正想要的是更改核心转储格式,而不是编写一个分析现有转储的工具。
您可能对existing work on analyzing kernel crash dumps 感兴趣。其中一些工作也与进程转储相关,例如gcore extension to include process dumps in kernel crash dumps。
【讨论】:
嗨,Giles,非常感谢您的回复。我得到了您的回答。但是您提到了核心转储文件的实现及其问题的次要部分。但是,我正在寻找有关它是如何生成的详细信息???。例如,每当程序中发生“分段错误”时,操作系统如何在内部处理该信号并显示“核心转储”消息。在此过程中,必须为该信号定义一个处理程序(此处为 SIGSEGV)。那么,处理程序如何在内部处理该信号并在生成核心转储中发挥作用。如果您收到我的问题..请分享详细信息:)以上是关于如何在 Linux 内核中找到信号处理程序定义?的主要内容,如果未能解决你的问题,请参考以下文章