首页
学习
活动
专区
圈层
工具
发布

调试器之工作原理

软件断点 当cpu执行了特定调试指令后会发出一个中断,而软件断点要做的就是在对应的pc位置“插入”断点指令,说是插入,实际上是修改原指令,触发中断后再写回。...以x86的INT3指令为例,在一个位置设置断点后会保存该位置的原指令,之后在该位置写入INT3,当执行到这条指令的时候发生软中断,内核向子进程发送SIGTRAP信号,之后这个信号转发给父进程,此时再用保存的指令替换之前写入的...硬件断点 某些cpu包含调试用的寄存器,通过设置对应的值来控制对应产生中断的pc位置以及一些其他信息。...ptrace(PTRACE_TRACEME)来设定自身是被trace的对象,接着通过execl来执行对应的命令行程序,此时执行的程序作为调试器的子进程。...而调试器进程本身则是通过wait去等待子进程停下来,等wait返回后就可以查看子进程的信息或者对子进程进行操作。

1.1K10

【Linux】:进程间关系 与 守护进程

会话 4.1 什么是会话 刚刚我们谈到了进程组的概念, 那么会话又是什么呢? 会话其实和进程组息息相关,会话可以看成是一个或多个进程组的集合, 一个会话可以包含多个进程组。...#include /* *功能:创建会话 *返回值:创建成功返回 SID, 失败返回-1 */ pid_t setsid(void); 该接口调用之后会发生: 调用进程会变成新会话的会话首进程...创建子进程, 父进程终止, 子进程继续执行, 因为子进程会继承父进程的进程组 ID, 而进程 ID 则是新分配的, 就不会出现错误的情况 5....控制终端 先说下什么是控制终端? 在 UNIX 系统中,用户通过终端登录系统后得到一个 Shell 进程,这个终端成为 Shell 进程的控制终端。...如果终端关闭,这些进程可能会被终止或无法正常运行。

