2010-02-09 2 views
12

Мне интересно, можно ли получить список файлов/каталогов, которые открыло отладочное приложение, но не закрытое из самого GDB?gdb: howto list open files

В настоящее время я установил точку останова, а затем использую внешнюю программу, такую ​​как lsof, чтобы проверить открытые файлы.

Но этот подход действительно раздражает.

окружающей среды: Debian Ленни с GdB v6.8

EDIT: Я спрашиваю, потому что мое приложение утечки дескрипторов файлов в некоторых ситуациях

ответ

6

благодаря помощи Николая I удалось полностью автоматизировать задачу, указав макрос.

.gdbinit:

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):

file hello  
break main 
run 
next 
lsof 

выход:

... 
hello 2683 voku 5r REG 8,1 37357 11110 /home/voku/hello 
hello 2683 voku 6w REG 8,1  0 3358 /tmp/testfile.txt 
... 
+0

Не работает на целевом пульте: 'Undefined info command:" proc ". Попробуйте «справочную информацию» .' :-(. – pevik

0

Нет, но вы можете запустить Lsof и фильтровать вниз отлаженный процесс.

12

На Linux вы также можете просто посмотреть в /proc/<pid>/fd. Сделать это из GDB (например, если вы хотите прикрепить его к точке останова) довольно просто. Или, конечно, вы можете просто использовать lsof.

(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 
+0

Есть ли способ автоматизировать это? – 2010-02-09 18:49:45

+1

Вы можете прикрепить список команд точки останова (http://sourceware.org/gdb/current/onlinedocs/gdb/Break-Commands.html) к любой точке останова, тем самым выполняя lsof в точке останова. Если вам нужно отслеживать, где были открыты fds, вы также можете попробовать параметр valtrind -track-fds. –

0

Если lsof недоступно в вашей системе (у меня была такая проблема), вы можете использовать gdb info os files. Он печатает информацию об открытых файлах для всех процессов.

Смежные вопросы