首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >gdb:如何列出打开的文件

gdb:如何列出打开的文件
EN

Stack Overflow用户
提问于 2010-02-09 18:28:36
回答 4查看 26.7K关注 0票数 22

我想知道是否有可能从GDB中获得调试的应用程序打开但未关闭的文件/目录列表?

目前,我设置了一个断点,然后使用像lsof这样的外部程序来检查打开的文件。

但是这种方法真的很烦人。

环境: Debian-Lenny与gdb v6.8

编辑:我这样问是因为在某些情况下,我的应用程序正在泄漏文件句柄

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-02-09 21:42:07

在尼古拉斯的帮助下,我能够通过定义宏来完全自动化任务。

.gdbinit

代码语言:javascript
复制
define lsof
  shell rm -f pidfile
  set logging file pidfile
  set logging on
  info proc
  set logging off
  shell lsof -p `cat pidfile | perl -n -e 'print $1 if /process (.+)/'`
end

document lsof
  List open files
end

下面是使用新宏的会话(程序在/tmp目录中打开一个文件):

代码语言:javascript
复制
file hello    
break main
run
next
lsof

产出:

代码语言:javascript
复制
...
hello   2683  voku    5r   REG    8,1    37357 11110 /home/voku/hello
hello   2683  voku    6w   REG    8,1        0  3358 /tmp/testfile.txt
...
票数 9
EN

Stack Overflow用户

发布于 2010-02-09 18:44:26

在Linux上,您也可以在/proc/<pid>/fd中查看。从GDB (例如,如果您想将其附加到断点)执行此操作非常简单。当然你也可以用lsof。

代码语言:javascript
复制
(gdb) info proc
process 5262
cmdline = '/bin/ls'
cwd = '/afs/acm.uiuc.edu/user/njriley'
exe = '/bin/ls'
(gdb) shell ls -l /proc/5262/fd
total 0
lrwx------ 1 njriley users 64 Feb  9 12:45 0 -> /dev/pts/14
lrwx------ 1 njriley users 64 Feb  9 12:45 1 -> /dev/pts/14
lrwx------ 1 njriley users 64 Feb  9 12:45 2 -> /dev/pts/14
lr-x------ 1 njriley users 64 Feb  9 12:45 3 -> pipe:[62083274]
l-wx------ 1 njriley users 64 Feb  9 12:45 4 -> pipe:[62083274]
lr-x------ 1 njriley users 64 Feb  9 12:45 5 -> /bin/ls
(gdb) shell lsof -p 5262
COMMAND  PID    USER   FD   TYPE DEVICE    SIZE     NODE NAME
ls      5262 njriley  cwd    DIR   0,18   14336   262358 /afs/acm.uiuc.edu/user/njriley
ls      5262 njriley  rtd    DIR    8,5    4096        2 /
ls      5262 njriley  txt    REG    8,5   92312     8255 /bin/ls
ls      5262 njriley  mem    REG    8,5   14744   441594 /lib/libattr.so.1.1.0
ls      5262 njriley  mem    REG    8,5    9680   450321 /lib/i686/cmov/libdl-2.7.so
ls      5262 njriley  mem    REG    8,5  116414   450307 /lib/i686/cmov/libpthread-2.7.so
ls      5262 njriley  mem    REG    8,5 1413540   450331 /lib/i686/cmov/libc-2.7.so
ls      5262 njriley  mem    REG    8,5   24800   441511 /lib/libacl.so.1.1.0
ls      5262 njriley  mem    REG    8,5   95964   441580 /lib/libselinux.so.1
ls      5262 njriley  mem    REG    8,5   30624   450337 /lib/i686/cmov/librt-2.7.so
ls      5262 njriley  mem    REG    8,5  113248   441966 /lib/ld-2.7.so
ls      5262 njriley    0u   CHR 136,14               16 /dev/pts/14
ls      5262 njriley    1u   CHR 136,14               16 /dev/pts/14
ls      5262 njriley    2u   CHR 136,14               16 /dev/pts/14
ls      5262 njriley    3r  FIFO    0,6         62083274 pipe
ls      5262 njriley    4w  FIFO    0,6         62083274 pipe
ls      5262 njriley    5r   REG    8,5   92312     8255 /bin/ls
票数 29
EN

Stack Overflow用户

发布于 2017-07-21 15:29:38

如果lsof在您的系统上不可用(我遇到了这样的问题),您可以使用gdb info os files。它打印有关所有进程打开的文件的信息。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2231460

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档