Nginx学习(3)

来源:互联网 发布:颜表情软件 编辑:程序博客网 时间:2024/05/16 09:15

一.GDB 调试命令

  GDB 调试程序的前提条件就是你编译程序时必须加入调试符号信息,即使用'-g'编译选项。首先编译我们的源程序 gcc -g -o eg1 eg1.c  

1. attach与detach命令
attach process_id 在GDB状态下,开始调试一个正在运行的进程,其进程ID为process_id
detach 停止调试当前正在调试的进程,与attach配对试用

2. 多线程程序调试相关:

(1)thread  threadno 切换当前线程到由threadno指定的线程(2)info threads:查看GDB当前调试的程序的各个线程的相关信息(3)thread apply [threadno] [all] args:对指定(或所有)的线程执行由args指定的命令

3. 多进程程序调试相关(fork/vfork)

(1)缺省方式:fork/vfork之后,GDB仍然调试父进程,与子进程不相关(2)set follow-fork-mode mode:设置GDB行为,mode为parent时,与缺省情况一样;mode为child时,fork/vfork之后,GDB进入子进程调试,与父进程不再相关(3)show follow-fork-mode:查看当前GDB多进程跟踪模式的设置

4. continue, step, next, finish, return 命令
continue 唤醒程序,继续运行,至到遇到下一个断点,或者程序结束。

当前line有函数调用的时候,next会直接执行到下一句 ,step会进入函数

finish 继续执行程序,直到当前被调用的函数结束,如果该函数有返回值,把返回值也打印到控制台

return 中止当前函数的调用

二.gdb的基本工作原理

gdb凭什么可以调试一个程序?凭什么能够接管一个程序的运行?

这是什么意思呢?我们可以结合到gdb上来看。如果在gdb中run一个程序,首先gdb会fork一个子进程,然后该子进程调用ptrace系统调用,参数就是PTRACE_TRACEME,然后调用一个exec执行程序。基本过程是这样,细节上可能会有出入。需要注意的是,这个选项PTRACE_TRACEME是由子进程调用的而不是父进程!

0 0
原创粉丝点击