2017-03-13 7 views
0

예를 들어, 타격 기능 testReplace는 Node.js를 공정 차단됩니다Node.js에서 문자열 (str) .replace (some_regexp, '')로 프로세스가 차단 될 때 CPU 프로파일 링을 수행 할 수없는 이유는 무엇입니까?

function testReplace() { 
    let str = '<br/>              早餐后自由活动,于指定时间集合自行办理退房手续。'; 
    str += '<br/>          <br/>          <br/>         <br/>'; 
    str += '         <br/>                              <br/>'; 
    str += '            <br/>                           <br/>'; 
    str += '                             根据船班时间,自行前往暹粒机场,返回中国。<br/>'; 
    str += '如需送机服务,需增加280/每单。<br/>'; 

    let r = String(str).replace(/(^(\s*?<br[\s\/]*?>\*?)+|(\s*?<br[\s\/]*?>\s*?)+?$)/igm, ''); 
    console.log(str) 
} 

을 그리고 차단 기능입니다 알고 싶다, 그래서 CPU를 프로파일 링 할 v8-profiler를 사용할 때와 같은 과정을 차단, :

v8Profiler.startProfiling('easy_monitor', true); 
setTimeout(() => { 
    let profile = v8Profiler.stopProfiling('easy_monitor'); 
    profile.delete(); 
}, 5000); 

그러나 이것은 항상 던져 오류 :이 확률값을 해결할 수있는 방법

Bus error: 10 

흠? 당신이 나를 도울 수 있다면 난 정말 당신에게 감사합니다 :)

+0

프로필 작성 용 GUI를 선호하므로'node -inspect'를 사용하고 chrome dev 도구를 첨부하십시오. 어쩌면 그것을 시도해보십시오. – Sirko

+0

내 생각 엔 정규 표현식이 [치명적인 역 추적] (http://www.regular-expressions.info/catastrophic.html)에 시달릴 수 있다고 생각합니다. – robertklep

답변

0

노드 --trace foo.js가 아래와 같이 methid 추적, 당신을 제공 할 것입니다 :

10:   new ~RegExp+23(this=0x167100086871 <JS RegExp>, 0x1667d2c3e3b9 <String[51]: (^(\s*?<br[\s\/]*?>\*?)+|(\s*?<br[\s\/]*?>\s*?)+?$)>, 0x1667d2c3e409 <String[3]: igm>) { 
    11:   ~DoConstructRegExp+23(this=0x9d97d041b9 <undefined>, 0x167100086871 <JS RegExp>, 0x1667d2c3e3b9 <String[51]: (^(\s*?<br[\s\/]*?>\*?)+|(\s*?<br[\s\/]*?>\s*?)+?$)>, 0x1667d2c3e409 <String[3]: igm>) { 
    12:   ~ToString+23(this=0x9d97d041b9 <undefined>, 0x1667d2c3e3b9 <String[51]: (^(\s*?<br[\s\/]*?>\*?)+|(\s*?<br[\s\/]*?>\s*?)+?$)>) { 
    12:   } -> 0x1667d2c3e3b9 <String[51]: (^(\s*?<br[\s\/]*?>\*?)+|(\s*?<br[\s\/]*?>\s*?)+?$)> 
    12:   ~ToString+23(this=0x9d97d041b9 <undefined>, 0x1667d2c3e409 <String[3]: igm>) { 
    12:   } -> 0x1667d2c3e409 <String[3]: igm> 
    11:   } -> 0x9d97d041b9 <undefined> 
    10:   } -> 0x9d97d041b9 <undefined> 
    10:   ~replace+36(this=0x167100086849 <String[715]\: <br/>              \x65e9\x9910\x540e\x81ea\x7531\x6d3b\x52a8\xff0c\x4e8e\x6307\x5b9a\x65f6\x95f4\x96c6\x5408\x81ea\x884c\x529e\x7406\x9000\x623f\x624b\x7eed\x3002<br/>          <br/>          <br/>         <br/>         <br/>                              <br/>            <br/>                           <br/>                             \x6839\x636e\x8239\x73ed\x65f6\x95f4\xff0c\x81ea\x884c\x524d\x5f80\x66b9\x7c92\x673a\x573a\xff0c\x8fd4\x56de\x4e2d\x56fd\x3002<br/>\x5982\x9700\x9001\x673a\x670d\x52a1\xff0c\x9700\x589e\x52a0280/\x6bcf\x5355\x3002<br/>>, 0x167100086911 <JS RegExp>, 0x9d97d04291 <String[0]: >) { 

그래서 명확하게 코드가 붙어있다 String.replace 메소드에서.

* frame #0: 0x00000af481b48e5b 
    frame #1: 0x0000000100502574 node`v8::internal::NativeRegExpMacroAssembler::Match(v8::internal::Handle<v8::internal::Code>, v8::internal::Handle<v8::internal::String>, int*, int, int, v8::internal::Isolate*) + 244 
    frame #2: 0x0000000100436841 node`v8::internal::RegExpImpl::IrregexpExecRaw(v8::internal::Handle<v8::internal::JSRegExp>, v8::internal::Handle<v8::internal::String>, int, int*, int) + 481 
    frame #3: 0x0000000100545e72 node`v8::internal::Runtime_StringReplaceGlobalRegExpWithString(int, v8::internal::Object**, v8::internal::Isolate*) + 4930 
    frame #4: 0x00000af481a0963b 
    frame #5: 0x00000af481b14d09 
    frame #6: 0x00000af481b47d16 
    frame #7: 0x00000af481b474a4 
    frame #8: 0x00000af481a345e7 
    frame #9: 0x00000af481b46e69 
    frame #10: 0x00000af481b3f80b 
    frame #11: 0x00000af481b3c43b 
    frame #12: 0x00000af481b31a84 
    frame #13: 0x00000af481b31486 
    frame #14: 0x00000af481a3b7fa 
    frame #15: 0x00000af481a38c72 
    frame #16: 0x00000af481a318fd 
    frame #17: 0x00000af481a15b62 
    frame #18: 0x00000001002dad88 node`v8::internal::Invoke(bool, v8::internal::Handle<v8::internal::JSFunction>, v8::internal::Handle<v8::internal::Object>, int, v8::internal::Handle<v8::internal::Object>*) + 728 
    frame #19: 0x0000000100166d84 node`v8::Function::Call(v8::Local<v8::Context>, v8::Local<v8::Value>, int, v8::Local<v8::Value>*) + 276 
    frame #20: 0x0000000100666d0a node`node::LoadEnvironment(node::Environment*) + 486 
    frame #21: 0x000000010066819d node`node::Start(int, char**) + 508 
    frame #22: 0x0000000100000d34 node`start + 52 

내부적으로 정규 표현식 파서가 v8 기본 코드로 고정되어 있습니다.

입력에서 유효한 문자와 표현식에 대해 확실한 경우 v8에서 버그를 제기하는 것이 좋습니다.

희망이 도움이됩니다.

+0

덕분에 많이, 나는 그것을 시도합니다 ~ – hyj1991