Linux程序开发调试常见问题的HOWTO清单

1、如何在GDB中打印一条长字符串的全部内容?

答:set print elements 0。gdb中help set print elements中说:

http://stackoverflow.com/questions/233328/how-do-i-print-the-full-value-of-a-long-string-in-gdb

2、如何查看一个进程打开的所有文件描述符?

答:目前个人所知有两种方法(SystemTap这种大杀器除外,下同):

  • ls -l  /proc/PID/fd/
  • lsof -p PID

以init进程为例

 3、如何查看一个文件正在被哪些进程使用?

答:目前个人所知有两种:

  • fuser FILENAME
  • lsof    FILENAME

 4、如何识别哪些进程在使用某块System V共享内存(System V Shared Memory)区段?

答:要找出哪些进程在使用或仍在使用一段共享内存,或者找出一个进程都使用了哪些共享内存区段,还是可以用lsof。

比如, ipcs -a 给出系统中的System V IPC facilities有如下状态:

要查出其中shmid为393216的区段在被哪个进程使用:

杀掉这个仍然attach到这块共享内存区段上的PID为18811的进程:

可以看到,这块共享内存区段这时才被释放掉。

小结一下,对于已存在的文件,可以通过fuser命令来查看哪些进程还在打开着它,而对于那些 已删除文件/套接字/System V共享内存区段,则使用lsof。

参考:http://blog.tanelpoder.com/2009/01/22/identifying-shared-memory-segment-users-using-lsof/

5、如何查看端口是否被占用,或者使用情况?

答:lsof -i:PORT_NUMBER

比如本站:

6、如何查看进程对应的可执行文件的具体路径?

答:ls -lp /proc/PID/cwd

9999、TO BE CONTINUED…

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注