您当前的位置:首页 > 电脑百科 > 网络技术 > 网络软件

gdb到底是怎样实现的?

时间:2019-08-29 09:01:55  来源:  作者:

gdb这个debug工具,应该无人不知吧。服务器开发和客户端开发人员应该都或多或少的通过这个工具排查问题。但有没有想过它的实现原理,为什么打断点能够在断点处停止运行?为什么能查看cpu寄存器?等等。我们就带着这些疑问接着往下看。

知识铺垫

我们都听说过系统调用,这里简单的解释下系统调用的含义。操作系统提供了一种标准的服务来让程序员实现对底层的硬件和服务的控制,比如申请、释放内存,打开、关闭文件等等,这就叫做系统调用(system calls)。

系统调用的过程比较复杂,大致流程是这样的:将相关参数放进系统调用的相关寄存器中,然后调用软中断(0x80),这个中断作用就是让一个程序从用户态陷入到内核态执行,程序将参数和系统调用号交给内核,内核来执行。

看完这个知识铺垫,估计心里猜测跟系统调用有关系了。确实不是特别高大上的技术,只是利用了linux提供的非常优雅的方式:ptrace系统调用,用man查看以下这个系统调用。ptrace可以让父进程观察和控制其子进程的检查、执行,改变其寄存器和内存的内容。主要的作用就是大家常用的打断点的功能了,还有一个功能是打印系统调用的轨迹信息。

我们先来看下这个ptrace函数的原型:

  •  
#include <sys/ptrace.h>
long ptrace(enum __ptrace_request request, pid_t pid,
 void *addr, void *data);

第一个参数决定了ptrace的行为与其他参数的使用方法。可取的值有:

  •  
PTRACE_ME
PTRACE_PEEKTEXT
PTRACE_PEEKDATA
PTRACE_PEEKUSER
PTRACE_POKETEXT
PTRACE_POKEDATA
PTRACE_POKEUSER
PTRACE_GETREGS
PTRACE_GETFPREGS,
PTRACE_SETREGS
PTRACE_SETFPREGS
PTRACE_CONT
PTRACE_SYSCALL,
PTRACE_SINGLESTEP
PTRACE_DETACH

 

下面对常用的几种模式进行说明。

  1. PTRACE_ME(跟踪我):这是相对父进程而言的。功能是指示父进程,对其进行跟踪。trace工具的实现就是用这个模式。
  2. PTRACE_GETREGS:读取寄存器的值。如果你想在系统调用或者进程停止前读取它的寄存器。这就回答了文章开头的第二个问题。
  3. PTRACE_SINGLESTEP:单步。会使内核在子进程的每一条指令执行前先将其阻塞,然后控制权交给父进程。
  4. PTRACE_PEEKDATA:设置断点。调试器怎么设置断点的呢?通常情况下,将当前需要执行的指令替换成trap指令,于是就会停在当前位置。被调试程序恢复运行以后调试器将原指令放回来就可以了。具体实现过程请接着往下看!

详细可参考《http://man7.org/linux/man-pages/man2/ptrace.2.html

gdb三种调试方式

看完ptrace使用方法,再来看看gdb的三种调试方式。

  1. attach并调试一个已经运行的进程: 确定需要进行调试的进程id ;运行gdb,输入attch pid,如:gdb 12345。gdb将对指定进行执行如下操作:ptrace(PTRACE_ATTACH,pid,0,0)
  2. 运行并调试一个新的进程 :运行gdb,通过命令行参数或file指定目标调试程序,如gdb ./test ;输入run命令,gdb执行下述操作: 通过fork()系统调用创建一个新进程 。在新创建的子进程中调用ptrace(PTRACE_TRACEME,0,0,0) 。在子进程中通过execv()系统调用加载用户指定的可执行文件
  3. 远程调试目标主机上新创建的进程 :gdb运行在调试机,gdbserver运行在目标机,通过二者之间定义的数据格式进行通信。

 

断点的实现过程

再回到刚文章开头的问题,断点是怎样实现的呢?我从上面文字中知道gdb调试的实现都是建立在信号的基础上的。在使用参数为PTRACE_TRACEME或PTRACE_ATTACH的ptrace系统调用建立调试关系后,交付给目标程序的任何信号首先都会被gdb截获。

因此gdb可以先行对信号进行相应处理,并根据信号的属性决定是否要将信号交付给目标程序。

当用breakpoint 设置一个断点后,gdb会在=找到该位置对应的具体地址,然后向该地址写入断点指令INT3,即0xCC。

目标程序运行到这条指令时,就会触发SIGTRAP信号,gdb会首先捕获到这个信号。然后根据目标程序当前停止的位置在gdb维护的断点链表中查询,若存在,则可判定为命中断点。



