概述执行int 3中断是否会停止Linux上的整个进程或仅当前线程?
假设架构是x86。 而 *** 作系统是基于linux的。 给定一个multithreading进程,其中一个线程执行一个int 3指令,中断处理程序是停止执行整个进程还是只执行int 3指令的线程?
如何在linux中给予以太网中断的最高优先级
在中断的时候得到current-> pID
ARM的启动代码 – ARM的IRQ中断手柄
Interrupt Handler使用哪个堆栈 – linux
linux内核的UART中断
由于这个问题是linux特有的,让我们深入内核源码! 我们知道int 3会生成一个SIGTRAP,就像我们在do_int3看到的do_int3 。 SIGTRAP的默认行为是终止进程和转储核心。
do_int3调用了do_trap ,在很多间接的方法之后, do_int3调用了大部分魔法发生的complete_signal 。 在评论之后,很清楚看到发生了什么,而不需要太多解释:
找到一个线程来传递信号。 主线程给出第一个裂缝,但任何线程都可以得到它,除非明确声明它不想。
SIGTRAP是致命的(我们假设我们想要确定什么是默认行为),并且必须转储核心,所以对整个团队来说是致命的
第1003行的循环唤醒所有线程并传递信号。
编辑 :回答评论:
当进程正在进行时, 手册页中的行为已经很好记录(请参阅“信号传递停止”)。 基本上,在内核选择一个处理信号的任意线程之后,如果选中的线程被跟踪,它就进入信号传送停止状态 – 这意味着信号还没有传送给进程,并且可以被跟踪进程抑制。 调试器就是这种情况:在调试时,一个死进程对我们来说是没有用的(这不完全是真的,但是让我们考虑一下实时调试场景,这是在这种情况下唯一有意义的场景),所以默认情况下我们阻止SIGTRAP,除非用户另有指定。 在这种情况下,被跟踪的进程如何处理SIGTRAP(SIG_IGN或SIG_DFL或自定义处理程序)是无关紧要的,因为它永远不会知道它发生了什么。
请注意,在SIGTRAP的情况下,跟踪程序必须考虑除了正在停止的进程以外的各种情况,也在每个ptrace *** 作下的手册页中详细说明。
容易测试:
#include <thread> #include <vector> voID f(int v) { std::this_thread::sleep_for(std::chrono::seconds(2)); if (v == 2) asm(\”int $3\”); std::this_thread::sleep_for(std::chrono::seconds(1)); printf(\”%dn\”,v); // no sync here to keep it simple } int main() { std::vector<std::thread> threads; for (int i = 0; i < 4; i++) threads.emplace_back(f,i); for (auto& thread : threads) thread.join(); return 0; }
如果只有线程被停止,它应该仍然打印来自除2之外的线程的消息,但事实并非如此,并且在打印任何东西之前整个过程停止(或者在调试时触发断点)。 在Ubuntu上,你得到的消息是:
跟踪/断点陷阱(核心转储)
int 3是用户空间代码不允许运行的特权指令。
内核会发送一个SIGTRAP信号给你的进程,SIGTRAP信号的缺省动作是终止整个进程。
答案其实也不是。 Int 3用于触发断点。 中断处理程序很小,中断和其处理程序都不会停止任何线程。
如果没有加载调试器,则处理程序将忽略它或调用 *** 作系统采取某种错误 *** 作,例如引发信号(可能是SIGTRAP)。 没有线程受到伤害。
如果有进程内调试器,则断点ISR将控制权交给它。 断点不会停止任何线程,除了那个断点。 调试器可能会尝试暂停其他。
如果有一个进程外调试器,处理程序将调用它,但是这必须通过 *** 作系统来调解,以便进行合适的上下文切换。 作为该开关的一部分, *** 作系统将暂停调试对象,这意味着其所有线程都将停止。
总结
以上是内存溢出为你收集整理的执行int 3中断是否会停止Linux上的整个进程或仅当前线程?全部内容,希望文章能够帮你解决执行int 3中断是否会停止Linux上的整个进程或仅当前线程?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
请登录后查看评论内容