要对kamailio/opensips进行单步调试,就需要先了解其代码的结构及运行方式,kamailio/opensips使用Reactor和Proactor结合的IO网络模型,使用主进程负责监听网络,当有连接产生或首包到达时,就通过pipe将文件描述符发送给worker进程,worker进程就会负责此连接的数据取读、业务处理、数据发送等事情,然后再次等待此socket事件。当我们想要调试一段代码时,就先确认这段代码是运行在什么类型的进程中,通常用于处理SIP逻辑的代码都是在worker进程中执行的,下面是一个kamailio进程启动的实例:
[root@xx sipserver]# kamctl ps
Process:: ID=0 PID=6651 Type=attendant
Process:: ID=1 PID=6653 Type=udp receiver child=0 sock=172.16.0.16:53
Process:: ID=2 PID=6654 Type=udp receiver child=1 sock=172.16.0.16:53
Process:: ID=0 PID=6651 Type=attendant
Process:: ID=1 PID=6653 Type=udp receiver child=0 sock=172.16.0.16:53
Process:: ID=2 PID=6654 Type=udp receiver child=1 sock=172.16.0.16:53
Process:: ID=3 PID=6656 Type=udp receiver child=2 sock=172.16.0.16:53
Process:: ID=4 PID=6658 Type=udp receiver child=3 sock=172.16.0.16:53
Process:: ID=5 PID=6661 Type=slow timer
Process:: ID=6 PID=6662 Type=timer
Process:: ID=7 PID=6665 Type=MI FIFO
Process:: ID=8 PID=6668 Type=ctl handler
Process:: ID=9 PID=6669 Type=SNMP AgentX
Process:: ID=6 PID=6662 Type=timer
Process:: ID=7 PID=6665 Type=MI FIFO
Process:: ID=8 PID=6668 Type=ctl handler
Process:: ID=9 PID=6669 Type=SNMP AgentX