최적화를 끌 수 있으므로 클로저의 범위 내 변수가 "최적화되지 않습니다"


11

최신 브라우저에서 수행 한 코드 최적화의 결과로 디버깅하는 동안 "실제로"범위에있는 모든 변수를 "볼 수"없습니다. 이것은 잘 알려져 있으며 이전 질문에서 해결되었습니다 . 이 기능은 프로덕션 환경에서 가장 유용하지만 개발 과정에서 많은 어려움을 겪고 있지만 속도가 느려집니다.

이제 내 질문은,이 동작을 해제 할 수있는 방법이 있습니까? 일부 구성 파일을 편집 할 수 있습니까, 아니면 브라우저 플러그인이 있습니까, 아니면 브라우저 실행 파일의 "개발자를위한 특수 빌드 버전"이 있습니까? 새 코드를 작성할 때 콘솔에 코드를 바로 입력하는 것을 좋아하므로 실제로 버그가 있습니다.

visualSummaryIffalseConsoleLog

업데이트 / 편집

다음은 Paul1365972의 일부 솔루션입니다.

다음과 같은 특수 옵션을 사용하여 명령 행에서 크롬 브라우저를 시작해야합니다.

  1. 크롬을 완전히 닫습니다
  2. "C:/Program Files (x86)/Google/Chrome/Application/chrome.exe" --js-flags="--allow-natives-syntax" 다른 OS와 유사한 Windows 용 콘솔에서 Chrome을 실행하십시오 .
  3. 개발자 콘솔을 열고를 실행하십시오 "%GetHeapUsage()". 옵션으로 Chrome을 올바르게 시작하면 콘솔에 숫자가 기록됩니다. 그렇지 않으면 구문 오류가 발생합니다.

이 명령 행 플래그를 사용하면 %일반 JavaScript의 구문 오류 인로 시작하는 명령으로 V8 엔진과 대화 할 수 있습니다 . 이런 종류의 사용 가능한 V8 명령 목록 은 Paul의 답변에 나와 있습니다.

%NeverOptimizeFunction()난 그냥 전화와 함께 할 수있는하려는 것처럼 보였다 뭔가 그 목록에. 불행히도 다음 스크린 샷에서 볼 수 있듯이 해당 기능은 내가 원하는 것을 수행하지 않습니다.

lorem은 아직 정의되지 않았습니다

((( Paul의 답변 (v8-natives 노드 모듈) 의 다른 링크 는이 문맥에서 우리에게 중요하지 않습니다. 코드가 충돌하지 않도록 "%"함수 호출 주위에 한 줄짜리 줄 바꿈) v8이 아닌 브라우저))))

(((이 기능이 작동 한 시점을 기억합니다 (최적화가 아직 발명 / 구현되지 않은 시점). 나는 얼마나 오래 전인지 모르겠습니다. 10 년? 15 년? 그런 것. 마지막 Chrome 버전은 무엇입니까? any) 그리고 당신이 할 수있는 마지막 파이어 폭스 버전 (여기서 더 확실합니다)은 무엇입니까? 그것은 당신에게 현상금을 얻지 못하지만 당신이 그것을 알고 답으로 게시하면 공감대를 얻습니다. .)))

해결책

감사합니다 SRNICEK

해키 수정

새로운 질문

Petr의 솔루션은 많은 도움이되지만 완벽하지는 않습니다. 이 질문은 너무 오래 걸리므로 Petr의 솔루션을 개선하는 방법 에 대한 새로운 질문 을 게시했습니다 . (물론 여기서이 질문을 편집 할 수는 있지만, 내가 무슨 뜻인지 알면 "역사적"이라고 느낄 것입니다.)


의도하지 않은 결과, 장과 이 최적화는 코딩 스타일에 부정적인 영향을 미칩니다. 나는 다른 방법보다 구식 for 루프 (.map, .forEach, .reduce 대신)를 더 많이 사용 하므로이 문제가 발생하지 않도록합니다.
mathheadinclouds

