GDB的简单使用一
GDB的简单使用一
一、概念
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的简单使用一的更多相关文章
- linux系统下gdb的简单调试
当我们写完程序后,我们会运行程序,在这个过程中,可能程序会出现错误. 我们可以利用gdb调试去看我们运行的程序,并且我们新手通过gdb调试能更好地去读懂 别人的程序.让我们更好的学习. 我们看下面这条 ...
- Linux下GDB调试简单示例
这里介绍对文件first.c的基本GDB调试操作,只有部分命令,只是一个示例,运行环境为装有gcc编译器和gdb调试器的Linux环境,基本GDB调试命令如下表: 命令 ...
- Vim与GCC和gdb完美组合
一.vim vim修改一下配置文件后,如果你稍微会点vim的命令使用,那可比一般的编辑器好用啊,如果一点不会vim的命令使用,就跟一般编辑器一样使用. 打开etc/vim/vimrc文件 这里的引号是 ...
- Linux下gdb的安装及使用入门
1.安装gdb. 在root用户权限下: root@iZ2zeeailqvwws5dcuivdbZ:~# apt-get update ...... ...... ...... root@iZ2zee ...
- 【嵌入式开发】C语言 命令行参数 函数指针 gdb调试
. 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/21551397 | http://www.hanshul ...
- gdb 调试及优化
调试程序时,在gdb内p var,会提示 No symbol "var" in current context. 即使没有使用任何编译优化选项,仍然不能查看,可能是这些变量被优化到 ...
- GDB和GDB Server
gdb是linux c编程标配的调试工具,平时接触比较多的可能是本机随gcc一起安装的调试工具.但是,即使是本机的gdb,也经常被printf代替,所以接触也仅限于知道. 简单程序固然可以用print ...
- C语言 命令行参数 函数指针 gdb调试
. 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/21551397 | http://www.hanshul ...
- 第六课 GDB调试 (上)
1序言: 1.初学者经过学习前面的Makefile知识,信心满满,内心觉得应该要好好学习不单掌握语言的编写,也要学会相对应的工具调高开发效率.有时我们写出来的代码经过执行结果却跟我们预期不一样那怎么办 ...
随机推荐
- 解决HDFS无法启动namenode,报错Premature EOF from inputStream;Failed to load FSImage file, see error(s) above for more info
一.情况描述 启动hadoop后发现无法打开hdfs web界面,50070打不开,于是jps发现少了一个namenode: 查看日志信息,发现如下报错: 2022-01-03 23:54:10,99 ...
- 将本地项目上传到gitLab操作
在设置好SSH之后,执行下面的操作即可完成: git init // 初始化git status //查看提交文件状态git remote add origin git地址 // 连接 ...
- 无需debug,通过抽象模型快速梳理代码核心流程
上一篇我们通过DSM来确定了核心对象并构建了抽象模型.本篇是<如何高效阅读源码>专题的第八篇,我们来基于抽象模型来梳理核心流程. 本节主要内容: 如何通过抽象模型来梳理核心流程 从类名和注 ...
- 图片叠加科幻切换 -- css
<template> <div> <div class="a"></div> <div class="b&quo ...
- Blazor 组件库 BootstrapBlazor中 Ajax 组件的使用
组件解决的问题 由于Blazor在与服务器连接时使用了Websocket,仅在第一次连接时会走原MVC的连接逻辑.所以,我们无法在这个过程中完成例如身份认证.cookie处理等操作. 此组件即为解决此 ...
- events.js 源码分析
events.js 源码分析 1. 初始化 // 使用 this.ee = new EventEmitter(); // 源码 // 绑定this域,初始化 _events,_eventsCount和 ...
- Collection工具类
Collection工具类: 集合工具类,定义除了存取以外的集合常用方法 方法: public static void reverse(List<?> list) //反转集合中元素的 ...
- 使用GO语言通过Stream Load实现Doris数据导入
Doris github地址欢迎加Star apache/incubator-doris: Apache Doris(Incubating) is an MPP-based interactive S ...
- SpringBoot项目刚刚创建就报异常,Failed to configure a DataSource: 'url' attribute is not specified and no embedded 的解决办法
错误信息: Description: Failed to configure a DataSource: 'url' attribute is not specified and no embedde ...
- 看完复旦博士用Python统计核酸结果后,我照着也写了一个
前几天,人民日报公众号报道了复旦博士生自己写代码,通过OCR和正则表达式统计核酸截图结果.具体文章见:https://mp.weixin.qq.com/s/l8u9JifKDlRDoz32-jZWQg ...