一、概念

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的基本使用方法。内容包括调试器的使用准备、以调试模式启动一个程序、断点设置、栈帧显示、值显示、继续运行等调试的基本过程。

最新文章

  1. SpringMVC进阶
  2. HtmlAgilityPack下载开启压缩的页面乱码
  3. 19.C#逐一介绍IEnumerable和IEnumerable<T>中的扩展方法(10.3-10.5)
  4. Educational Codeforces Round 15 C 二分
  5. JSON初探
  6. 循序渐进Java Socket网络编程(多客户端、信息共享、文件传输)
  7. flex&bison 1
  8. SpringMVC Controller详解
  9. android中数据存储
  10. Codeforces 551E - GukiZ and GukiZiana(分块)
  11. Google Map API 学习四
  12. windows 删除服务命令
  13. 新技术:Qt for Native Client (and emscripten)
  14. xmanager 在 Windows 下远程桌面连接 麒麟
  15. Android Bug 记录
  16. j2ee网站项目首页如何直接使用action
  17. Windows Server 2012如果打开网页慢下载快的话
  18. Centos7添加新源
  19. MongoVUE的table view视图不显示列标题
  20. DAY15 模块

热门文章

  1. Android Studio项目导入方法+问题+解决办法
  2. CCF201503-2数字排序
  3. 微信jssdk分享(附代码)
  4. EMS导入导出邮箱
  5. python---冒泡排序的实现
  6. Mysql学习day1
  7. 使用pip管理库
  8. 浅谈MatrixOne如何用Go语言设计与实现高性能哈希表
  9. Android 蓝牙串口通信工具类 SerialPortUtil 3.0.+
  10. 运行npm install命令的时候会发生什么?