v8-natives라이브러리는해야하는 간단한 라이브러리의 코드에서 중요한 %의 호출을 래핑 noops... 특별한 --allow-원주민 구문 플래그에서 시작되지 않은 브라우저 또는 노드를
나다나엘

나는 몇 가지 테스트를 실행했는데 'bodyOnLoad'함수는 어쨌든 최적화되지 않았습니다. 따라서 internals 명령을 사용하여 강제로 최적화 해제를 시도해도 아무런 효과가 없습니다.
Nathanael

@Nathanael : 중요한 전화는 %NeverOptimizeFunction(foo)bodyOnload에 대해서도 "전화하기 때문에" "그냥 상처를 입지 않는다"는 것입니다. 문제는 foo내가 기대했던 방식으로 최적화되지 않은 것입니다. 변수 lorem가 보이지 않습니다. 함수 foo에 들어가는 코드를 작성하고 싶다고 가정 해 봅시다. 텍스트 편집기에 입력하는 대신 디버거가 foo에 앉아있는 동안 dev 콘솔에 입력하고 원하는지 확인한 다음 콘솔에서 텍스트 편집기로 복사 / 붙여 넣기하십시오. 그것이 내가 일하는 것을 좋아하는 방법입니다. 그리고 할 수 없습니다. 최적화 때문입니다. 알 겠어요?
mathheadinclouds

1
Paul1365972가 답변을 게시하기 전에 여러 --js-flags가지 ( TurboFan 관련 명령 포함) 여러 가지 V8 기본 명령을 실험하면서 여러 가지 실험을 보냈지 만 원하는 동작을 수행 할 수 없었습니다. 나는이 접근법이 막 다른 골목이라고 생각합니다. [v8]이 질문에 태그를 추가하는 것이 좋습니다 . V8의 내부 작업에 대해 깊이 이해하고있는 사람이라면 이것이 올바른 방향을 향하고 있는지, 아니면 당신을 가리킬 수 있는지를 분명히 할 수있을 것입니다.
Petr Srníček

답변:


2

디버거 문을 다음과 같이 평가하여 래핑하여 모든 변수에 액세스 할 수 있습니다 eval("debugger;");. 이 해키 솔루션은 호출 스택에 다른 익명 함수를 추가하며 DevTools에서 수동으로 설정되는 중단 점에는 사용되지 않습니다.

이것은 좋은 해결책은 아니지만 지금까지 의도 한 동작을 달성하는 유일한 방법이므로 답으로 게시하고 있습니다.


이것이 효과가 있다는 것은 놀랍습니다. 알다시피, eval ( "lorem") 입력을 시도했는데 동일한 "lorem is defined"오류가 발생했습니다. 콘솔에서 eval ( "lorem")을 입력하면 (foo 함수의 디버거 명령문에서) eval ( "debugger")와 다른 작업을 수행해야합니다. "ipsum"을 인쇄하십시오. 콘솔에. 그러나 그들은 매우 다릅니다. 이상한.
mathheadinclouds

흥미로운 해결 방법입니다. 디버거 문에서 벗어날 수 없으므로 (소스 파일로 수동 전환하면됩니다) 그렇지 않으면 전체 스택이 손실되고 eval이라는 함수로 돌아갑니다. 축소 된 스택에 다른 컨텍스트가 누락되었습니다.
Nathanael

eval ( "debugger") 대신 eval ( "") 만 넣으면됩니다.하지만이 코드 중 많은 부분이 '확장 된 중단 점'을 원하는 곳이라면 어디에서나 코드 전체에 분산되어 있습니다. 그런 다음 해당 eval ( '') 문 중 하나가있는 중단 점 (개발 도구를 사용하여)을 설정하고 일단 중지하면 "시작"됩니다. 나는 각 함수의 시작 부분에 그 진술을 넣는 작은 변환기 (작은 일에 큰 단어)를 작성하려고합니다. stackoverflow.com/questions/59159996/…
mathheadinclouds

