2010-02-09 26 views
12

Tôi tự hỏi liệu có thể có danh sách các tệp/thư mục mà ứng dụng đã gỡ lỗi đã mở nhưng không đóng được từ GDB không?gdb: howto liệt kê các tệp đang mở

Hiện tại tôi đã đặt điểm ngắt và sau đó tôi sử dụng chương trình bên ngoài như lsof để kiểm tra các tệp đã mở.

Nhưng phương pháp này thực sự gây phiền nhiễu.

Môi trường: Debian Lenny với gdb v6.8

EDIT: Tôi hỏi vì ứng dụng của tôi đang bị rò rỉ tập tin xử lý trong một số trường

Trả lời

6

do sự trợ giúp của Nicholas tôi đã có thể tự động hoàn toàn tác vụ bằng cách xác định macro.

.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 

đây là một phiên sử dụng các macro mới (chương trình sẽ mở ra một tập tin trong thư mục/tmp):

file hello  
break main 
run 
next 
lsof 

đầu ra:

... 
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

Không hoạt động trên điều khiển từ xa mục tiêu: 'Lệnh thông tin không xác định:" proc ". Hãy thử "thông tin trợ giúp" .' :-(. – pevik

0

Không, nhưng bạn có thể chạy lsof và lọc xuống quá trình gỡ lỗi.

12

Trên Linux, bạn cũng có thể chỉ cần xem trong /proc/<pid>/fd. Để làm điều đó từ GDB (ví dụ: nếu bạn muốn đính kèm nó vào một điểm ngắt) là khá đơn giản. Hoặc tất nhiên bạn cũng có thể sử dụng 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

có cách nào để tự động hóa điều này không? –

+1

Bạn có thể đính kèm danh sách lệnh breakpoint (http://sourceware.org/gdb/current/onlinedocs/gdb/Break-Commands.html) vào bất kỳ điểm ngắt nào, do đó chạy lsof trên điểm ngắt. Nếu bạn cần theo dõi vị trí của fds, bạn cũng có thể thử tùy chọn --track-fds của valgrind. –

0

Nếu lsof không khả dụng trên hệ thống của bạn (tôi có vấn đề như vậy), bạn có thể sử dụng gdb info os files. Nó in thông tin về các tập tin mở cho tất cả các quá trình.

Các vấn đề liên quan