一、概念

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. jq移动端图片预览 (fly-zomm-img.js)

    效果图: ===>==> 里面还与很多属性设置: index  关闭按钮等等 代码: //html-----------------------<div class="he ...

  2. 手动封装一个node命令集工具

    了解NPM安装模块时与项目配置文件中的bin配置发生了什么 了解nodejs在控制台中的运行环境及上下文 基于自定义命令集工具集成Yeoman 一.NPM模块安装内幕与nodejs控制台运行环境 1. ...

  3. MySql各版本

    Mysql 各个版本区别: 1.MySQL Community Server 社区版本,开源免费,但不提供官方技术支持. 2.MySQL Enterprise Edition 企业版本,需付费,可以试 ...

  4. 『现学现忘』Git基础 — 2、Git和SVN的区别

    1.Git和SVN的区别 (1)SVN(集中式版本管理系统) 集中式的版本控制系统都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者 ...

  5. 今天记录一下h5跳转小程序,可以通过短信推广小程序

    今天记录一下h5跳转小程序最简单的方法,首先准备条件,是一个已经上线的小程序 根据URL Schame进行跳转,在微信公众平台登录自己的小程序,然后生成RL Schame,如下图 其次按照步骤进行小程 ...

  6. 安卓记账本开发学习day5之版本兼容问题

    安卓5.0以上版本想要隐藏DatePicker头布局的写法比较复杂,需要一层一层隐藏 int headerId = getContext().getResources().getIdentifier( ...

  7. 小程序canvas 圆角框带填充颜色

    // ctx: 获取canvas的id  ---  const ctx = wx.createCanvasContext('canvasId') // x 横坐标 y 纵左边 w 框的宽度 h 框的高 ...

  8. 迷惑小错 之 :requests.exceptions.ProxyError

    缘由 当打开代理或者抓包工具时 pycharm运行发包请求报错: requests.exceptions.ProxyError.关掉代理后又能正常的请求,这样对于我们日常操作很不方便吗.四处查找资料无 ...

  9. 安全开发运维必备,如何进行Nginx代理Web服务器性能优化与安全加固配置,看这篇指南就够了

    本章目录 1.引言 1.1 目的 1.2 目标范围 1.3 读者对象 2.参考说明 2.1 帮助参考 2.2 参数说明 3.3 模块说明 3.服务优化 3.1 系统内核 3.2 编译优化 3.3 性能 ...

  10. python基础练习题(题目 打印出杨辉三角形前十行。)

    day38 --------------------------------------------------------------- 实例061:杨辉三角 题目 打印出杨辉三角形前十行. 分析: ...