一、概念

Ptrace
是一个系统调用,提供了父进程可以观察和控制其子进程执行的能力,并允许父进程检查和替换子进程的内核镜像(包括寄存器)的值。其基本原理是:当使用了ptrace跟踪后,所有发送给被跟踪的子进程的信号(除SIGKILL)都会被转发给父进程,而子进程则会被阻塞,此时子进程的状态被标注为TASK_TRACED。而父进程收到信号后,就可对停止下来的子进程进行检查和修改,然后让子进程继续运行。
Gdb
GDB是GNU发布的一个程序调试工具,用以调试C或C++程序。可使程序员在程序运行的时候观察程序在内存/寄存器中的使用情况。它的实现基于ptrace系统调用来完成。
其原理使利用ptrace系统调用,在被调试程序与gdb程序之间建立跟踪关系。然后所有发送到被调试程序的信号都会被gdb截获, gdb根据截获的信号,查看被调试程序相应的内存地址,并控制被调试程序的继续执行。 gdb常用的方法是断点设置,单步跟踪,监视器设置。

二、GDB的基本使用方法一

调试前预备知识

继续调试前需要的基本知识,包括调试器GDB的使用方法、Intel架构的基础、栈的基础知识、函数调用时的参数传递方法、汇编语言的阅读。

获取进程的内核转储

ulimit -c
0
-c选项表示内核转出文件的大小限制。上例中限制为0,表示内核转储无效。按照以下方式执行ulimit命令,开启内核转储:
ulimit -c 1073741824
开启内存转储并将内核转储文件大小上限设置为1GB。

启动gdb调试

1.启动

gdb 可执行文件名

上述命令实现以调试形式执行目标文件

2.设置断点

b main

上述命令在main函数处生成断点,可将main换成行号或其他函数

3.运行程序

run -a

上述命令使用run开始运行。不加参数只执行run,就会执行到设置了断点的位置后暂停运行。

4.显示栈帧

bt

上述命令是backtrace的缩写,用于在遇到断点而暂停执行时显示栈帧。

bt 3

显示前三个栈帧,如右图,显示栈帧后就可看出程序在何处停止以及程序的调用路径。

5.显示变量

print argv

上述命令显示变量argv的值,如右图所示, print可简写为p

6.显示寄存器

Info registers 或 info reg

上述命令显示该进程使用到的寄存器

p $eax

上述命令显示寄存器eax的内容

7.单步执行

next 或 step

上述命令逐行执行

next i

上述命令会逐条执行汇编指令

8.继续执行

continue

上述命令会执行到下一个断点,若无断点则程序执行完毕

9.监视点,监控变量在何处改变

awatch argv

上述命令,在变量argv被访问、改变时程序暂停运行

10.删除断点和监视点

delete 编号

上述命令,删除“编号”的监视点或断点

info b

上述命令查看已设置的监视点

11.改变变量的值

set variable 《变量》=《表达式》

上述命令为变量设置一个新值

12.生成内核转储文件

generate-core-file

上述命令将调试中的进程生成内核转储文件

总结:

以上介绍了Linux环境中的标准调试器gdb的基本使用方法。内容包括调试器的使用准备、以调试模式启动一个程序、断点设置、栈帧显示、值显示、继续运行等调试的基本过程。

