Chrome 개발 도구 : 자바 스크립트의 [VM] 파일


139

Javascript 파일 (jaydata.js)에 중단 점을 추가하고 "다음 함수 호출로 넘어 가기"를 누르고있었습니다. 그것이 줄에 도착했을 때 :

},

"[VM] (8312)"라는 제목의 다른 파일이 팝업되었습니다. "다음 함수 호출로 넘어 가기"를 계속 클릭하면 화면은 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

"[VM] (XXXX")라는이 이상하고 신비한 스크립트는 무엇이며 어디에서 왔습니까?


1
이 VM 파일은 동시에 디버깅중인 파일을 편집 할 때도 나타납니다. Chrome은 동기화를 잃고 파일에 중단 점이 있으면 메모리의 파일에서 다른 위치에서 코드가 중지됩니다. 예를 들어 test.html은 중단 점을 허용하지만 Chrome이 중지되면 다른 위치의 VM99 : test.html에서 중단 점이 허용됩니다. 해결책은 Chrome을 닫고 파일 이름을 바꾸십시오 (예 : test2.html). (삭제 기록, 캐시 등이 작동하지 않으며 시도하면 Chrome에서 VM99 : test.html을 계속로드합니다.
QuentinUK

답변:


112

[VM] (scriptId)특별한 의미가 없습니다. 파일 이름에 직접 연결되지 않은 코드 (예 : 코드를 사용하여 만든 코드)를 구별하는 데 도움이되는 더미 이름입니다.eval 및 friends)와 입니다.

과거에는이 모든 스크립트에 라벨이 붙어있었습니다. (program) .

관심이 있으시면 찾아보십시오."[VM]" Chromium의 소스 코드를 개발자 도구 외부에서이 숫자가 의미가 없다는 것을 알게 될 것입니다.

2015-06-25 업데이트

[VM] (scriptId)의 이름 VMscriptId 이 얼마 전에 변경 되었으며 여기 에 값이 다시 변경되는 경우 검색 결과직접 연결되는 링크가 있습니다 .


1
Chrome이 라이브 js 파일 대신 [VM] 파일에 충돌합니까? 그렇다면 왜 그렇습니까?
Matt

@Matt "live js 파일 대신 [VM] 파일을 종료하십시오"는 무슨 뜻입니까?
Rob W

@RobW 무시; 내 브라우저가 js 파일을 캐시하고있었습니다 (캐시 버스터를 업데이트 했음에도 불구하고).
Matt

1
[VM] (scriptId)이름이 바뀌 었습니다 VMscriptId 얼마 전에 ,하지만 난 질문을 무효화하지 않는 현재 상태에 대한 답을 유지했습니다. 최신 코드 검색 링크는 다음과 같습니다. cs.chromium.org/%22VM%5C%22%20+%22 (값이 다시 변경되는 경우 검색 결과로 직접 연결되는 링크 : chromium.googlesource.com/chromium/blink/+/… )
Rob W

최근에 eval 없이이 문제가 발생했습니다 .iFrame 사용과 관련이있는 것으로 보입니다. 이것에 대한 나의 증거는 iFrame의 코드에 중단 점을 설정하면 [VM] 문제가 발생하지만 자체 창에서 iFrame을 열면 중단 점에 잘 도달한다는 것입니다. 이것이 답변에 설명 된대로 평가의 "친구"중 하나에 해당되는지 확인하십시오.
Danger

42

AJAX를 통해 HTML 컨텐츠를로드 할 때 해당 컨텐츠에 <script>태그 가 포함 된 경우 스크립트는 eval ()을 사용하여 평가되며 Chrome의 소스보기에서 'VM'으로 시작하는 새 파일로 인식됩니다. 언제든지 네트워크 탭으로 이동하여 AJAX 요청을 찾은 다음 스크립트를 포함하여 HTML 응답을 전체적으로 볼 수 있습니다.


3
그래도 디버깅에 어려움이 있습니다. 스크립트 태그를 사용 src=/test.js하여 test.js로 다시 추적하는 오류가 발생하면 추적에는 올바른 파일 이름이 포함되지만 그 이후에는 스택 추적에 VM 마법이 포함됩니다. 이로 인해 stacktrace의 파일에 대한 소스 코드 [같은 출처에서]를 두 번 이상 얻을 수 없으며 향후 스택 추적에서 어떤 파일인지 알 수 없으므로 캐시 할 수 없습니다. 이것은 Dev Tools에서 수정되었지만 webapps에서는 수정되지 않았습니다.
Carl Smith

