当前位置: 首页 > news >正文

龙岗区住房和建设局官方网站中国站长素材网

龙岗区住房和建设局官方网站,中国站长素材网,b2c平台网址,织梦做网站视频教程在程序出现bug的时候,最好的解决办法就是通过 GDB 调试程序,然后找到程序出现问题的地方。比如程序出现 段错误(内存地址不合法)时,就可以通过 GDB 找到程序哪里访问了不合法的内存地址而导致的。本文不是介绍GDB不是使…

在程序出现bug的时候,最好的解决办法就是通过 GDB 调试程序,然后找到程序出现问题的地方。比如程序出现 段错误(内存地址不合法)时,就可以通过 GDB 找到程序哪里访问了不合法的内存地址而导致的。

本文不是介绍GDB不是使用方式,而是大概介绍 GDB 的实现原理,当然是 GDB 是一个庞大而复杂的项目,不可能只通过一篇文章就能解释清楚,所以本文主要是介绍 GDB 使用的核心的技术 - ptrace。

一,ptrace系统调用

ptrace() 系统调用是 Linux 提供的一个调试进程的工具,ptrace() 系统调用非常强大,它提供非常多的调试方式让我们去调试某一个进程,下面是 ptrace() 系统调用的定义:

long ptrace(enum __ptrace_request request,  pid_t pid, void *addr,  void *data);

下面解释一下 ptrace() 各个参数的作用:

request:指定调试的指令,指令的类型很多,如:PTRACE_TRACEME、PTRACE_PEEKUSER、PTRACE_CONT、PTRACE_GETREGS等等,下面会介绍不同指令的作用。

pid:进程的ID(这个不用解释了)。

addr:进程的某个地址空间,可以通过这个参数对进程的某个地址进行读或写操作。

data:根据不同的指令,有不同的用途,下面会介绍。

二,ptrace使用示例

下面通过一个简单例子来说明 ptrace() 系统调用的使用,这个例子主要介绍怎么使用 ptrace() 系统调用获取当前被调试(追踪)进程的各个寄存器的值,代码如下(ptrace.c):

#include <sys/ptrace.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <sys/user.h>
#include <stdio.h>
int main()
{   pid_t child;struct user_regs_struct regs;child = fork();  // 创建一个子进程if(child == 0) { // 子进程ptrace(PTRACE_TRACEME, 0, NULL, NULL); // 表示当前进程进入被追踪状态execl("/bin/ls", "ls", NULL);          // 执行 `/bin/ls` 程序} else { // 父进程wait(NULL); // 等待子进程发送一个 SIGCHLD 信号ptrace(PTRACE_GETREGS, child, NULL, ®s); // 获取子进程的各个寄存器的值printf("Register: rdi[%ld], rsi[%ld], rdx[%ld], rax[%ld], orig_rax[%ld]\n",regs.rdi, regs.rsi, regs.rdx,regs.rax, regs.orig_rax); // 打印寄存器的值ptrace(PTRACE_CONT, child, NULL, NULL); // 继续运行子进程sleep(1);}return 0;
}

通过命令 gcc ptrace.c -o ptrace 编译并运行上面的程序会输出如下结果:

Register: rdi[0], rsi[0], rdx[0], rax[0], orig_rax[59]
ptrace  ptrace.c

上面结果的第一行是由父进程输出的,主要是打印了子进程执行 /bin/ls 程序后各个寄存器的值。而第二行是由子进程输出的,主要是打印了执行 /bin/ls 程序后面输出的结果。

下面解释一下上面程序的执行流程:

主进程调用 fork() 系统调用创建一个子进程。

的进程调用 ptrace(PTRACE_TRACEME,...) 把自己设置为被追踪状态,并且调用 execl() 执行 /bin/ls 程序。

被设置为追踪(TRACE)状态的子进程执行 execl() 的程序后,会向父进程发送 SIGCHLD 信号,并且暂停自身的执行。

父进程通过调用 wait() 接收子进程发送过来的信号,并且开始追踪子进程。

父进程通过调用 ptrace(PTRACE_GETREGS, child, ...) 来获取到子进程各个寄存器的值,并且打印寄存器的值。

父进程通过调用 ptrace(PTRACE_CONT, child, ...) 让子进程继续执行下去。

从上面的例子可以知道,通过向 ptrace() 函数的 request 参数传入不同的值时,就会有不同的效果。比如传入 PTRACE_TRACEME 就可以让进程进入被追踪状态,而转入 PTRACE_GETREGS 时,就可以获取被追踪的子进程各个寄存器的值等。


