我有一个用 C 语言编写并在 CentOS 5.5 上运行的 TCP Svr 进程。它充当外部客户端的 TCP 服务器,并使用它已建立的 Unix 域套接字与系统中的其他进程进行一些 IPC 通信。这不是一个多线程进程。它一次完成一项任务。我使用 epoll_wait() 来侦听 TCP 套接字或它与内部进程建立的任何 IPC 套接字上的请求。当 epoll_wait() 函数中断时,我会处理任何人的请求,然后返回到 epoll_wait()
我有一个从外部(不是 IPC)连接到这个进程的 TCP 客户端。它成功连接,发送请求消息,得到响应。我把它放在一个无限循环中只是为了测试它的鲁棒性等。
一段时间后,TCP Server 停止响应来自 TCP Client 的请求。TCP客户端连接成功,发送请求消息,但没有从TCP服务器得到任何响应消息。
所以我认为 TCP 服务器卡在其他地方,试图做某事并且没有返回到 epoll_wait() 来处理其他进来的请求。我试图用日志来解决这个问题,但这并不能帮助我理解到底在哪里进程卡住了。
所以我想使用任何可以给我一些信息的调试器(函数名会很棒),关于进程在做什么。设置断点是压倒性的,因为 TCP 服务器进程有大量的文件和函数......
我正在尝试在 CentOS 5.5 上使用 DDD,以了解发生了什么。我成功地附加到了这个过程。然后我点击“Step”或“Stepi”或“Next”按钮......但什么也没有发生......
顺便说一句,当我使用 Eclipse 进行调试并附加到该进程(或任何进程)时,我总是得到“__kernel_vsyscall()”....这是否意味着程序在默认情况下会在执行任何操作时中断?如果是这样,我如何摆脱 __kernel_vsyscall() 调用,继续我的程序?如果我按 f8,它会出来,但是我不知道它在哪里,因为我失去了堆栈跟踪......就像我之前说的。由于我不知道它在哪里,我不知道在哪里放置断点......
总之,我想弄清楚我的进程卡在哪里或者它在做什么,并尝试从那时起进行调试......
我该怎么做?
谢谢阿米特