2013-06-22 7 views
8

आप एक मैक मिल गया है, तो यह प्रयास करें:ग्रेप -f segfault पैदा करता

echo 'abcd*' > grepfile 
echo 'abc$' >> grepfile 
echo '^abc' >> grepfile 
echo "fojeiwuroiuwet\nljfajsljkfabcdddjlfkajlkj\nabcaaa\nzzzabc\n" | grep -f grepfile 

यहाँ संस्करण है स्वाद) जो ऐप्पल के सॉफ्टवेयर अपडेट के साथ रखा गया है, इसलिए मैं 10.8.4 पर हूं।

मैंने सत्यापित किया कि स्रोत से संकलित जीएनयू grep इस समस्या से ग्रस्त नहीं है। दरअसल यह संस्करण 2.14 है, जो पिछले संस्करणों में से एक है।

लेकिन किसी को रेगेक्स की श्रृंखला के खिलाफ कुछ इनपुट का परीक्षण करने का कार्य कैसे प्राप्त हो सकता है, अन्यथा बिना किसी अक्षम अक्षम लूप के जो प्रत्येक रेगेक्स के लिए एक grep फोर्क करता है?

संपादित करें: इस दृष्टिकोण के आसपास मैंने जो दृष्टिकोण लिया वह कुछ था: while read REGEX; do [[ ... =~ $REGEX ]] ... done < regexfile

प्रश्न: क्या यह grep के इस संस्करण के साथ एक ज्ञात बग है? हम अपने सिस्टम कैसे स्थापित कर सकते हैं ताकि वे grep को regexes की फ़ाइल के साथ ठीक से काम करेंगे?

अद्यतन: ऐसा लगता है कि कुछ लोग रिपोर्ट कर रहे हैं यह ठीक काम करता है (यहां तक ​​कि इस विशेष फ्रीबीएसडी 2.5.1 grep के साथ)। यह पता लगाने के लिए कुछ कदम क्या हैं जिन्हें मैं समझ सकता हूं .so/.dylib का उपयोग हो सकता है? क्या कोई shasum /usr/bin/grep कर सकता है और मुझे बता सकता है कि यह आपके लिए काम करता है या नहीं? (मुझे यकीन है कि अगर ज्यादा जानकारी प्रदान करेगा नहीं कर रहा हूँ, लेकिन मैं क्या कर रहा हूँ के बाद अपने कंप्यूटर के विन्यास को खराब कर दिया गया है या नहीं है, या यदि इस सॉफ्टवेयर के इस संस्करण से कुछ वास्तविक मौजूदा मुद्दा। है)

$ shasum /usr/bin/grep 
eac59389d09642decbb8551e2c975f795934bfbf /usr/bin/grep 

$ codesign -dvvv /usr/bin/grep 
Executable=/usr/bin/grep 
Identifier=com.apple.zgrep 
Format=Mach-O thin (x86_64) 
CodeDirectory v=20100 size=224 flags=0x0(none) hashes=6+2 location=embedded 
Hash type=sha1 size=20 
CDHash=93b823c000188f8737653d8333c90a6db9361d70 
Signature size=4064 
Authority=Software Signing 
Authority=Apple Code Signing Certification Authority 
Authority=Apple Root CA 
Info.plist=not bound 
Sealed Resources=none 
Internal requirements count=2 size=208 

आगे की जांच:

$ gdb /usr/bin/grep 
GNU gdb 6.3.50-20050815 (Apple version gdb-1824) (Thu Nov 15 10:42:43 UTC 2012) 
Copyright 2004 Free Software Foundation, Inc. 
GDB is free software, covered by the GNU General Public License, and you are 
welcome to change it and/or distribute copies of it under certain conditions. 
Type "show copying" to see the conditions. 
There is absolutely no warranty for GDB. Type "show warranty" for details. 
This GDB was configured as "x86_64-apple-darwin"...Reading symbols for shared libraries .... done 

(gdb) start -f grepfile 
Function "main" not defined. 
Make breakpoint pending on future shared library load? (y or [n]) 
Starting program: /usr/bin/grep -f grepfile 
Reading symbols for shared libraries +++.............................. done 
abc 
abc 

