在Linux中,如果没有使用GDB进行实时debugging,在挂起时如何findC程序的状态?

我们有一个古老的networking应用程序(一台机器上运行的客户端程序和另一台服务器程序)。 它通常工作正常,但在罕见的情况下,它挂起。 我们尚未确定究竟是什么原因造成的。 这是用C编写的普通的旧套接字编程

问题是,我们不能重现这一点,有时只是发生。

挂起时,我能做些什么来找出服务器和客户端程序(挂起的代码块)的状态? 连接到debugging器是不可能的由于各种原因(程序立即需要被终止释放被阻止的端口)。

我刚刚读了一下gcore,我会试试看。

任何更好的想法?

更新:gcore(或其他方式来生成核心转储)工作得很好。

我很少熟悉

提示号码1

 pstack 

用法

 pstack <process Id> 

例如

下面是用pid 3258进行bash过程的示例

  PID TTY TIME CMD 3258 pts/6 00:00:00 bash 3326 pts/6 00:00:00 ps pstack 3258 #0 0x0000003ab5eaa77e in waitpid () from /lib64/libc.so.6 #1 0x000000000043ebf2 in ?? () #2 0x000000000043fe4f in wait_for () #3 0x0000000000430a59 in execute_command_internal () #4 0x0000000000430c4e in execute_command () #5 0x000000000041d536 in reader_loop () #6 0x000000000041ccf9 in main () 

提示号码2

 gdb attach <process id> 

接着

 (gdb) info threads 

相当有帮助

有几个像gcore提到的其他人,netstat也有助于确定状态

发送中止信号到进程也将生成核心转储,这可以稍后使用gdb进行分析。 类似于gcore。