75610
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Linux 多进程编程详解

    运行(Running):进程正在执行。 阻塞(Blocked):进程正在等待某些事件(如I/O操作)发生。 终止(Terminated):进程已完成执行或被终止。...如果进程在运行过程中需要等待某些事件(如I/O操作),则会进入阻塞状态。当等待的事件发生时,进程重新进入就绪状态,等待调度运行。当进程完成任务或被终止时,进入终止状态。...进程状态:表示进程当前的状态(创建、就绪、运行、阻塞、终止)。 程序计数器(PC):保存进程下一条将要执行的指令地址。 寄存器:保存进程的上下文信息。 内存管理信息:包括进程的地址空间、页表等信息。...父进程和子进程分别打印各自的PID和相关信息,并通过waitpid()等待子进程结束。 2.2 进程的终止 进程在完成任务后会终止,终止进程可以通过exit()系统调用实现。...<< std::endl; return 1; } else if (pid == 0) { // 子进程 close(fd[0]); // 关闭读端

    67910

    ASUS ROG Armory Crate Lite Service v4.2.8 中的权限提升分析 (CVE-2021-40981)

    登录后,Armory Crate 服务,想象中称为 Armory Crate Lite Service,创建了一系列进程,其中我们找到ArmouryCrate.Service.exe了子进程ArmouryCrate.UserSessionHelper.exe...记住这一点,以后会派上用场的。...我们去打猎 现在我们对我们的目标是什么有了一个模糊的概念,让我们继续分析我们将用来搜索漏洞的方法: 隔离所有导致CreateFile通过进程监视器并导致“NO SUCH FILE”或“PATH NOT...为此,请返回菜单栏并单击Options -> Enable Boot Logging,将其余部分保留为默认值,关闭进程监视器并重新启动设备。...根本原因分析 现在让我们简要地看看是什么导致了有问题的漏洞。从前面的截图之一中显示的调用堆栈可以看出,调用发生在函数LoadLibraryExW的偏移处,在进程加载的 DLL 内。

    4K90

    C# 多线程学习系列一

    ,会造成PC停止工作.如果此时重启,更shit的是,所有的应用程序都会停止,且丢失数据. (2)、Windows进程 i、什么是Windows进程,以及它解决的问题 MS为了解决单个"工作线程"的问题,...一个Chrome浏览器进程包含了很多子进程(子进程可以共享父进程的资源),后面包含了正在使用的资源集合,包括CPU、内存等.每个进程都有一个虚拟空间地址(PID)....当一个应用程序应为代码故障发生卡死等问题,并不会影响其他的应用程序的运行,只需要打开任务管理器,将该进程关闭即可.其他应用程序的数据也不会丢失,因为它们是彼此独立的进程. ii、Window进程的安全性...在Windows中,进程之间不能相互访问(不包括父子进程),单个进程也无法访问Windows内核. iii、关于CPU的问题 虽然Windows进程很好的解决了单个"工作线程"的问题,Windows不会发生一个应用程序崩溃...但是如果PC只有一个CPU,当CPU本身发生死循环等问题,还是会导致PC停止工作. iv、什么是Windows线程,以及Windows线程解决的问题 MS为了解决单个进程执行异常,导致CPU停止工作的问题

    80950

    【Linux】进程调度算法、进程切换、环境变量

    靠程序计数器(PC/EIP 寄存器):这个寄存器专门记录 “当前进程正在执行的指令的下一行指令地址”;进程运行时,CPU 会根据 PC/EIP 的地址取指令执行;进程切换时,PC/EIP 的值会随上下文保存...只需重新登录 Xshell 即可恢复 —— 因为临时修改的PATH仅在当前终端会话生效,会话关闭(重新登录)后会自动加载系统默认的PATH配置。...简单说:临时修改是 “内存级的临时变量”,没动到存储配置的文件,所以重启会话就能恢复~ 问题 5:为什么登录系统后会直接进入家目录?...(Shell)通过export MYENV=123456设置环境变量后,子进程(....常规命令 常规命令的执行,是通过创建子进程来完成的—— 这些命令是独立的程序,Bash 会启动一个新的子进程,让子进程去运行这个程序,程序跑完子进程就结束。 2.

    34210

    Linux系统编程:进程控制(创建,终止,等待)

    4.全局变量errno error用于储存最后一次的错误码; 发生错误一次进程不就结束了吗,为什么会说是"最后一次"?...,最后会转化为硬件信号给操作系统; 三,进程等待 3.1什么是进程等待 等待其实就是阻塞,让一个进程处于阻塞状态; 3.2为什么要进程等待 1.我们创建子进程是让子进程帮我们执行其他的任务,有的时候我们需要知道子进程的结果...,这样就不会出现僵尸状态了; 3.3怎么做进程等待 这里是通过两个系统调用来实现的:wait/waitpid接口; 3.4wait接口 pid_t wait(int *status);等待任意一个子进程结束...调用函数,自己帮我们填充这个变量的; wait函数等待成功后,status就会获得该子进程的退出码; 为什么不使用全局变量来获取子进程的退出状态呢?...因为父子进程一旦一方修改资源就会发生写时拷贝,进程具有独立性,双方看不到同一个status; 3.5waitpid接口 pid_t waitpid(指定子进程pid,子进程退出状态,选项); 等待成功就会返回子进程的

    39110

    字节二面:Redis 的大 Key 对持久化有什么影响?

    AOF 重写机制和 RDB 快照(bgsave 命令)的过程,都会分别通过 fork() 函数创建一个子进程来处理任务。...在通过 fork() 函数创建子进程的时候,虽然不会复制父进程的物理内存,但是内核会把父进程的页表复制一份给子进程,如果页表很大,那么这个复制过程是会很耗时的,那么在执行 fork 函数的时候就会发生阻塞现象...那什么时候会发生物理内存的复制呢?...所以,有两个阶段会导致阻塞父进程: 创建子进程的途中,由于要复制父进程的页表等数据结构,阻塞的时间跟页表的大小有关,页表越大,阻塞的时间也越长; 创建完子进程后,如果子进程或者父进程修改了共享数据,就会发生写时复制...AOF 重写机制和 RDB 快照(bgsave 命令)的过程,都会分别通过 fork() 函数创建一个子进程来处理任务。

    55220

    美团一面:为什么线程崩溃崩溃不会导致 JVM 崩溃

    当然了发 kill 信号必须具有一定的权限,否则任意进程都可以通过发信号来终止其他进程,那显然是不合理的,实际上 kill 执行的是系统调用,将控制权转移给了内核(操作系统),由内核来给指定的进程发送信号...(假设为 11,即 SIGSEGV,一般非法访问内存报的都是这个错误) 操作系统根据情况执行相应的信号处理程序(函数),一般执行完信号处理程序逻辑后会让进程退出 注意上面的第五步,如果进程没有注册自己的信号处理函数...,那么操作系统会执行默认的信号处理程序(一般最后会让进程退出),但如果注册了,则会执行自己的信号处理函数,这样的话就给了进程一个垂死挣扎的机会,它收到 kill 信号后,可以调用 exit() 来退出,...,每个进程的虚拟空间都是一样的,而线程会共用进程的地址空间,以 32 位虚拟空间,进程的虚拟空间分布如下 那么 stackoverflow 是怎么发生的呢,进程每调用一个函数,都会分配一个栈桢,然后在栈桢里会分配函数里定义的各种局部变量...那么最终会走到 report_and_die 这个方法,这个方法主要做的事情是生成 hs_err_pid_xxx.log crash 文件(记录了一些堆栈信息或错误),然后退出 至此我相信大家明白了为什么发生了

    2.9K20

    do_fork 的实现

    上面讲述了如何通过 fork, vfork, pthread_create 去创建一个进程,或者一个线程。...通过分析最终 fork, vfork, pthread_create 最终都会通过系统调用 do_fork 去创建进程。...task_struct 结构 为子进程分配内核栈 将父进程 task_struct 的内容复制给子进程的 task_struct 设置子进程的内核栈 建立 thread_info 和内核栈的关系 清空子进程需要调度的标志位...thread_struct:在内核态两个进程发生切换时,用来保存上一个进程的相关寄存器 pt_regs:当用户态的进程发生异常(系统调用,中断等)进入内核态时,用来保存用户态进程的寄存器状态 int...pt_regs 结构 将新创建进程的 thread_struct 结构清空 用户进程的情况 获取当前进程的 pt_regs 一般用户态通过系统调度陷入到内核态后处理完毕后会通过 x0 寄存器设置返回值的

    98021

    惊群问题 | 复现 | 解决

    什么是惊群问题 惊群问题又称惊群效应,当多个进程等待同一个事件,事件发生后内核会唤醒所有等待中的进程,但是只有一个进程能够获得 CPU 执行权对事件进行处理,其他的进程都是被无效唤醒的,随后会再次陷入阻塞状态...发生惊群问题的时机 通过上面的介绍可以知道,惊群问题主要发生在 socketaccept 和 socketselect 两个函数的调用上。 下面我们通过两个例子复现这两个系统调用的惊群。...在调用完 pcntl_fork 函数后,如果派生子进程成功,那么该函数会有两个返回值,在父进程中返回子进程的进程 ID,在子进程中返回 0;派生失败则返回 -1。...用户程序:加锁 通过上面我们可以知道,惊群问题发生的前提是多个进程监听同一个套接字上的事件,所以我们只让一个进程去处理监听套接字就可以了。...if (ngx_add_event(rev, NGX_READ_EVENT, 0) == NGX_ERROR) { return NGX_ERROR; } 总结 通过本文我们了解到什么是惊群问题

    2.4K40

    软件测试|connection-reset-by-peer问题定位

    accept发生错误最常见就是句柄被打满了,查看进程监听端口链接情况和进程句柄使用情况。...- - - - - - 5.通过netstat or ss查看监听端口的链接情况,通过lsof查看进程句柄占用情况,通过ulimit查看系统限制。发现果然进程句柄被打满了,超过了10240的限制。...至此,虽然明确了客户端请求会响应connection reset by peer是由于服务进程句柄被打满导致的,但是依然不知道什么原因导致了服务进程句柄被打满。...那么接下来定位的重点就是为什么服务端会突然出现阻塞?由于不稳定复现,是什么触发了阻塞?...,等待所有分组死掉·CLOSING: 双方同时尝试关闭,等待对方确认三次握手图片四次挥手图片7.到了应用程序层面,要分析进程过去发生了什么,只能从应用日志和服务监控入手了,从历史监控曲线(内存、句柄、流量

    1.4K10

    Linux进程通信——管道

    这个过程其实就相当于父进程通过操作系统写给管道,也就是相当于写给操作系统,然后子进程通过操作系统从管道当中读取内容。...3.如果写端关闭,读端会发生什么呢?...4.读关闭会发生什么呢? 操作系统当然会自己判断,如果都不读了,就没必要去写了,会发送给进程一个信号,终止写端。 这里操作系统会发送13信号。...本来应该打印在左侧的通过管道文件传到了右边。此时这里就完成了命令行式的打印。 但是这里还是大小不变。这是为什么呢?...第二个 我们读端输出并没有换行,为什么自己换行了呢?因为我们平时输入之后会按回车,其实就等于\n 了,打印的时候也算上了\n,所以打印出来的结果就是带换行的。 这里也可以这么写:

    4.8K70

    GPDB中Latch等待与唤醒实现机制

    通过is_set来实现等待。 epoll_ret_event[]数组:epoll_wait将发生的事件集合从内核复制到该数组中。...4、WaitEventSetWait 等待注册的事件发生。调用epoll_wait函数来监听epoll上注册的事件。如果没有任何IO事件,则一直被阻塞,直到有IO事件发生。...5、FreeWaitEventSet 关闭epoll文件描述符,释放WaitEventSet。...1)fork出一个子进程时,子进程会将父进程继承的管道关闭掉。然后自己重新创建一个管道。得到2个fd。pipefd[0]用于读取写入管道的内容,pipefd[1]用于向管道写入。...通过全局变量selfpipe_readfd和selfpipe_writefd分别表示读和写fd。当然,这是用于同一个进程不同线程之间进行管道通信。

    38830

    通过fork来剖析Linux内核的内存管理和进程管理(下)

    本文讲解fork的时候进程管理相关的内容,主要讲解fork的时候进程如何组装调用相关的基础设施组件,以及如何加入运行队列的,调度执行的时候究竟会发生什么。...,异常的现场(通用寄存器的内容,如发生异常时的x0-x30,sp, pc, pstate)会被压到内核栈,通过pt_regs结构来描述,而当异常处理结束的时候,会需要恢复现场,将这些保存的值恢复到通用寄存器中...最后两句,来设置的是进程切换时,子进程的pc和sp,当子进程第一次被调度的时候,从ret_from_fork开始执行指令,栈指针指向childregs,即为设置后pt_regs。...好像什么都没发生一起,但是他却孕育了新的进程在当前cpu或者其他cpu上活跃着。...copy_thread来设置异常返回的上下文和调度上下文这是为调度子进程后处理器状态做准备,最后通过wake_up_new_task来唤醒子进程将它放置到合适cpu的运行队列,来等待合适的调度时机参与进程调度

    2K32

    redis入门(二)

    bgsave命令:redis进程会执行fork操作创建进程执行保存RDB快照。只有在fork子进程才会短时间阻塞。建议大家都是用bgsave命令保存RDB快照。...原理 [20191030161328.png] 执行bgsave命令,Redis父进程判断当前是否存在正在执行的子进程,如RDB/AOF子进程,如果存在bgsave命令直接返回。...父进程执行fork操作创建子进程,fork操作过程中父进程会阻塞,通过info stats命令查看latest_fork_usec选项,可以获取最近一个fork操作的耗时,单位为微秒。...子进程创建RDB文件,根据父进程内存生成临时快照文件,完成后对原有文件进行原子替换。...由于fork操作运用写时复制技术,子进程只能共享fork操作时的内存数据。 子进程根据内存快照,按照命令合并规则写入到新的AOF文件。

    96100

    探究 Nginx 中 reload 流程的真相

    那么下面我们通过分析 nginx 的 reload 流程,来探究下 nginx 到底做了些什么?所谓优雅的退出和立即退出有什么区别? reload 流程 ?...我们会在第五步在启动新的 worker 子进程以后,由 master 进程再向老 worker 子进程发送 QUIT 信号,QUIT 信号和 TERM,INT 信号是不一样的,QUIT 信号是请优雅地关闭子进程...那么老的 master 子进程收到 QUIT 信号后,首先关闭监听句柄,也就是说这个时候新的连接只会到新的 worker 子进程,所以虽然他们之间有时间差,但是时间是非常快速的,那么关闭监听句柄后,处理完当前连接后就结束进程...那么老的 worker 子进程在正常的情况下会在处理已经建立好的连接上的请求之后关闭这个连接,哪怕这个连接是 keeplive 请求也会正常关闭。...,时间到了之后会强制把老的 worker 进程退出掉。

    3.3K20
    领券