이것은 아마도 현대 웹 응용 프로그램에서 발생하는 가장 일반적인 이유이며 코드와 내용을 분리해야하는 또 다른 좋은 예입니다.
alexw

37

eval을 사용하면 자바 스크립트가 Chrome 디버거 VM에 전달됩니다. Chrome 디버거 소스에서 eval로 작성된 js를 보려면 js의 끝에 (Splaktar 덕분에)이 속성을 설정하십시오.

//@ sourceURL=dynamicScript.js

WebKit, FireBug 또는 IE8 Developer Tool과 같은 일부 디버거로 동적 로딩 JavaScript를 디버깅 할 수 있습니까?


9
문법은 다음과 같이 바뀌 었습니다 : // # sourceURL = dynamicScript.js
ThiagoPonte

1
또한 시작이 아닌 JavaScript의 끝에 있어야합니다.
Splaktar

이런 것을 찾고있었습니다. 감사합니다
데이비드 Kierans

감사합니다! 너무 유용합니다!
Eve juan

4
Firefox 디버그 도구에서Using //@ to indicate sourceURL pragmas is deprecated. Use //# instead
Nighto

6

크롬으로 프로그래밍 방식으로 주입 된 JS 파일을 디버깅하려면 debugger;명령문을 사용할 수 있습니다. 이는 스크립트가있는 위치를 찾는 것보다 빠르며 sourceurl을 사용 하여 파일을 생성하는 것보다 빠릅니다 .

중단 점처럼 작동하며 debugger;명령문 을 사용할 때마다 크롬 소스 탭에서 코드를 자동으로 정확하게 찾아냅니다 .

디버거;

스크립트의 소스는 VMXXX 파일입니다.


이것은 질문에 대답하지 않는 것 같습니다.
그랜트 밀러

내 나쁜, 나는이 질문에 대한 다른 답변으로 나 자신을 보냈다.
Rodrirokr

1
감독자! 이것이 바로 내가 찾던 것입니다. JS 엔진이 코드를 삽입 한 VM을 찾을 필요가 없습니다.
Oleg Bolden 19 :

이 답변과 질문 사이에는 어떤 관련이 있습니까?
Ravindra Thorat

으로 debugger;신비 ' "[VM] (XXXX"라는 제목의 이상하고 신비한 스크립트'그가 그렇게 원한다면에서오고 어디 성명 그는 신비성을 할 수 있습니다.
Rodrirokr

4

일부 Chrome 확장 프로그램에서 VM이 생성되는 것을 발견했습니다. CSS / JS를 페이지에 삽입하고 Chrome은 VM 파일을 사용하여 VM을 실행합니다.


0

나중에 언로드되는 자식 창 (iframe) 소스를 디버깅 할 때 소스 파일에도 VM 접두사와 노란색 배경이 표시됩니다.


0

나는 같은 문제에 부딪쳤다. 문제는 내 앱의 코드가 우연히 블랙 박스로 간주되었다는 것입니다. 코드를 시작하려고 할 때 계속해서이 VMXXXX탭을 열었습니다 .

앱의 js 파일에 대한 블랙 박스 설정을 제거한 후 코드를 성공적으로 단계별로 실행할 수 있습니다.


0

이것을 막기 위해

(function ()
 {
  var originalEval = eval;
  eval =
   function (script)
   {
    return originalEval(script + "\n//# sourceURL=blackbox-this.js");
   }
 }());

그런 다음 블랙 박스 ^.*blackbox-this.js$

문자열을 가져올 때 setInterval / setTimeout과 동일하지만 어쨌든 나쁜 습관입니다.

그게 당신을 위해 작동합니까?


-1

각도 응용 프로그램을 디버깅 할 때도 같은 문제가 발생했습니다. 블랙 박스로 만들 수없는 VM 스크립트가 너무 많으면 실제로 디버깅하는 데 시간이 오래 걸렸습니다. 오히려 디버깅하기 위해 mozilla / IE 탐색기를 선택했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.