0

我有一个用 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,它会出来,但是我不知道它在哪里,因为我失去了堆栈跟踪......就像我之前说的。由于我不知道它在哪里,我不知道在哪里放置断点......

总之,我想弄清楚我的进程卡在哪里或者它在做什么,并尝试从那时起进行调试......

我该怎么做?

谢谢阿米特

4

2 回答 2

0

1) 附加到 C 进程本身通常会导致问题,有什么方法可以让您在调试器中启动该进程?

2) 使用 DDD 的 step 函数需要在你设置断点并且程序在命令上停止之后完成。通过阅读您的问题,我不确定您是否做到了。您可能不想设置很多断点,但是否可以在代码的关键部分设置一两个断点?

于 2011-02-19T02:08:33.277 回答
0

总之,我想要完成的是能够找到我的程序卡在哪里,当它挂起时。我想通了——这太简单了。在 Eclipse 中创建配置 ...."Debug Configurations->C/C++ attach to application"...

让进程从 shell 正常运行(最好连接终端)。当它挂起时,打开 Eclipse,单击调试图标并运行配置的进程。它会要求您附加到一个进程。查找您的进程名称并附加到它。

现在,只要看看整个堆栈跟踪......你会看到一些你自己的函数调用与内核函数调用混合在一起。这会告诉您程序卡在哪里。

于 2011-02-21T05:17:01.723 回答