| |
|
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
| -> 系统运维 -> 调试器实现原理 (ptrace) 和 Segmentation Fault 产生摘要 -> 正文阅读 |
|
|
[系统运维]调试器实现原理 (ptrace) 和 Segmentation Fault 产生摘要 |
|
? ? 本文总结以下 ptrace 的功能,从流程上讲解以下大致如何实现一个调试器的思路,以及介绍 初学编程时常常遇到的 Segmentation Fault 和 Stack Overflow 的问题的意义。这里注意栈溢出一般是只有 debugger 才能提示,直接运行程序时一样会出现 Segmentation Fault,本文也讲解 debugger 或者用户程序自己如何判断是栈溢出的方案(附相关的系统调用和内核中的原理)。 信号? ? Linux 具备多种信号量,这里摘录以下常见的几个:
调试器怎么实现(ptrace)? ? 如果要搞破解和开发外挂,可以学习调试器实现原理。 ? ? 以下内容总结自 man ptrace 以及网络。首先是图片,ptrace 如何转移子进程控制权到父进程。ptrace 是一个能够将子进程信号转接到父进程的系统调用,同时支援 pid 字节转接信号 handler 控制权和提供读取和修改程序内存数据的功能。
? ? 完整的思路是:一开始运行程序时就引发软中断 sigtrap,即上图中的那样,debugger 进程通过调用fork函数创建子进程并让子进程执行PTRACE_TRACEME,然后子进程再调execve()来运行我们要调试的程序,则 execve 把 elf 加载进来候马上就通过 sigtrap 转接给 debugger 进程。attach 模式则通过系统调用实现暂停运行。然后控制权转至 debugger。 ?Segmentation Fault? ? 对于这个错误,实际上就是内存的越界访问,叫 segmentation 则是因为 elf 是段式虚拟内存,所以历史原因。先引用一段网络上总结地比较好的资料。
? ?涉及内容具体摘要:
内核 do_page_fault 函数源码阅读? ? 以下附 Linux 内核 trap handler 转接的处理 page fault 的?do_page_fault 函数,可以发现 stack overflow 实际也会以 sigsegv 返回。
Stack Overflow??? 了解 ptrace 后可以理解为什么 Stack Overflow 可以被 debugger 捕获。接下来理解为什么 Stack 空间需要设定。我们复习用户地址空间:
? 为了限制 stack,可行的方案有 canary space (类似 guard page)让 trap handler 来决定还能不能 grow。请理解栈溢出的实际行为是 sp 指针增加后访问了非法地址空间,即 SIGSEGV 信号的行为。此时如果无法 grow stack 的话就 core dump 和 kill 了。Linux 下限制 stack grow 的是 ulimit -s SIZE 可调整的,由于栈顶是 VM_MAX, 所以实际上是可以做很大的栈空间的,我野不太清楚为什么要限制栈的大小。 ? ? 结合上述源码,我们知道有一个 first user address,这个东西是地址随机化的哪个,实际不是我们 limit 的部分,他是最底线的限制,不能超过为进程分布的虚拟空间。实际的涉及 ulimit 的部分则是由 expand_stack 函数内部判断的,如果超过限制将不进行分配从而返回错误。 如何在应用层捕获 SIGSEGV 判断栈溢出??? 问题:为什么编写 SIGSEGV signal handler 无法捕获 stack overflow 的情况而还是 core dump 了呢? ? ? 明明都是 segmentation fault?答案是这里涉及的是,由于 handler 运行需要 stack !那么解决方案是 Signal Stack (The GNU C Library) 原理也很简单,就是用 signalstack syscall register 一个 stack 空间即可,这个栈建议设计的是一个堆上的空间。 |
|
|
|
|
| 上一篇文章 下一篇文章 查看所有文章 |
|
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
| 360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年10日历 | -2025/10/21 4:02:46- |
|
| 网站联系: qq:121756557 email:121756557@qq.com IT数码 |