这个时候,原理就是开启一个GDB进程,然后GDB进程fork出一个子进程,让子进程执行PTRACE_TRACEME,然后子进程再调用execve(),如下图 此时,GDB进程及其子进程就可以读写test进程的指令空间、数据空间、堆栈和寄存器的值。而且gdb进程接管了test进程的所有信号,也就是说系统向test进程发送的所有信号,都被gdb进程接收到。
当子进程(就是我们调试的程序)在发送break point或者单步调试,会产生一个信号SIGTRAP,被父进程(这里的gdb)捕获到,这时用户就可以通过gdb实时观察到当前的子进程状态。 三、gdb的使用方法 3.1. 启动gdb gdb有三种使用方法: 一个程序gdb <prog_name, 程序文件位置>。或者gdb后,然后在交互式框输入r <prog_name>。
ptrace系统调用:GDB通过Linux内核提供的ptrace系统调用来控制被调试程序的执行。ptrace允许一个进程(GDB)读写另一个进程(被调试程序)的指令空间、数据空间、堆栈和寄存器的值。 进程状态控制: 未执行进程调试:当GDB启动一个程序时,它会首先调用fork()创建一个子进程,该子进程调用ptrace(PTRACE_TRACEME)表示愿意被跟踪。
而且gdb进程接管了test进程的所有信号,也就是说系统向test进程发送的所有信号,都被gdb进程接收到,这样一来,test进程的执行就被gdb控制了,从而达到调试的目的。 也就是说,如果没有gdb调试,操作系统与目标进程之间是直接交互的;如果使用gdb来调试程序,那么操作系统发送给目标进程的信号就会被gdb截获,gdb根据信号的属性...
前者需要硬件系统的支持;后者的原理就是每步执行后都检查变量的值是否改变。GDB在新建数据断点时会优先尝试硬件方式,如果失败再尝试软件实现。 命令 作用 watch variable 设置变量数据断点 watch var1 + var2 设置表达式数据断点 rwatch variable 设置读断点,仅支持硬件实现 awatch variable 设置读写断点,仅支持硬件...
1)gdb 调用 fork 创建子进程,用作后续的被调试程序,fork执行完毕后,gdb就调用wait系统调用等待在子...
gdb调试的原理是基于ptrace系统调用,ptrace()系统调用提供了一个方法,该方法使一个程序(追踪者)可以观察和控制另外一个程序(被追踪者)的执行,并检查和改变被追踪者的内存及寄存器。它主要用于实现断点调试和追踪系统调用。 当被追踪时,被追踪线程在接收信号时会被停止,即使那个信号是被忽略的也是如此(SIGKILL除外)。
如果想对一个已经执行的进程进行调试,那么就要在gdb这个父进程中调用ptrace(PTRACE_ATTACH,[其他参数]),此时,gdb进程会attach(绑定)到已经执行的进程B,gdb把进程B收养成为自己的子进程,而子进程B的行为等同于它进行了一次 PTRACE_TRACEME操作。 此时gdb进程会发送S...