GDB的简单使用一的更多相关文章

  1. linux系统下gdb的简单调试

    当我们写完程序后,我们会运行程序,在这个过程中,可能程序会出现错误. 我们可以利用gdb调试去看我们运行的程序,并且我们新手通过gdb调试能更好地去读懂 别人的程序.让我们更好的学习. 我们看下面这条 ...

  2. Linux下GDB调试简单示例

    这里介绍对文件first.c的基本GDB调试操作,只有部分命令,只是一个示例,运行环境为装有gcc编译器和gdb调试器的Linux环境,基本GDB调试命令如下表: 命令                 ...

  3. Vim与GCC和gdb完美组合

    一.vim vim修改一下配置文件后,如果你稍微会点vim的命令使用,那可比一般的编辑器好用啊,如果一点不会vim的命令使用,就跟一般编辑器一样使用. 打开etc/vim/vimrc文件 这里的引号是 ...

  4. Linux下gdb的安装及使用入门

    1.安装gdb. 在root用户权限下: root@iZ2zeeailqvwws5dcuivdbZ:~# apt-get update ...... ...... ...... root@iZ2zee ...

  5. 【嵌入式开发】C语言 命令行参数 函数指针 gdb调试

    . 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/21551397 | http://www.hanshul ...

  6. gdb 调试及优化

    调试程序时,在gdb内p var,会提示 No symbol "var" in current context. 即使没有使用任何编译优化选项,仍然不能查看,可能是这些变量被优化到 ...

  7. GDB和GDB Server

    gdb是linux c编程标配的调试工具,平时接触比较多的可能是本机随gcc一起安装的调试工具.但是,即使是本机的gdb,也经常被printf代替,所以接触也仅限于知道. 简单程序固然可以用print ...

  8. C语言 命令行参数 函数指针 gdb调试

    . 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/21551397 | http://www.hanshul ...

  9. 第六课 GDB调试 (上)

    1序言: 1.初学者经过学习前面的Makefile知识,信心满满,内心觉得应该要好好学习不单掌握语言的编写,也要学会相对应的工具调高开发效率.有时我们写出来的代码经过执行结果却跟我们预期不一样那怎么办 ...

随机推荐

  1. java中异常这种技术框架是怎么工作的?

    异常这种技术框架是怎么工作的?马克-to-win:注意是运行程序时,而不是编译时,当一个非正常情况出现,比如除0,就叫异常情况.马克-to- win:为了能优雅的处理异常情况(在出现异常情况后,程序不 ...

  2. mybatis 实现分页和过滤模糊查询

    基于 mybatis 的分页和过滤查询 学习内容: 分页设计 1.分页需传递的参数 2.分页需展示的数据 3.分页需展示的数据的来源 3.1.结果总数与结果集(分页原理) 3.2.总页数.上一页和下一 ...

  3. 在Nginx或Tengine服务器上安装证书

    阿里云SSL证书服务支持下载证书并安装到Nginx.Tengine服务器上,本文介绍了证书安装的具体操作. 前提条件 已准备远程登录工具,例如PuTTY或者Xshell. 背景信息 本文档以CentO ...

  4. Idea中配置Tomcat以及运行maven项目

    maven安装和详细配置 提示:下面是Tomcat9.0版本的下载链接,需要其他版本的去官方网站下载. 链接:https://pan.baidu.com/s/1CONf8KVXM4gyJj4pxjFB ...

  5. Blazor组件自做一 : 使用JS隔离封装viewerjs库

    Viewer.js库是一个实用的js库,用于图片浏览,放大缩小翻转幻灯片播放等实用操作 本文相关参考链接 JavaScript 模块中的 JavaScript 隔离 Viewer.js工程 Blazo ...

  6. k8s节点执行master命令报错 localhost:8080 was refused

    首先是按照二进制方式安装的k8s. [root@ht22 calico]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) [ ...

  7. 五分钟搭建博客系统 OK?

    前言: 请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i 概要: 通过 Docker Compose 在使用Docker容器构建的隔离环境中轻松运行 WordPress.在开始之前,请确保已安 ...

  8. Java语言学习day02--6月29日

    Java语言学习day02###01常用的DOS命令 * A: 常用的DOS命令 * a: 打开Dos控制台 * win+r--cmd--回车 * b: 常用dos命令 * cd.. : 退回到上一级 ...

  9. 『现学现忘』Git基础 — 8、Git创建本地版本库

    目录 1.Git版本库介绍 2.创建本地版本库 场景一:创建一个空的本地版本库. 场景二:项目中已存在文件时,创建该项目的本地版本库. 场景三:在GitHub网站上创建仓库,克隆到本地. 1.Git版 ...

  10. async异步函数的执行顺序

    1 async function async1(){ 2 console.log('async1 start') //2 3 await async2() 4 //await async2()后面的内 ...