linux信号在内核中发送或处理的位置?
内核中的信令(中断)机制是如何处理的?我问这个问题的原因是:不知何故,我的应用程序收到了SIGABRT信号,我想知道这是从哪里来的 您应该在应用程序中查找原因,而不是在内核中 通常,当进程直接调用linux信号在内核中发送或处理的位置?,linux,kernel,signals,abort,Linux,Kernel,Signals,Abort,内核中的信令(中断)机制是如何处理的?我问这个问题的原因是:不知何故,我的应用程序收到了SIGABRT信号,我想知道这是从哪里来的 您应该在应用程序中查找原因,而不是在内核中 通常,当进程直接调用abort或assert失败时,进程会收到SIGABRT。准确地找到传递信号的内核部分将不会给您带来任何好处 总之,您的代码或代码使用的库导致了这种情况。请参阅和。cnicutar的答案是最好的猜测 信号可能是由另一个进程发出的,尽管在SIGBART的情况下,它很可能是由通过abort(3)libc函数
abort
或assert
失败时,进程会收到SIGABRT
。准确地找到传递信号的内核部分将不会给您带来任何好处
总之,您的代码或代码使用的库导致了这种情况。请参阅和。cnicutar的答案是最好的猜测 信号可能是由另一个进程发出的,尽管在SIGBART的情况下,它很可能是由通过
abort(3)
libc函数接收信号的同一进程发出的
毫无疑问,您可以使用strace-e kill your app args…
运行应用程序,以快速检查kill
系统调用是否确实从程序或相关库中调用。或者使用gdbcatch syscall
请注意,在某些情况下,当臭名昭著的“OOM killer”启动时,内核本身可能会发出信号,例如SIGKILL
顺便说一句,信号是异步传递的,它们扰乱了程序的正常工作流程。这就是为什么追踪它们很痛苦。除了SystemTap之类的机器之外,我不知道如何跟踪或记录内核中的信号发射和传递。
abort
同步传递信号。您所需要的只是一个核心转储或在调试器下运行,以找到调用它的确切位置。