Tags:gdb   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
虽然技术在进步,Linux各发行版本已经更新迭代的很多了,目前Centos、Redhat已经出到8了,Ubuntu已经到21.04了,但我相信一定有很多朋友跟我一样因为各种各样的问题还在使用老久的2...【详细内容】
2021-11-30  Tags: gdb  点击:(41)  评论:(0)  加入收藏
MongoDB作为一款NoSQL数据库,常应用在游戏开发领域。 作为一个后端程序,进行CRUD操作是家常便饭,但如果不看源码,便不会知道MongoDB底层是如何实现的,对自己写的CRUD代码,心里就没...【详细内容】
2020-09-23  Tags: gdb  点击:(190)  评论:(0)  加入收藏
码农需要开花大量时间调试和维护项目代码。代码调试是每个码农的最基础技能之一。大多数人都喜欢IDE给你带来的便利的可视化调试体验,少数人则喜欢GDB式命令行的高效调试,...【详细内容】
2020-07-17  Tags: gdb  点击:(102)  评论:(0)  加入收藏
gdb这个debug工具,应该无人不知吧。服务器开发和客户端开发人员应该都或多或少的通过这个工具排查问题。但有没有想过它的实现原理,为什么打断点能够在断点处停止运行?为什么能...【详细内容】
2019-08-29  Tags: gdb  点击:(241)  评论:(0)  加入收藏
https://typecodes.com/cseries/multilprocessthreadgdb.htmlLinux C/C++开发中gdb进行多进程和多线程的调试一直比较麻烦,在CSDN上看到高科的一篇文章《gdb调试多进程和多线...【详细内容】
2019-08-15  Tags: gdb  点击:(231)  评论:(0)  加入收藏
▌简易百科推荐
说到远程控制,首先你会想到的是什么?是TeamViewer 还是向日葵?抑或是QQ远程还是anydesk?对,就在不久前,我们熟知的都是以上的产品,但是只2020年开始,一款新的远控产品ToDesk进入到我...【详细内容】
2021-12-27  网管世界    Tags:ToDesk   点击:(4)  评论:(0)  加入收藏
# 1. nps-npc1.1 简介nps是一款轻量级、高性能、功能强大的内网穿透代理服务器。目前支持tcp、udp流量转发,可支持任何tcp、udp上层协议(访问内网网站、本地支付接口调试、ssh...【详细内容】
2021-12-22  大数据推荐杂谈    Tags:内网穿透   点击:(8)  评论:(0)  加入收藏
“磨刀不误砍柴工”。 优秀的工具有助于提高工作效率,安全工程师也需要优秀的安全软件来提高工作效率。 在具体的工作场景中,有很多种选择,这里有10种开源的免费安全工具,不仅可...【详细内容】
2021-11-23  山东云管家官方    Tags:安全工具   点击:(33)  评论:(0)  加入收藏
火绒安全软件是一款小巧精悍、独立纯粹的国产安全软件.有很多网友都下载安装了火绒安全软件使用.那么火绒安全软件怎么样呢,火绒安全软件好用吗?下面小编就给大家分析下详解...【详细内容】
2021-11-03  装机吧    Tags:火绒   点击:(34)  评论:(0)  加入收藏
背景上次给大家介绍了实现基础的运维系统功能&mdash;webssh,今日书接上回,继续给大家介绍一个web远程ssh终端录像回放功能。 一、思路网上查了一下资料,搜索了一下关于实现webs...【详细内容】
2021-10-13  小堂运维笔记    Tags:ssh终端   点击:(40)  评论:(0)  加入收藏
QuickPing快速Ping扫描器QuickPing,哪些地址已经使用,哪些可用,图形界面非常直观,而且可以导出列表,该软件体积很小,可以快速的知道网段内哪些主机已经开启,ping成功的即显示出不同...【详细内容】
2021-10-11  海南弱电李工    Tags:网管   点击:(66)  评论:(0)  加入收藏
1、每个项目根据现场的网络环境不同,需要定义不同的IP地址,通过此工具可以快速配置。而且有助于做项目实施资料。2、以前连接过的wifi密码自带记忆功能,通过检索对应的WiFi名字...【详细内容】
2021-10-08  IT游侠    Tags:局域网管理   点击:(49)  评论:(0)  加入收藏
01概述无论是开发还是测试,在工作中经常会遇到需要抓包的时候。本篇文章主要介绍如何在各个平台下,高效的抓包。目前的抓包软件总体可以分为两类: 一种是设置代理抓取http包,比...【详细内容】
2021-09-28  小码哥聊软件测试    Tags:网络抓包   点击:(103)  评论:(0)  加入收藏
Fiddler 简介Fiddler 是位于客户端和服务器端的 HTTP 代理 目前最常用的 http 抓包工具之一 功能非常强大,是 Web 调试的利器关注+转发+私信【软件测试】领取Fiddler安装包和...【详细内容】
2021-09-28  土豆聊软件测试    Tags:抓包工具   点击:(63)  评论:(0)  加入收藏
前言上次有写过一篇《20张图深度详解MAC地址表、ARP表、路由表》的文章,里面有提到了MAC地址表。那么什么是MAC地址表?MAC地址表有什么作用?MAC地址表里面包含了哪些要素?今天...【详细内容】
2021-09-09  网络工程师笔记    Tags:MAC地址表   点击:(76)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条