Program received signal EXC_BAD_ACCESS, Could not access memory. 
Reason: KERN_INVALID_ADDRESS at address: 0x0000000101000000 
0x00007fff89b5d1b3 in memchr() 
(gdb) where 
#0 0x00007fff89b5d1b3 in memchr() 
#1 0x00007fff89b8e45a in __sfvwrite() 
#2 0x00007fff89b8e861 in fwrite() 
#3 0x0000000100003138 in _mh_execute_header() 
#4 0x0000000100002988 in _mh_execute_header() 
#5 0x0000000100001c28 in _mh_execute_header() 
#6 0x00007fff8e2d57e1 in start() 
(gdb) 

मैं भी मशीन रिबूट है

यहाँ और अधिक जानकारी है। यह दोबारा जीडीबी में एक ही चीज करता है।

+0

तब मैं अपने मैकबुक एयर में स्विच करने और यह काम किया है, और फिर मैं जाँच की और यह homebrew ग्रेप 2.14 स्थापित है। मेरा मानना ​​है कि मैं उस दिन में grep बनाम एक का परीक्षण कर रहा था जब मैंने एएके के बारे में सीखा। तो मैक पर उचित grep हासिल करने का यह एक और तरीका है, होमब्रू का उपयोग करें। वह उदास था क्योंकि मैंने पहली जगह में 'grep' की जांच किए बिना grep संकलित करने के लिए' gettext' प्राप्त करने के लिए होमब्रू का उपयोग किया था ... –

+0

पिछली बार मेरे द्वारा पहले से मिली चीज़ों के उत्तर फिर से ढूंढना परेशान है । यह ब्रू फॉर्मूला 'होमब्रू/डुप्सेस/grep' है। –

+0

एफडब्ल्यूआईडब्ल्यू, आपका उदाहरण ओएस एक्स 10.8.4 के साथ भेजे गए स्टॉक ऐप्पल/यूएसआर/बिन/जीईपी (2.5.1-फ्रीबीएसडी) के साथ मेरे लिए ठीक काम करता है। –

उत्तर

3

मुझे मैकबुक एयर पर ओएसएक्स 10.8.4 मिल गया है और आपका उदाहरण डिफ़ॉल्ट रूप से क्रैश नहीं होता है, लेकिन केवल --color पैरामीटर जोड़ते समय।

स्पष्टीकरण

इस दुर्घटना आमतौर पर होता है जब आप wilcard (तारांकन चिह्न) टर्मिनल रंग के साथ मिश्रण कर रहे हैं और इस सॉफ्टवेयर बग है।

echo 'abc*' | grep --color=auto -e ".*" -e a 

यहाँ ऐसा लगता है कि --color=auto अंतर (इसके बिना या never के लिए सेटिंग है, तो यह दुर्घटना नहीं करता है) बनाता है:

इसके अलावा एक और सरल उदाहरण की जाँच करें। तो मुझे लगता है कि आपका grep डिफ़ॉल्ट रूप से टर्मिनल में रंगों का उपयोग कर रहा है।

समाधान

सुनिश्चित करें कि आपके ग्रेप ग्रेप रंग सक्षम, या रंग डिफ़ॉल्ट रूप से सक्षम नहीं कर रहे हैं के साथ करने के लिए एक अन्य नाम नहीं है।

आप हमेशा --color=never के साथ grep चलाने की कोशिश कर सकते हैं।

http://www.freebsd.org/cgi/query-pr.cgi?pr=181263

इसलिए इस मुद्दे को सॉफ्टवेयर यह आत्म में तय किया जा सकता है:

स्थायी समाधान के लिए, मैं बग रिपोर्ट रिपोर्ट की है।


आप अपने दुर्घटना के बारे में अधिक विस्तृत लॉग को एक्सेस कंसोल, शो लॉग सूची में जाना है और उपयोगकर्ता नैदानिक ​​रिपोर्ट के अंतर्गत क्रैश लॉग को खोजने के लिए चाहते हैं।

उदाहरण के लिए:

Thread 0 Crashed:: Dispatch queue: com.apple.main-thread 
0 libsystem_c.dylib    0x00007fff8a8da1b3 memchr + 15 
1 libsystem_c.dylib    0x00007fff8a90b45a __sfvwrite + 578 
2 libsystem_c.dylib    0x00007fff8a90b861 fwrite + 114 
3 grep       0x000000010a4a3138 0x10a4a0000 + 12600 
4 grep       0x000000010a4a2988 0x10a4a0000 + 10632 
5 grep       0x000000010a4a1c28 0x10a4a0000 + 7208 
6 libdyld.dylib     0x00007fff8daf77e1 start + 1 