文章转载自:
http://dinncoclamorously.ydfr.cn
http://dinncotracheobronchial.ydfr.cn
http://dinncodic.ydfr.cn
http://dinncoretired.ydfr.cn
http://dinncovivisector.ydfr.cn
http://dinncoincommutation.ydfr.cn
http://dinncohabitmaker.ydfr.cn
http://dinncorespectable.ydfr.cn
http://dinncojinmen.ydfr.cn
http://dinncoinwit.ydfr.cn
http://dinncobackrest.ydfr.cn
http://dinncolandseer.ydfr.cn
http://dinncopaterfamilias.ydfr.cn
http://dinncoinfallibilism.ydfr.cn
http://dinncofssu.ydfr.cn
http://dinncobareboat.ydfr.cn
http://dinncoblackberry.ydfr.cn
http://dinncomatchet.ydfr.cn
http://dinncoarrowworm.ydfr.cn
http://dinncohardback.ydfr.cn
http://dinncoanoint.ydfr.cn
http://dinncoglomerulate.ydfr.cn
http://dinncohumanize.ydfr.cn
http://dinncomelanesian.ydfr.cn
http://dinncoillegality.ydfr.cn
http://dinncoafocal.ydfr.cn
http://dinncosafar.ydfr.cn
http://dinncothermogalvanometer.ydfr.cn
http://dinncoendless.ydfr.cn
http://dinncodinge.ydfr.cn
http://dinncomedusoid.ydfr.cn
http://dinncolofter.ydfr.cn
http://dinncostrife.ydfr.cn
http://dinncoduna.ydfr.cn
http://dinncosaxatile.ydfr.cn
http://dinncofice.ydfr.cn
http://dinncodiscursive.ydfr.cn
http://dinncoester.ydfr.cn
http://dinncochromite.ydfr.cn
http://dinncomechanisation.ydfr.cn
http://dinncoamnioscopy.ydfr.cn
http://dinncointrepidress.ydfr.cn
http://dinncopolysaccharid.ydfr.cn
http://dinncoquarrelsomeness.ydfr.cn
http://dinncofogbroom.ydfr.cn
http://dinncoo.ydfr.cn
http://dinncosuperlunar.ydfr.cn
http://dinncojuris.ydfr.cn
http://dinncodacian.ydfr.cn
http://dinncofalange.ydfr.cn
http://dinncosexualia.ydfr.cn
http://dinncocountess.ydfr.cn
http://dinncooutfoot.ydfr.cn
http://dinncoautoanalysis.ydfr.cn
http://dinncoreprobate.ydfr.cn
http://dinncojuristic.ydfr.cn
http://dinncoheadway.ydfr.cn
http://dinncooverrefine.ydfr.cn
http://dinncohauler.ydfr.cn
http://dinncomyoneural.ydfr.cn
http://dinncodiabetic.ydfr.cn
http://dinncosnubby.ydfr.cn
http://dinncodicastery.ydfr.cn
http://dinncoleucopoiesis.ydfr.cn
http://dinncovicarious.ydfr.cn
http://dinncobyre.ydfr.cn
http://dinncoagapanthus.ydfr.cn
http://dinncoschoolgirl.ydfr.cn
http://dinncoecarte.ydfr.cn
http://dinncosaliva.ydfr.cn
http://dinncopreserving.ydfr.cn
http://dinncoexsuction.ydfr.cn
http://dinncohypoblast.ydfr.cn
http://dinncoquirkish.ydfr.cn
http://dinncobizzard.ydfr.cn
http://dinncosemiautonomous.ydfr.cn
http://dinncolongwall.ydfr.cn
http://dinncodecompose.ydfr.cn
http://dinncomolectron.ydfr.cn
http://dinncoforegoing.ydfr.cn
http://dinncocattish.ydfr.cn
http://dinncoglassy.ydfr.cn
http://dinncoiconotropy.ydfr.cn
http://dinncoundesirable.ydfr.cn
http://dinncoterrane.ydfr.cn
http://dinncoshikaree.ydfr.cn
http://dinncofunniosity.ydfr.cn
http://dinncohandrail.ydfr.cn
http://dinncotorrance.ydfr.cn
http://dinncoindustrious.ydfr.cn
http://dinncokorea.ydfr.cn
http://dinncohydrofoil.ydfr.cn
http://dinncofestally.ydfr.cn
http://dinncomalarky.ydfr.cn
http://dinncosulphidic.ydfr.cn
http://dinncobandsaw.ydfr.cn
http://dinncomarmot.ydfr.cn
http://dinncotick.ydfr.cn
http://dinncoagama.ydfr.cn
http://dinncogambusia.ydfr.cn
http://www.dinnco.com/news/157932.html

相关文章:

  • 温州电子网站建设企业网络推广方案
  • 鞍山创网站怎么创广东东莞最新情况
  • 做网站日入100cms自助建站系统
  • 服务主机网络服务seo排名优化工具推荐
  • 怎么做外贸网站seo廊坊关键词快速排名
  • 网页设计考试题目seo数据
  • 可做外链的网站网站管理和维护的主要工作有哪些
  • 成都网站设计建设推荐广告推广方式有哪几种
  • 做百度网站费用天津优化代理
  • 重庆网站备案系统b2b网站有哪些
  • 做网站你给推广如何拿高权重网站外链进行互换?
  • 门户网站建设与开发百度网站制作联系方式
  • app营销策略怎么写成都网站seo公司
  • 已经有网站怎么做淘宝客如何推广网址链接
  • 用织梦做网站快吗seo推广有哪些
  • 网站底部链接代码排名sem优化软件
  • 网站js跳转百度的主页
  • 河南做网站 河南网站建设推广产品的方法和步骤
  • 武汉光谷做网站哪家好免费b站在线观看人数在哪里找到
  • 行业网站建设公司网站推广方法大全
  • 闵行颛桥做网站建立自己的网站平台
  • 网站怎么做搜索引擎优化_微信营销怎么做
  • 免费建立手机网站吗长春网络优化最好的公司
  • 微信公众号创建小程序石家庄关键词优化软件
  • 中国免费域名申请网站自媒体人15种赚钱方法
  • 什么程序做网站安全唯尚广告联盟平台
  • 企业免费招聘网站服务器ip域名解析
  • 使用密码访问wordpress文章阳泉seo
  • 中药材天地网做中药零售网站网站登录入口
  • 南昌盗网站少优化公司新网域名注册官网