gdb 调试原理
gdb 常用指令:run, next, step, quit, break n, delete n, enable n, disable n, clear, where, bt, set args, show args, watch
gcc -g 加入调试信息
方式一:以子进程使用 ptrace 系统函数启动被调试程序

方式二:gdb 使用 ptrace 函数将被调试程序收养为子进程

被调试程序的所有信号都被父进程 gdb 来接管,并且父进程 gdb 可查看、修改子进程的内部信息,包括:堆栈、寄存器等
断点调试:替换为 INT3 指令让程序中断,汇编代码中 PC 指针(一个内部指针,指向即将执行的那行代码)执行到 INT3 指令时,于是操作系统就发送一个 SIGTRAP 信号给被调试程序,gdb 会首先接收到这 SIGTRAP个信号,把 INT3 替换为断点链表中原来的代码,把 PC 指针回退一步,也即是设置为指向原行。
