2010-02-09 10 views
12

मैं अगर यह फ़ाइलें/निर्देशिका की एक सूची जो डिबग आवेदन खोल दिया है लेकिन GDB से ही बंद नहीं पाने के लिए संभव हो सकता है सोच रहा हूँ?gdb: howto सूची खुली फ़ाइलों

वर्तमान में मैं एक ब्रेकपाइंट सेट और फिर मैं खोला फ़ाइलों के लिए जाँच करने के लिए lsof की तरह एक बाहरी प्रोग्राम का उपयोग।

लेकिन इस दृष्टिकोण वास्तव में कष्टप्रद है।

पर्यावरण: gdb v6.8 साथ डेबियन-लेनी

संपादित: मैं क्योंकि मेरे आवेदन फाइल लीक कर रहा है पूछ रहा हूँ कुछ स्थितियों

उत्तर

6

निकोलस की मदद की वजह से मैं पूरी तरह से एक मैक्रो को परिभाषित करते हुए कार्य को स्वचालित करने में सक्षम था।

.gdbinit:

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

लक्ष्य रिमोट पर काम नहीं कर रहा है: 'अपरिभाषित जानकारी कमांड: "proc"। "सहायता जानकारी" आज़माएं .' :-(। – pevik

0

नहीं में संभालती है, लेकिन आप lsof चलाने के लिए और करने के लिए नीचे फ़िल्टर कर सकते हैं डीबग प्रक्रिया।

12

लिनक्स पर आप भी सिर्फ /proc/<pid>/fd में देख सकते हैं। जीडीबी से ऐसा करने के लिए (उदा। अगर आप इसे ब्रेकपॉइंट से जोड़ना चाहते हैं) बहुत आसान है। या निश्चित रूप से आप भी 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

इस स्वचालित करने के लिए एक तरीका है? –

+1

आप किसी ब्रेकपॉइंट पर ब्रेकपॉइंट कमांड सूची (http://sourceware.org/gdb/current/onlinedocs/gdb/Break-Commands.html) संलग्न कर सकते हैं, इस प्रकार ब्रेकपॉइंट पर lsof चल रहा है। यदि आपको ट्रैक करने की आवश्यकता है कि एफडीएस कहाँ खोले गए थे, तो आप valgrind's --track-fds विकल्प भी आज़मा सकते हैं। –

0

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 निर्देशिका में एक फ़ाइल को खोलता है) यदि lsof आपके सिस्टम पर उपलब्ध नहीं है (मैं इस तरह की समस्या थी), तो आपकोउपयोग कर सकते हैं। यह सभी प्रक्रियाओं के लिए खुली फाइलों के बारे में जानकारी प्रिंट करता है।