यहाँ दुर्घटना के बारे में कुछ अधिक विस्तृत विवरण है:

A quick test 

    $ env -i bsdgrep -Fi without_nls usr.bin/grep/grep.c 
    $ env -i gnugrep -Fi without_nls usr.bin/grep/grep.c 
    #ifndef WITHOUT_NLS 
    #ifndef WITHOUT_NLS 
    #ifndef WITHOUT_NLS 

shows that bsd fgrep already fails to ignore case. And if you throw 
a few more options to the mix it'd crash, e.g. 

    $ env -i LC_CTYPE=en_US.UTF-8 TERM=xterm bsdgrep --color -Fir without_nls usr.bin/grep/ 
    [...] 
    Program received signal SIGSEGV, Segmentation fault. 
    0x0000000801007ff2 in memchr (s=0x61167a, c=10, n=18446744073707490297) at /usr/src/lib/libc/string/memchr.c:48 
    48        if (*p++ == (unsigned char)c) 
    (gdb) bt 
    #0 0x0000000801007ff2 in memchr (s=0x61167a, c=10, n=18446744073707490297) at /usr/src/lib/libc/string/memchr.c:48 
    #1 0x0000000801007b03 in __sfvwrite (fp=0x801247770, uio=0x7fffffffd8f0) at /usr/src/lib/libc/stdio/fvwrite.c:170 
    #2 0x0000000801007698 in fwrite (buf=0x608c03, size=18446744073709551606, count=1, fp=0x801247770) 
     at /usr/src/lib/libc/stdio/fwrite.c:95 
    #3 0x0000000000405498 in printline (line=0x7fffffffdb70, sep=58, matches=0x7fffffffd990, m=9) 
     at /usr/src/usr.bin/grep/util.c:500 
    #4 0x0000000000404f51 in procline (l=0x7fffffffdb70, nottext=0) at /usr/src/usr.bin/grep/util.c:381 
    #5 0x000000000040489f in procfile (fn=0x80140b600 "usr.bin/grep/nls/es_ES.ISO8859-1.msg") at /usr/src/usr.bin/grep/util.c:239 
    #6 0x00000000004044d7 in grep_tree (argv=0x7fffffffdd30) at /usr/src/usr.bin/grep/util.c:163 
    #7 0x0000000000403ea9 in main (argc=5, argv=0x7fffffffdd10) at /usr/src/usr.bin/grep/grep.c:689 

स्रोत: http://lists.freebsd.org/pipermail/freebsd-current/2011-August/026502.html


भी ऐसा लगता है अलग देखते हैं कि जी यहां तक ​​कि एक ही संस्करण के साथ अलग अलग OSX पर प्रतिनिधि बाइनरी:

$ grep --v 
grep (BSD grep) 2.5.1-FreeBSD 
$ shasum /usr/bin/grep 
350ee11e1868e18c9707ea7035184a114f40badf /usr/bin/grep 
$ codesign -dvvv /usr/bin/grep 
Executable=/usr/bin/grep 
Identifier=com.apple.zgrep 
Format=Mach-O thin (x86_64) 
CodeDirectory v=20100 size=224 flags=0x0(none) hashes=6+2 location=embedded 
Hash type=sha1 size=20 
CDHash=1537b3ed49878d5d18482859a37318164a2a40f1 
Signature size=4064 
Authority=Software Signing 
Authority=Apple Code Signing Certification Authority 
Authority=Apple Root CA 
Info.plist=not bound 
Sealed Resources=none 
Internal requirements count=2 size=176 
+0

अरे इस में खुदाई के लिए धन्यवाद! मुझे यकीन नहीं है कि मुझे रंग दिखाने के लिए इसे अलियाड किया गया है या नहीं, लेकिन मुझे निश्चित रूप से रंग होना पसंद है (बेशक स्क्रिप्ट को इसकी आवश्यकता नहीं है)। मेरा मानना ​​है कि यह उपनाम नहीं है लेकिन रंग का उपयोग करने के लिए डिफ़ॉल्ट होगा। उम्मीद है कि इसे एक स्क्रिप्ट में उपयोग करते समय (जिसे इसे समझदारी से रंग अक्षम कर देना चाहिए) तो यह समस्या से पीड़ित नहीं होगा! –