방금 eval ( "debugger")을 eval ()로 바꾸려고했습니다. firefox 또는 chrome의 사용에 따라 다른 결과를 얻었습니다. i.stack.imgur.com/wy5WT.png
mathheadinclouds 2014

3

Chrome은 V8 JS-Engine을 사용하므로 --allow-natives-syntax 플래그를 사용하여 네이티브 호출을 활성화 할 수 있습니다.이 기능 은 찾고있는 것과 같은 유용한 디버깅 기능 (전체 목록은 여기에 있습니다 ) : % NeverOptimizeFunction () . 이 플래그가 없으면 이러한 호출은 잘못된 구문이므로 배포 할 때주의해야합니다 (또는 v8-Natives 라이브러리 사용).

이 기능을 사용하려면 --js-flags = "-allow-natives-syntax"를 사용하여 크롬을 열기 만하면됩니다 (신뢰할 수없는 웹 사이트 디버깅에는이 기능 만 사용하십시오. 에 액세스 할 수 있음).


감사합니다. 업데이트 된 질문을 읽으십시오. 여기에 해결책이있을 것 같지만 해결책을 얻으려면 좀 더 설명이 필요합니다. 이것이 효과가 있다면, 현상금을받을 가치가 있습니다.
mathheadinclouds

tl; dr 대신 --js-flags = "-allow-natives-syntax"를 사용하십시오. 이 기능을 사용하려면 --allow-natives-syntax 플래그로 V8 JS-Engine을 시작해야하지만 직접 시작할 수는 없습니다. 이것은 크롬 작업입니다. 따라서 플래그를 사용하여 엔진을 시작하도록 크롬에 지시해야합니다. 어떻게합니까? 언급 된 엔진 플래그를 --js-flags = <여기에서 플래그>를 통해 크롬으로 전달하십시오.
Paul1365972

아니. 한 번 더 시도해 보았습니다. 난 둘 다 시도 --allow-natives-syntax하고 --js-flags="--allow-natives-syntax""운영 체제 콘솔에서 '크롬'후 일이 I 형"으로 여러 번. 이 모든 것을 직접 시도하지 않았다면 나도 오타가 가장 가능성이 높은 설명이라고 생각합니다. 다른 스크린 샷을 만들었습니다. i.stack.imgur.com/7cpPP.png 오타가 있습니까? 솔직한 답변을 해주십시오. "기사를 읽고 이해"했습니까 (명확하게 말하면, 더 이상 주장하지 않으면 아무 문제가 없습니다), 아니면 실제로 모든 것을 시도해 보셨습니까? thx
mathheadinclouds

그냥 추측 : 그 옵션으로 크롬 실행 파일시작 하지 않지만 해당 옵션으로 크롬 C ++ (또는 무엇이든) 소스컴파일 합니까?
mathheadinclouds

1
이상하게 방금 테스트 한 결과 컴파일 작업이 필요하지 않았습니다. 나는 내가 한 일을 정확히 써서 오해가 없습니다. 1. Chrome을 완전히 닫습니다. 2. "C : / Program Files (x86) /Google/Chrome/Application/chrome.exe"--js-flags = "-allow-natives-syntax"를 사용하여 콘솔에서 Chrome을 실행합니다. 3. 열기 개발자 콘솔 및 "% GetHeapUsage ()"를 실행하여 모든 것이 작동하는지 테스트
Paul1365972

0

이 질문에 실제 답변이 있기를 바랍니다. 다음은 실제 답변이 아니며 임시 변통입니다. if (false) { console.log(variables, from, closures); }정적 분석을 사용하여 양식의 어리석은 도우미 코드를 만들 수있는 도우미 도구를 작성했습니다 (문제의 스크린 샷 참조)-코드에 붙여넣고 어리석은 말이 만들어지고 복사 할 수 있습니다. 입력하십시오. 이 모든 복사 및 붙여 넣기에도 시간이 걸리기 때문에 이것이 큰 도움이되는지 모르겠습니다. 그러나 이것이 제가 얻은 것입니다.

스크린 샷

깡깡이

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