KR102171050B1 - 네이티브 모드에서의 실행으로부터 인터프리티드 모드에서의 실행으로 이행함으로써 네이티브 코드를 디버깅하는 기법 - Google Patents

네이티브 모드에서의 실행으로부터 인터프리티드 모드에서의 실행으로 이행함으로써 네이티브 코드를 디버깅하는 기법 Download PDF

Info

Publication number
KR102171050B1
KR102171050B1 KR1020157034649A KR20157034649A KR102171050B1 KR 102171050 B1 KR102171050 B1 KR 102171050B1 KR 1020157034649 A KR1020157034649 A KR 1020157034649A KR 20157034649 A KR20157034649 A KR 20157034649A KR 102171050 B1 KR102171050 B1 KR 102171050B1
Authority
KR
South Korea
Prior art keywords
debugging
program
native code
debug
native
Prior art date
Application number
KR1020157034649A
Other languages
English (en)
Other versions
KR20160018522A (ko
Inventor
미카일 콜타체브
니킬 칸델월
아크로쉬 간디
Original Assignee
마이크로소프트 테크놀로지 라이센싱, 엘엘씨
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by 마이크로소프트 테크놀로지 라이센싱, 엘엘씨 filed Critical 마이크로소프트 테크놀로지 라이센싱, 엘엘씨
Publication of KR20160018522A publication Critical patent/KR20160018522A/ko
Application granted granted Critical
Publication of KR102171050B1 publication Critical patent/KR102171050B1/ko

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/362Software debugging
    • G06F11/3636Software debugging by tracing the execution of the program
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3664Environments for testing or debugging software
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/53Decompilation; Disassembly

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Software Systems (AREA)
  • Devices For Executing Special Programs (AREA)
  • Debugging And Monitoring (AREA)

Abstract

듀얼-모드 디버거는 네이티브 코드 또는 인터프리티드 코드를 디버그할 수 있다. 모드들 사이에서의 이행은 규정된 베일아웃 조건들에 의해 기동될 수 있다. 프로그램은 디버거를 부착하는 것 및 디버거 하에서 프로그램을 네이티브 코드로 컴파일하는 것에 의해 디버깅될 수 있다. 프로그램의 규정된 지점들에서, 디버깅은 네이티브 모드로부터 인터프리티드 모드로 이행할 수 있다. 네이티브 코드의 디버깅은 중지할 수 있으며, 현재 상태가 캡처될 수 있고, 인터프리터가 인스턴스화될 수 있다. 인터프리터 스택이 생성될 수 있으며, 캡처된 현재 상태로 채워질 수 있다. 실행 컨트롤, 즉 실행의 일시정지, 실행의 지속, 코드 구간의 스텝 인투, 스텝 아웃 또는 스텝 오버 등을 수반하는 디버깅 작업들은, 통상적으로 보다 용이하게 구현되는 인터프리티드 모드에서 발생할 수 있다. 변수들의 검사 및 수정을 수반하는 디버깅 작업들은 네이티브 모드에서 발생할 수 있다.

Description

네이티브 모드에서의 실행으로부터 인터프리티드 모드에서의 실행으로 이행함으로써 네이티브 코드를 디버깅하는 기법{DEBUGGING NATIVE CODE BY TRANSITIONING FROM EXECUTION IN NATIVE MODE TO EXECUTION IN INTERPRETED MODE}
컴파일러는 소스 코드를 특정 프로세서에 의해 실행될 수 있는 코드로 컴파일함으로써 실행 가능 코드를 생성할 수 있다. 이러한 타입의 프로세서-특정 코드를 "네이티브 코드(native code)"라고 하며, 특정 타입의 프로세서에 의해서는 실행될 수 있지만 임의의 타입의 프로세서에 의해서는 실행될 수 없는 기계 명령어이다. 다른 타입의 컴파일러는 소스 코드를 수신해서, 프로세서-특정 코드가 아닌 중간 코드(intermediate code) 또는 가상 기계 바이트 코드(virtual machine byte code)를 생성할 수 있다. 중간 코드는 중간 언어 컴파일러(예를 들어, 저스트-인-타임(JIT) 컴파일러)에 의해 수신되고, 프로그램이 실행되기 직전에 네이티브 코드로 컴파일되는 것이 보통이다. 중간 코드는 플랫폼-특정 코드가 아니다.
인터프리터는 소스 코드 또는 중간 코드를 판독하고, 해당 코드를 네이티브 코드로 번역하지 않고 스테이트먼트 단위로 코드를 실행한다. 통상적으로, 코드의 인터프리팅은 네이티브 코드의 실행보다 느리다. 코드의 인터프리팅은 통상적으로 중간 코드를 네이티브 코드로 JIT-컴파일링하여 그 네이티브 코드를 실행하는 것보다 느리다.
인터프리티드 코드용 디버거(debugger)의 구현이 네이티브 코드용 디버거의 구현보다는 복잡하지 않은 것이 보통이다. 그러나, 응답 시간은 통상적으로 인터프리티드 코드용 디버거보다는 네이티브 코드용 디버거에 있어서 더욱 빠르다. 디버거는, 함수의 스텝 인투(step into) 또는 스텝 아웃(step out), 함수의 스텝 오버(step over), 실행의 일시정지 및 재개, 변수 또는 스택 위치의 현재값의 검사 등에 의해 사용자에게 프로그램의 실행을 컨트롤하는 능력을 제공하는 것이 보통이다.
본원에 기술된 바와 같은 듀얼-모드 디버거는 프로그램을 나타내는 네이티브 코드를 디버그할 수 있다. 디버거는, 디버깅되는 프로그램에서 규정된 디버그 베일아웃(bailout) 조건의 검출에 응답하여, 프로그램을 나타내는 네이티브 코드의 디버깅을 중지할 수 있는 한편, 프로그램을 나타내는 상응하는 인터프리티드 코드의 디버깅으로 이행할 수 있다. 네이티브 모드에서, 디버거는 프로그램을 나타내는 네이티브 코드를 디버그할 수 있다. 프로그램 변수들의 현재값들 및/또는 스택 정보의 검사 및/또는 수정을 제공하는 디버그 작업은 네이티브 모드에서 실행할 수 있다. 네이티브 모드 디버깅에 있어서, 레지스터에 변수가 저장될 때마다(예를 들어, 변수가 프로그램에서 규정되는 경우), 함수를 위한 스택 위치에 현재값도 저장될 수 있다. 디버깅되는 함수를 위한 변수들은 디버깅되는 프로그램을 위해 보유된 스택의 특정한 국소 영역에 저장될 수 있다. 스택의 동일 영역은 스필링(spilling)을 위해 네이티브 코드로의 컴파일 동안 사용될 수 있다(즉, 컴퓨팅 장치가 레지스터들을 구비하는 것보다 더 라이브한 변수들이 존재하는 경우에, 변수들은 레지스터들로부터 메모리로 "스필링"될 수 있음). 스택 위치들은 변수들의 값들을 취해서 변경하기 위해 디버거에 의해 이용될 수 있다.
베일아웃 조건의 검출에 응답하여, 프로그램을 나타내는 네이티브 코드의 디버깅이 중지할 수 있다. 인터프리터는 프로그램을 나타내는 인터프리티드 코드를 수신할 수 있으며, 네이티브 코드에 대응하는 수신된 인터프리티드 코드가 디버깅되고, 또한 인터프리티드 모드에서 가동하는 프로그램을 위해 인터프리티드 코드의 디버깅을 재개할 수 있다. 예컨대, 디버깅되는 프로그램의 실행을 컨트롤하는 디버그 작업들은 인터프리티드 모드에서 가동할 수 있다. 실행 컨트롤 작업들은 비동기 중단(asynchronous break), 스테핑(stepping), 중단지점(breakpoint), 및/또는 예외 중단(break on exception) 작업들에 의해 구현될 수 있다. 인터프리터 모드 디버깅은, 프로그램의 다른 부분들을 디버그하기 위해서는 네이티브 모드를 사용하면서, 최상위 함수(스택의 최상위 프레임에 변수 값들이 놓이는 함수)을 디버그하기 위해 사용될 수 있다.
디버거는 규정된 베일아웃 포인트에서 네이티브 모드에서의 디버깅으로부터 인터프리티드 모드에서의 디버깅으로 이행할 수 있다. 디버거에 연관된 베일아웃 엔진은 디버거 하에서 실행하는 네이티브 코드의 현재 상태를 포함하는 베일아웃 레코드를 수신할 수 있다. 베일아웃 엔진은 인터프리터의 인스턴스(instance)를 예시할 수 있으며, 인터프리터의 인스턴스에 대한 인터프리터 스택 프레임을 생성할 수 있고, 또한 인터프리터의 인스턴스에 대하여 생성된 인터프리터 스택 프레임을 베일아웃 레코드로부터의 값들로 채울 수 있다. 프로그램의 디버깅은 프로그램에 대한 유사한 상응하는 인터프리티드 코드에 대하여 재개할 수 있다. 디버그 베일아웃 포인트는, 특정 베일아웃 조건들이 충족되는 경우에, 네이티브 모드 디버깅이 인터프리티드 모드 디버깅으로 이행할 수 있는 프로그램 내의 위치이다. 함수의 시작(at the beginning of a function), 루프의 백 에지(at the back edge of a loop), 함수 리턴시(when a function returns), 헬퍼 함수 또는 라이브러리에 대한 호출 리턴시(when a call to a helper function or library returns), 또는 디버거 스테이트먼트와의 조우시(when a debugger statement is encountered)와 같은 디버그 베일아웃 포인트가 프로그램에 대하여 규정될 수 있다. 디버그 세션에서 디버그 베일아웃 포인트와 조우하는 경우에, 런타임(runtime) 디버그 플래그들의 상태와 스택 프레임의 스택 깊이 검사는 디버그 베일아웃 조건이 충족되는지를 판정하는 데 사용될 수 있다. 디버그 베일아웃 조건들이 충족되면, 디버거 하에서 실행하는 네이티브 코드에 대응하는 코드가 인터프리터에 전송될 수 있으며, 상응하는 인터프리티드 코드에 대하여 디버깅이 진행될 수 있다.
본 개요는 후속하여 발명의 상세한 설명 부분에서 설명되는 개념들 중 선택된 것들을 단순화된 형태로 소개하고자 제공되는 것이다. 본 개요는 청구항의 청구대상의 핵심적인 특징이나 필수적인 특징들을 밝히고자 함이 아니며, 청구항의 청구대상의 범위를 결정하는 데 도움이 되고자 함도 아니다.
도 1a는 수신된 문서들로부터 페이지들을 렌더링하는 브라우저 애플리케이션을 포함하는 시스템(100)의 일례를 도시한 것이다.
도 1b는 본원에 개시된 요지의 양태들에 따라 컴파일된 코드의 실행으로부터 코드의 인터프리팅으로 이행할 수 있는 런타임 엔진을 포함하는 시스템(200)의 일례를 도시한 것이다.
도 1c는 본원에 개시된 요지의 양태들에 따라 컴파일된 코드의 실행으로부터 코드의 인터프리팅으로 이행할 수 있는 런타임 엔진을 포함하는 시스템(300)의 일례를 도시한 것이다.
도 1d는 본원에 개시된 요지의 양태들에 따라 네이티브 모드로부터 인터프리티드 모드로의 이행에 의해 코드를 디버그할 수 있는 시스템(400)의 일례를 도시한 것이다.
도 2는 본원에 개시된 요지의 양태들에 따라 네이티브 코드의 디버깅으로부터 인터프리티드 코드의 디버깅으로 이행하는 방법(250)의 일례를 도시한 것이다.
도 3은 본원에 개시된 요지의 양태들에 따른 컴퓨팅 환경의 일례의 블록 다이어그램이다.
도 4는 본원에 개시된 요지의 양태들에 따른 통합 개발 환경(IDE)의 일례의 블록 다이어그램이다.
개요(Overview)
프로그램을 네이티브 코드로 컴파일하고 네이티브 코드를 디버깅함으로써 프로그램이 디버깅될 수 있다. 프로그램의 규정된 지점들에서, 디버깅은 네이티브 모드로부터 인터프리티드 모드로 이행할 수 있고, 또한 디버깅은 인터프리티드 코드에 대하여 지속될 수 있다. 실행 컨트롤, 즉 실행의 일시정지, 실행의 지속, 코드 구간의 스텝 인투, 스텝 아웃 또는 스텝 오버 등을 수반하는 디버깅 작업들은 인터프리티드 모드에서 발생할 수 있다. 변수들의 검사 및 수정을 수반하는 디버깅 작업들은 네이티브 모드에서 발생할 수 있다. 듀얼-모드 디버거는 네이티브 모드 디버깅의 속도와 인터프리티드 모드 디버깅의 간략화를 결합할 수 있다.
네이티브 모드에서의 실행으로부터 인터프리터 모드에서의 실행으로 이행함으로써 네이티브 코드를 디버깅(Debugging Native Code by Transitioning from Execution in Native Mode to Execution in Interpreter Mode)
도 1a는 본원에 개시된 요지의 일부 양태들에 따른 웹 브라우징 환경(100)의 일례를 나타낸다. 도 1a에 도시된 바와 같이, 환경(100)은 컴퓨팅 장치(102), 서버(104), 네트워크(106) 및 브라우저 애플리케이션(108) 중 하나 이상을 포함할 수 있다. 웹 브라우징 환경(100)은 본 기술 분야에 공지되어 있는 다른 구성요소들을 포함할 수 있다.
컴퓨팅 장치(102)는, 데스크톱 컴퓨터(예컨대, 퍼스널 컴퓨터 등), 모바일 컴퓨터 또는 컴퓨팅 장치(예컨대, Palm® 디바이스, RIM Blackberry® 디바이스, 개인 휴대 정보 단말기(PDA), 랩톱 컴퓨터, 노트북 컴퓨터, 태블릿 컴퓨터(예컨대, Apple iPad™), 넷북 등), 모바일 폰(예컨대, 셀 폰, Apple iPhone, Google Android™ 폰, Microsoft Windows® 폰과 같은 스마트 폰 등), 또는 다른 타입의 모바일 디바이스를 포함하는 임의의 타입의 고정식 또는 모바일 컴퓨팅 장치일 수 있다. 서버(104)는, 본원에 기술된 상응하는 기능성을 이네이블로 할 수 있는 본원에 기술된 또는 기타 공지된 임의의 타입의 컴퓨팅 장치일 수 있는 하나 이상의 서버를 포함하는 하나 이상의 컴퓨터 시스템에서 구현될 수 있다.
컴퓨팅 장치(102)와 서버(104)는 네트워크(106)에 의해 통신 가능하게 결합될 수 있다. 네트워크(106)는, PAN(personal area network), LAN(local area network), WAN(wide area network), 또는 인터넷(Internet)과 같은 네트워크들의 조합 등의 하나 이상의 통신 네트워크들 및/또는 통신 링크들을 포함할 수 있다. 컴퓨팅 장치(102) 및 서버(104)는 IEEE 802.11 WLAN(wireless LAN) 무선 링크, Wi-MAX(Worldwide Interoperability for Microwave Access) 링크, 셀룰러 네트워크 링크(cellular network links), 무선 사설 네트워크(wireless personal area network)(PAN) 링크(예를 들어, Bluetooth™ 링크), 이더넷(Ethernet) 링크, USB 링크 등과 같은 유선 및/또는 무선 링크를 포함하는 다양한 링크를 이용해서 네트워크(106)에 통신 가능하게 결합될 수 있다.
브라우저 애플리케이션(108)은 컴퓨팅 장치(102)에서 실행할 수 있는 프로그램일 수 있다. 브라우저 애플리케이션(108)은 네트워크 정보 리소스들이 검색, 표시, 및 횡단되게 할 수 있다. 정보 리소스 또는 객체는 인터넷 식별자(URI)와 같은 네트워크 어드레스를 이용해서 브라우저 애플리케이션(108)에 의해 검색될 수 있다. 정보 리소스들로서는 콘텐트로 이루어진 웹 페이지들, 이미지들, 비디오들, 및 다른 형태들을 예로 들 수 있다. 정보 리소스들에 표시되는 하이퍼링크들은 사용자들이 그들의 브라우저로 관련 리소스들을 용이하게 내비게이팅할 수 있게 한다. 브라우저 애플리케이션(108)으로서는, 워싱턴 레드몬드 소재의 Microsoft Corp.에 의해 개발된 Internet Explorer®, 캘리포니아 마운틴 뷰 소재의 Mozilla Corp.에 의해 개발된 Mozilla Firefox®, 캘리포니아 쿠퍼티노 소재의 Apple Inc.에 의해 개발된 Safari®, 및 캘리포니아 마운틴 뷰 소재의 Google Inc.에 의해 개발된 Chrome®을 예로 들 수 있지만, 이들에 한정되는 것은 아니다.
브라우저 애플리케이션(108)은 네트워크(106)를 통해 서버(104)로부터 문서(112)를 검색할 수 있다. 문서(112)는 HTML(Hyper Text Markup Language), DHTML(dynamic HTML), XHTML(extensible HTML), XML(extensible markup language)과 같은 마크업 언어로 이루어진 코드를 포함하는 웹 문서일 수 있다. 문서(112)는 DOM(document object model) 객체(114) 및 하나 이상의 스크립트(들)(116)를 포함할 수 있다. DOM 객체(114)는, 객체들을 나타내고 객체들과 상호작용하기 위한 크로스-플랫폼 및 언어-독립적 협약인 DOM 협약에 따라 문서(112)에서 나타내어지는 하나 이상의 객체를 포함할 수 있다. DOM 객체(114)는 문서(112)에 직접 포함되거나 및/또는 문서(112)에 의해 인용되어서 서버(104) 또는 다른 서버로부터 별도로 검색되는 객체들을 포함할 수 있다. 스크립트(들)(116)는, 사용자 입력, 환경 조건들(예컨대, 현재 시간, 또는 다른 변수들) 등의 요인들에 기초한 변화를 포함하여, DOM 객체(114)에 대하여 변화가 이루어질 수 있게 하는 다이내믹 언어(예컨대, JavaScript, VBScript, AJAX, Python, Perl 등)에 따라 포맷된 코드를 포함한다. 스크립트(들)(116)의 코드는 DOM 객체(114)의 객체들을 서버(104)에 리턴시키지 않고 온 더 플라이(on the fly) 모드로 액세스 및 수정할 수 있다.
브라우저 애플리케이션(108)은 문서(112)를 수신(예컨대, 로드(load))할 수 있다. 브라우저 애플리케이션(108)은 문서(112)의 정보를 포맷하고, 포맷된 정보를 디스플레이하는 브라우저 엔진(예컨대, 레이아웃 엔진 또는 렌더링 엔진)을 포함할 수 있다. 예컨대, 도 1a에 도시된 바와 같이, 브라우저 애플리케이션(108)은 컴퓨팅 장치(102)의 디스플레이(110)에 의해 디스플레이되는 문서(112)에 기초하여 페이지(118)를 발생시킬 수 있다. 브라우저 애플리케이션(108)은, 문서(112)에 임베드되어 있거나, 또는 문서(112)와 연관되기는 하지만 개별적인 하나 이상의 스크립트(116)를 실행하도록 구성될 수 있다.
도 1b는 본원에 개시된 요지의 일부 양태에 따른 시스템(200)의 블록 다이어그램을 나타낸다. 시스템(200)은, 프로세서(143) 등과 같은 하나 이상의 프로세서, 메모리(145), 실행 컨트롤러(309), 인터프리터(311), JIT(just-in-time) 컴파일러(313)와 같은 컴파일러, 스토리지(315), 기계 코드 실행기(317), 및 베일아웃 엔진(337)을 포함하는 컴퓨팅 장치(102)와 같은 하나 이상의 컴퓨터 또는 컴퓨팅 장치를 포함할 수 있다. 실행 컨트롤러(309), 인터프리터(311), JIT 컴파일러(313)와 같은 컴파일러, 스토리지(315), 기계 코드 실행기(317), 및 베일아웃 엔진(337)은, 메모리(145)에의 로딩시에, 하나 이상의 프로세서(143) 등으로 하여금, 실행 컨트롤러(309), 인터프리터(311), JIT 컴파일러(313)와 같은 컴파일러, 기계 코드 실행기(317), 및 베일아웃 엔진(337)에 제각기 기인하는 동작들을 수행하게 하는 하나 이상의 프로그램 모듈로서 구현될 수 있다. 시스템(200)은 도시되어 있지 않지만 본 기술분야에 공지되어 있는 다른 구성요소들을 포함할 수 있다.
실행 컨트롤러(309), 인터프리터(311), 및/또는 JIT 컴파일러(313)는 소스 코드로부터 발생된 바이트코드를 수신할 수 있다. 소스 코드는 JavaScript, VBScript, Python 등(이들에 제한되는 것은 아님)과 같은 다이내믹 스크립팅 언어들(이들에 제한되는 것은 아님)과 같은 프로그래밍 언어로 기입된 임의의 소스 코드일 수 있다. 소스 코드는 파싱될 수 있으며, 바이트코드는 파싱된 소스 코드로부터 발생될 수 있다. 바이트코드(325)와, 프로파일 정보, 발견적(heuristic) 정보 또는 다른 정보에 기초하여, 실행 컨트롤러(309)는 인터프리터(311) 및 JIT 컴파일러(313) 중 하나를 바이트코드(325)에 대하여 작동하게 할 수 있다. 인터프리터(311)는 실행 컨트롤러(309)로부터 수신된 인터프리터 컨트롤 신호에 의해 이네이블로 될 때 바이트코드(325)를 해석하도록 구성될 수 있다. JIT 컴파일러(313)는 실행 컨트롤러(309)로부터 수신된 컴파일러 컨트롤 신호에 의해 이네이블로 될 때 바이트코드(325)를 컴파일하도록 구성될 수 있다.
인터프리터 컨트롤 신호에 의해 인터프리터(311)가 이네이블로 될 때, 인터프리터(311)는 바이트코드(325)를 해석 및 실행할 수 있다. 인터프리터(311)는, JavaScript 인터프리터, VBScript 인터프리터, Python 인터프리터로서, 또는 본원의 어딘가에 언급된 또는 기타 공지된 다른 다이내믹 언어 또는 다이내믹 스크립팅 언어용 인터프리터로서 구현될 수 있다. 이렇게, 소스 코드는 인터프리터(311)의 작동에 의해 적어도 부분적으로 실행될 수 있다. 마찬가지로, 이네이블링 컴파일러 컨트롤 신호의 수신에 응답하여, JIT 컴파일러(313)는 바이트코드(325)를 컴파일할 수 있다. JIT 컴파일러(313)는, JavaScript 컴파일러, VBScript 컴파일러, Python 컴파일러로서, 또는 본원의 어딘가에 언급된 또는 기타 공지된 다른 다이내믹 언어 또는 다이내믹 스크립팅 언어용 컴파일러로서 구현될 수 있다. JIT 컴파일러(313)는, 실행 전에 바이트코드(325)를 전부 사전 컴파일하기보다는, 컴파일된 바이트코드가 필요해질 때(예컨대, 실행이 임박해 있을 때) 특정 바이트코드 부분들을 JIT 컴파일러(313)에 의해 컴파일할 수 있기 때문에, "저스트 인 타임" 컴파일러라고 한다. JIT 컴파일러(313)는 기계 실행 가능 코드 또는 명령어들의 형태를 갖는 컴파일된 바이트코드(333)를 발생시킬 수 있다.
JIT 컴파일러(313)는 상술한 바와 같은 추정에 기초하여 코드 최적화를 수행할 수 있다. JIT 컴파일러(313)는 그것이 발생시키는 컴파일된 바이트코드에 하나 이상의 사전결정된 베일아웃 포인트를 삽입할 수 있다. 각각의 베일아웃 포인트에 대해서는, 변수들의 위치와, 바이트코드(325) 내의 위치 또는 베일아웃 포인트 위치에 대응하는 소스 코드에서의 위치 및 다른 정보가 기록될 수 있는 베일아웃 테이블(303) 등과 같은 베일아웃 테이블이 생성될 수 있다. 베일아웃 테이블(303) 등은 변수들을 찾아야 할 곳이 스택 상인지 또는 레지스터 내인지를 기술할 수 있다. JIT 컴파일러(313)는 하나 이상의 베일아웃 테이블을 발생시킬 수 있고, 이들 테이블을 최적화된 컴파일된 바이트코드로(예컨대, 기계 코드로서) 저장할 수 있다. 베일아웃 테이블은 베일아웃 테이블 내의 정보를 부호화하는 것에 의해 변수들의 수명을 불필요하게 연장하는 것을 회피함으로써 최적화될 수 있다. 예컨대, 베일아웃 시점에 변수 x의 값이 상수 10인 것을 알고 있으면, x=10이 베일아웃 테이블에서 부호화될 수 있으므로, 값 10은 메모리 내에 또는 부활 대상 레지스터 내에 있을 필요가 없다. 마찬가지로, 베일아웃 포인트에서 하나 이상의 변수가 동일한 값을 가지면(예컨대, x = y), 이 정보가 베일아웃 테이블에서 부호화되는 경우에는 동일한 값을 갖는 모든 변수들에 대해서는 베일아웃 테이블에서 동일한 위치가 사용될 수 있다(예를 들어, x 및 y에 대하여 베일아웃 테이블에서 동일한 위치가 사용될 수 있다). 이들 기법은 레지스터 할당을 더욱 유효하게 만들 수 있다. 최적화된 컴파일된 바이트코드는 시스템(200)에 의한 프로그램의 후속 실행 동안의 액세스를 위해 컴파일된 바이트코드(333)로서 스토리지(315)에 저장될 수 있다.
최적화된 컴파일된 바이트코드가 실행되면, 최적화된 컴파일된 바이트코드(333)는 (프로세서(143) 등과 같은 하나 이상의 프로세서일 수 있는) 기계 코드 실행기(317)에 의해 수신될 수 있다. 컴파일된 바이트코드의 실행은 스택(335) 상의 컴파일러 프레임(341)과 연관될 수 있다. 최적화에 기초한 근본적인 추정 또는 추정들은 각각의 베일아웃 포인트에서 유효 또는 무효로 판정될 수 있다. 추정(들)이 유효하다는 판정에 응답하여, 최적화된 컴파일된 코드가 실행을 지속할 수 있다. 추정(들)이 무효하다는 판정에 응답하여, 최적화된 컴파일된 코드의 실행을 중지할 수 있다. 베일아웃 테이블은 베일아웃 포인트를 베일아웃 엔진(337)에 건넬 수 있도록 하기 위한 것이다. 베일아웃 엔진(337)은 인터프리터가 필요로 하는 변수들의 상태(예컨대, 값)를 복원할 수 있다. 베일아웃 엔진은 스택(335)을 위한 새로운 프레임(예컨대, 인터프리터 프레임(339))을 생성할 수 있다. 인터프리터가 필요로 하는 변수가 비활성화 상태로 되어 있을 경우에는, 베일아웃 엔진(337)은 변수의 상태를 비활성화 상태에서 활성화 상태로 변경함으로써 변수를 부활시킬 수 있다. 베일아웃 엔진(337)은 인터프리터(311)의 인스턴스를 인스턴스화할 수 있으며, 인터프리터를 최적화된 컴파일된 코드 및 복원된 활성화 변수들 모두의 값들을 포함하는 새롭게 생성된 인터프리터 프레임에서의 베일아웃 포인트에 대응하는 바이트코드에서의 위치로 이동시킨다. 이런 이유로, 바이트코드(325)가 발생된 소스 코드는 JIT 컴파일러(313) 및 기계 코드 실행기(317)의 작동에 의해 부분적으로 실행되는 한편, 인터프리터(311)에 의해 부분적으로 실행될 수 있다.
도 1c는 시스템, 즉 본원에 개시된 요지의 양태들에 따른 시스템(300)의 다른 예를 나타낸다. 시스템(300)은 프로세서(142) 등과 같은 하나 이상의 프로세서와, 메모리(144)와, 그리고 하기의 것들, 즉 엔진 인터페이스(302), 파서(parser)(304), 바이트코드 발생기(306), 실행 컨트롤러(308), 인터프리터(310), JIT(저스트-인-타임) 컴파일러(312)(이것에 제한되는 것은 아님)와 같은 컴파일러, 스토리지(314), 기계 코드 실행기(316), 베일아웃 엔진(336) 및 스크립트 라이브러리(318) 중 하나 이상을 포함하는 런타임 엔진으로 구성되는 컴퓨팅 장치(102)와 같은 컴퓨팅 장치를 포함할 수 있다. 시스템(300)은 도시되어 있지 않지만 본 기술분야에 공지된 다른 구성요소들을 포함할 수 있다.
도 1c에 도시된 바와 같이, 엔진 인터페이스(302)는 스크립트 소스 코드(208)를 수신할 수 있다. 엔진 인터페이스(302)는 존재하거나, 또는 존재하지 않을 수 있다. 파서(304)는 존재하는 엔진 인터페이스(302)를 구비하기보다는 런타임 엔진에 대한 인터페이스로서 구성될 수 있다. 존재할 경우, 엔진 인터페이스(302)는 도 1c의 런타임 엔진과 호스트와의 인터페이싱을 위한 하나 이상의 방법을 제공하는 통신 인터페이스일 수 있다. 본원에 개시된 요지의 일부 양태에 따르면, 엔진 인터페이스(302)는 워싱턴 레드몬드 소재의 Microsoft Corporation에 의해 개발된 IActiveScript에 따라 구현될 수 있다. 엔진 인터페이스(302)는 소스 코드(208)를 파서(304)에 제공할 수 있다.
파서(304)는 소스 코드(208)를 수신하고 파싱할 수 있다. 파서(304)는 소스 코드(208)에 대하여 토큰 발생 또는 어휘 분석을 수행할 수 있기 때문에, 소스 코드(208)는 심볼들 또는 토큰들로 포맷된다. 파서(304)는, 신택스 에러들이 존재하지 않는 등, 허용 가능한 표현들이 형성되어 있는 지의 여부를 판정하기 위해 토큰들에 대하여 에러 검사를 수행할 수 있다. 파서(304)는 상기 파싱된 소스 코드를 파싱된 소스 코드(도시되지 않음)로서 출력할 수 있다. 파싱된 소스 코드는, 관련 분야의 숙련자들에게 공지되어 있는 바와 같이, 파서(304)에 의해 발생되는 것을, 소스 코드(208)의 추상 구문 구조의 트리 표시를 포함하는 AST(추상 구문 트리) 코드로서 포함하는 임의의 적절한 형태를 갖출 수 있다.
바이트코드 발생기(306)는 파싱된 소스 코드를 수신할 수 있다. 바이트코드 발생기(306)는 파싱된 소스 코드를, 인터프리터에 의한 유효한 실행을 위해서뿐만 아니라 기계 코드로의 추가적인 컴파일을 위해서 구성된 명령어 세트들을 포함하는 바이트코드로 전환하도록 구성될 수 있다. 발생된 바이트코드는 파싱된 소스 코드를 숫자 코드 및 상응하는 임의 파라미터로서 나타낼 수 있다. 바이트코드 발생기(306)는 발생된 바이트코드(도시되지 않음)를 출력할 수 있다. 바이트코드는, 관련 분야의 숙련자에게 공지되어 있는 바와 같이, 바이트코드 발생기(306)에 의해 발생되는 것을 p-코드(간이 코드) 형태로 포함하는 임의의 적절한 형태를 갖출 수 있다.
실행 컨트롤러(308), 인터프리터(310), 및 JIT 컴파일러(312) 각각은 발생된 바이트코드를 수신할 수 있다. 인터프리터(310) 또는 기계 코드 실행기(316)는 프로파일 발생기(204)를 포함할 수 있다. 프로파일 발생기(204)는 발생된 바이트코드를 분석해서 소스 코드(208)에 관련된 통계 및 추가 정보를 수집하도록 구성될 수 있다. 프로파일 발생기(204)는, 수집된 정보를 포함할 수 있고 스토리지(314)에 저장될 수 있는 프로파일 정보(320)를 발생시킬 수 있다.
실행 컨트롤러(308)는 프로파일 정보(320)에 액세스할 수 있으며, 인터프리터(310) 및 JIT 컴파일러(312)에 통신 가능하게 결합될 수 있다. 발생된 바이트코드 및 프로파일 정보(320)에 기초하여, 실행 컨트롤러(308)는 인터프리터(310) 및 JIT 컴파일러(312) 중 하나를, 발생된 바이트코드에 대하여 작동하게 할 수 있다. 인터프리터(310)는, 실행 컨트롤러(308)로부터 수신된 인터프리터 컨트롤 신호에 의해 이네이블로 될 때, 발생된 바이트코드를 해석하도록 구성될 수 있다. JIT 컴파일러(312)는, 실행 컨트롤러(308)로부터 수신된 컴파일러 컨트롤 신호에 의해 이네이블로 될 때, 발생된 바이트코드를 컴파일하도록 구성될 수 있다. 예컨대, 소스 코드(208)의 제 1 실행 동안에는, 프로파일 정보(320)가 아직 존재하지 않을 수 있다. 상기와 같은 경우에 있어서, 실행 컨트롤러(308)는 인터프리터(310)가 발생된 바이트코드를 해석하고 프로파일 정보(320)를 발생시킬 수 있게 할 수 있다. 소스 코드(208)의 후속 실행 동안(예컨대, 소스 코드(208)의 동일한 제 1 실행 동안의 이후, 및/또는 소스 코드(208)의 후속 실행 동안)에는, 실행 컨트롤러(308)는, 프로파일 정보(320)에 기초하여, 인터프리터(310)가 소스 코드(208)의 부분들을 해석할 수 있게 하는 한편, JIT 컴파일러(312)가 소스 코드(208)의 다른 부분들을 컴파일할 수 있게 할 수 있다.
인터프리터(310)가 인터프리터 컨트롤 신호에 의해 이네이블로 될 때, 인터프리터(310)는 발생된 바이트코드를 해석해서 실행할 수 있다. 인터프리터(310)는, JavaScript 인터프리터, VBScript 인터프리터, Python 인터프리터로서, 또는 본원의 어딘가에 언급된 또는 기타 공지된 다른 다이내믹 언어용 인터프리터로서 구현될 수 있다. 이렇게, 소스 코드(208)는 인터프리터(310)의 작동에 의해 적어도 부분적으로 실행될 수 있다.
JIT 컴파일러(312)가 컴파일러 컨트롤 신호에 의해 이네이블로 될 때, JIT 컴파일러(312)는 발생된 바이트코드를 컴파일할 수 있다. JIT 컴파일러(312)는, JavaScript 컴파일러, VBScript 컴파일러, Python 컴파일러로서, 또는 본원의 어딘가에 언급된 또는 기타 공지된 다른 다이내믹 언어용 컴파일러로서 구현될 수 있다. JIT 컴파일러(312)는, 실행 전에 바이트코드를 전부 사전 컴파일하기보다는, 컴파일된 바이트코드가 필요해질 때(예컨대, 실행이 임박해 있을 때) 특정 바이트코드 부분들을 JIT 컴파일러(312)에 의해 컴파일할 수 있기 때문에, "저스트 인 타임" 컴파일러라고 한다. JIT 컴파일러(312)는 기계 실행 가능 코드 또는 명령어들의 형태를 가질 수 있는 컴파일된 바이트코드(332)를 발생시킬 수 있다.
JIT 컴파일러(312)는 상술한 바와 같은 추정에 기초하여 코드 최적화를 수행할 수 있다. JIT 컴파일러(312)는 그것이 발생시키는 컴파일된 바이트코드에 하나 이상의 사전결정된 베일아웃 포인트를 삽입할 수 있다. 각각의 베일아웃 포인트에 대해서는, 변수들의 상태, 즉 베일아웃 포인트 위치에 대응하는 발생된 바이트코드에서의 위치가 기록될 수 있는 베일아웃 테이블(303) 등과 같은 베일아웃 테이블이 생성될 수 있다. 베일아웃 테이블은 변수들을 찾아야 할 곳이 스택 상인지 또는 기계 코드의 레지스터 내인지를 기술할 수 있다. JIT 컴파일러(312)는 베일아웃 테이블들을 발생시킬 수 있고, 이들 테이블을 최적화된 컴파일된 바이트코드(332)(예컨대, 기계 코드)로 저장할 수 있다. 최적화된 컴파일된 바이트코드(332)는 시스템(300)에 의한 프로그램의 후속 실행 동안의 액세스를 위해 컴파일된 바이트코드(332)로서 스토리지(314)에 저장될 수 있다.
최적화된 컴파일된 바이트코드가 실행되면, 최적화된 컴파일된 바이트코드(332)는 (프로세서(142) 등과 같은 하나 이상의 프로세서일 수 있는) 기계 코드 실행기(316)에 의해 수신될 수 있다. 최적화에 기초한 근본적인 추정 또는 추정들은 각각의 베일아웃 포인트에서 유효 또는 무효가 검사될 수 있다. 추정(들)이 유효하다는 판정에 응답하여, 최적화된 컴파일된 바이트코드(332)가 실행을 지속할 수 있다. 추정(들)이 무효하다는 판정에 응답하여, 최적화된 컴파일된 코드의 실행을 중지할 수 있다. 베일아웃 테이블은 베일아웃 포인트를 베일아웃 엔진(336)에 건넬 수 있도록 하기 위한 것이다. 베일아웃 엔진(336)은 인터프리터가 필요로 하는 변수들의 상태(예컨대, 값)를 복원할 수 있다. 인터프리터가 필요로 하는 변수가 비활성화 상태로 되어 있을 경우에는, 베일아웃 엔진(336)은 변수의 상태를 비활성화 상태에서 활성화 상태로 변경함으로써 변수를 부활시킬 수 있다. 베일아웃 엔진(336)은 인터프리터(310)의 인스턴스를 인스턴스화할 수 있으며, 인터프리터를 최적화된 컴파일된 코드, 변수들 및 그들의 위치들에서의 베일아웃 포인트에 대응하는 바이트코드에서의 위치로 이동시킨다. 이런 이유로, 바이트코드가 발생된 소스 코드는 JIT 컴파일러(312) 및 기계 코드 실행기(316)의 작동에 의해 부분적으로 실행되는 한편, 인터프리터(310)에 의해 부분적으로 실행될 수 있다.
베일아웃들을 이용하면, 다수의 최적화가 가능할 수 있다. 많은 다이내믹 프로그래밍 언어들에서의 변수는 날짜, 문자열, 어레이, 정수 등일 수 있다. 일부 다이내믹 언어들에 있어서, 객체는 변수에 대하여 생성되고, 레지스터 및 후속 테이블에 저장된 위치는 객체에 대한 포인터(pointer)를 포함한다. 객체는 자체적으로 객체의 서술 및 객체에 대한 데이터를 저장할 수 있다. 따라서, 변수 a가 문자열이면, 객체는 문자열에 대하여 생성될 수 있고, 객체에 대한 포인터는 저장될 수 있으며, 객체는 자체적으로 변수 a가 문자열임을 식별할 수 있고 문자열 자체(예컨대, "Hello World")를 명시할 수 있다. 정수로 되는 프로파일 데이터에 기초하여 변수를 추정하는 경우에 대한 이 스키마의 최적화의 하나는 정수를 위해 생성된 객체에 대한 포인터 대신에 변수에서 정수 자체를 저장하거나, 또는 정수 객체를 나타내고 기술하기 위한 부호화된 값을 저장하려는 것이다. 정수 객체들을 직접 부호화하기 위한 스키마의 하나는 값이 정수임을 나타내는 인디케이터를 저장하기 위한 워드의 비트들 중 하나를 사용하는 것이다. 따라서, 32-비트 프로세서의 경우에 있어서, 32비트 중 1비트는 나머지 31비트의 콘텐츠가 정수 값을 나타냄을 가리킬 수 있거나, 또는 나머지 31비트의 콘텐츠가 정수 값을 나타내지 않음을 가리킬 수 있다.
도 1d는 본원에 개시된 요지의 양태들에 따라, 네이티브 모드에서의 실행으로부터 인터프리티드 모드에서의 실행으로 이행하는 것에 의해 네이티브 코드를 디버그할 수 있는 시스템(400)의 일례를 나타낸다. 시스템(400)의 전부 또는 일부는 도 3에 대하여 후술되는 컴퓨터들과 같은 하나 이상의 컴퓨터 또는 컴퓨팅 장치들에 상주할 수 있다. 시스템(400)은 본원에 개시된 바와 같은 디버거 등이 추가되어 있는 도 1b 및/또는 도 1c에 나타내진 바와 같은 시스템을 포함할 수 있다. 시스템(400) 또는 그 일부는 자립형 시스템으로서 또는 플러그-인 또는 애드-인으로서 제공될 수 있다. 시스템(400)은 도 4에 대하여 기술된 소프트웨어 개발 컴퓨터 상에서 전부 또는 부분적으로 실행될 수 있다. 시스템(400)의 전부 또는 일부는 프로그램 개발 툴들에 의해 작동될 수 있다. 예컨대, 시스템(400)의 전부 또는 일부는 도 4에 대하여 더욱 충분히 기술되는, 예컨대 IDE와 같은 통합 개발 환경(IDE) 내부에서 실행될 수 있거나, 또는 다른 IDE일 수 있다. 시스템(400)은 전적으로 또는 부분적으로 IDE 외부에서 실행될 수 있다. 시스템(400)은, 예컨대 Microsoft의 Internet Explorer®, Mozilla의 Firefox와 같은 브라우저, 또는 현재 공지되어 있거나 또는 장차 개발될 임의의 브라우저 내부에서 작동되거나 또는 연관될 수 있다. 시스템(400)이 브라우저 내부에서 작동하는 것 또는 브라우저와 연관되는 것에 제한되는 것은 아님을 인식할 것이다.
시스템(400) 또는 그 일부는 서비스로부터(예컨대, 클라우드에서) 얻은 정보를 포함할 수 있거나, 또는 클라우드 컴퓨팅 환경에서 작동할 수 있다. 클라우드 컴퓨팅 환경은 컴퓨팅 서비스들이 소유되어 있는 것이 아니라 주문시에 제공되는 환경일 수 있다. 예컨대, 정보는 네트워킹된 클라우드에서 다수의 디바이스에 상주할 수 있거나 및/또는 데이터는 클라우드 내부의 다수의 디바이스에 저장될 수 있다.
시스템(400)은 프로세서(142) 등과 같은 하나 이상의 프로세서와, 메모리(144)와, 그리고 하기의 것들, 즉 언어 컴파일러(404), JIT 컴파일러(408), 베일아웃 엔진(414), 디버거(416), 인터프리터(418) 및/또는 디버그 정보를 디스플레이할 수 있는 디버거 디스플레이(420) 중 하나 이상을 포함할 수 있다. 언어 컴파일러(404), JIT 컴파일러(408), 베일아웃 엔진(414), 디버거(416) 및 인터프리터(418)는, 메모리(144)에의 로딩시에, 하나 이상의 프로세서(142)로 하여금, 언어 컴파일러(404), JIT 컴파일러(408), 베일아웃 엔진(414), 디버거(416) 및/또는 인터프리터(418)에 제각기 기인하는 동작들을 수행하게 하는 하나 이상의 프로그램 모듈로서 구현될 수 있다. 시스템(400)은 도시되어 있지 않지만 본 기술분야에 공지되어 있는 다른 구성요소들을 포함할 수 있다.
도 1d에 도시된 바와 같이, 시스템(400)은 언어 컴파일러(404)와 같은 언어 컴파일러를 포함할 수 있다. 언어 컴파일러(404)는 특정 프로그래밍 언어로 기입된 소스 코드를 수신하고 그로부터 중간 언어(IL)(406)와 같은 중간 언어를 발생시키는 컴파일러일 수 있다. 소스 코드의 일부 또는 전부는 언어 컴파일러(404)에 의해 처리되어서 IL(406)과 같은 중간 언어 코드를 생성할 수 있다. 언어 컴파일러(404)는 소스 코드(402)와 같은 소스 코드 또는 그 일부를 수신할 수 있다. 소스 코드(402)는 임의의 프로그래밍 언어로 기입될 수 있다. 소스 코드(402) 또는 그 일부는 소스 코드(402)를 인터프리터(418)에 전송하는 것에 의해 해석될 수 있다. 따라서, 소스 코드(402)의 부분들은 컴파일될 수 있다. 소스 코드(402)의 부분들은 해석될 수 있다. 프로그램 부분이 컴파일되는지 또는 해석되는지의 여부는 성능 발견법(performance heuristics)에 기초할 수 있다: 즉 특정 프로그램 부분이 네이티브 모드에서 더 신속하게 가동하는 경우에는, 특정 프로그램 부분은 네이티브 모드로 컴파일될 수 있고, 특정 프로그램 부분이 인터프리티드 모드에서 더 신속하게 가동하는 경우에는, 특정 프로그램 부분은 해석될 수 있다.
도 1d에 도시된 바와 같이, 시스템(400)은 JIT 컴파일러(408)와 같은 JIT 컴파일러를 포함할 수 있다. JIT 컴파일러(408)는 IL(406)과 같은 중간 언어를 수신할 수 있으며, 그로부터 네이티브 코드(410)와 같은 네이티브 코드를 발생시킬 수 있다. 네이티브 코드(410)는 실행을 위해 프로세스(412)와 같은 프로세스에 로딩될 수 있다. JIT 컴파일러(408)는 JavaScript 컴파일러, VBScript 컴파일러, Python 컴파일러로서, 또는 본원의 어딘가에 언급된 또는 기타 공지된 다른 다이내믹 언어 또는 다이내믹 스크립팅 언어용 컴파일러로서 구현될 수 있다. JIT 컴파일러(408)는, 실행 전에 네이티브 코드를 전부 사전 컴파일하기보다는, 컴파일된 네이티브 코드가 필요해질 때(예컨대, 실행이 임박해 있을 때) 특정 프로그램 부분들을 JIT 컴파일러(408)에 의해 컴파일할 수 있기 때문에, "저스트 인 타임" 컴파일러라고 한다. JIT 컴파일러(408)는 기계 실행 가능 코드 또는 명령어들의 형태를 갖는 컴파일된 네이티브 코드를 발생시킬 수 있다.
JIT 컴파일러(408)는 상술한 바와 같은 추정에 기초하여 코드 최적화를 수행할 수 있다. JIT 컴파일러(408)는 그것이 발생시키는 컴파일된 코드에 하나 이상의 규정된 디버그 베일아웃 포인트를 삽입할 수 있다. 디버그 베일아웃 포인트는, 특정 디버그 베일아웃 조건이 충족되면, 네이티브 모드 디버깅이 인터프리티드 모드 디버깅으로 이행할 수 있는 프로그램에서의 위치이다. 함수의 시작, 루프의 백 에지, 함수 리턴시, 헬퍼 함수 또는 라이브러리에 대한 호출 리턴시, 또는 디버거 스테이트먼트와의 조우시와 같은 디버그 베일아웃 포인트가 프로그램에 대하여 규정될 수 있다. 디버그 베일아웃이 발생하면, 네이티브 코드의 실행이 중지될 수 있다. 네이티브 모드에서 실행되는 프로그램의 현재 상태는 현재의 실행 지점, 디버그 베일아웃 포인트 위치에 대응하는 소스 코드(402)에서의 위치, 변수 값들 및 레지스터에서 변수 값들이 놓이는 위치 및/또는 스택에서 변수 값들이 놓이는 위치를 기록할 수 있는 디버그 베일아웃 레코드에서 캡처될 수 있다. 그 디버그 베일아웃 포인트를 위한 디버그 베일아웃 레코드는 베일아웃 엔진에 건네질 수 있다.
도 1d에 도시된 바와 같이, 시스템(400)은 베일아웃 엔진(414)과 같은 베일아웃 엔진을 포함할 수 있다. 베일아웃 엔진(412)은 하나 이상의 디버그 베일아웃 레코드를 수신할 수 있다. 베일아웃 엔진(414)은 인터프리터가 필요로 하는 변수들의 상태(예컨대, 값)를 복원할 수 있다. 베일아웃 엔진(414)은 스택을 위한 새로운 프레임을 생성할 수 있다. 인터프리터가 필요로 하는 변수가 비활성화 상태로 되어 있을 경우에는, 베일아웃 엔진(414)은 변수의 상태를 비활성화 상태에서 활성화 상태로 변경함으로써 비활성화 변수를 부활시킬 수 있다. 베일아웃 엔진(414)은 인터프리터(418)의 인스턴스를 인스턴스화할 수 있으며, 인터프리터를 네이티브 코드 및 복원된 활성화 변수들 모두의 값들을 포함하는 새롭게 생성된 인터프리터 프레임에서의 디버그 베일아웃 포인트에 대응하는 소스 코드에서의 위치로 이동시킨다. 디버그 베일아웃 위치가 함수와 같은 코드 구간 내에 놓이면, 인터프리티드 모드에서 디버깅을 재개하는 지점은 상기 코드 구간의 시작에 있을 수 있다(예컨대, 디버깅은, 디버그 베일아웃 포인트가 조우했던 지점을 대신하여 함수의 시작에서 재개할 수 있음).
디버그 베일아웃이 기동되면, 네이티브 코드의 디버깅이 중지할 수 있다. 네이티브 코드의 실행이 중지할 수 있다. 현재 실행 지점, 변수 값들 및 변수 값들이 놓이는 위치를 기록하는 디버그 베일아웃 레코드에서 상태가 캡처될 수 있다. 변수 값들은 CPU 레지스터들에 저장될 수 있거나 또는 네이티브 스택 상에 저장될 수 있다. 그 베일아웃 포인트에 대한 디버그 베일아웃 레코드는 베일아웃 엔진(414)에 건네질 수 있다. 베일아웃 엔진(414)은 인터프리터를 위해 생성되는 스택 상에서 인터프리터가 필요로 하는 변수들의 상태(예컨대, 값)를 복원할 수 있다. 베일아웃 엔진(414)은 스택을 위한 새로운 인터프리터 프레임을 생성할 수 있다. 인터프리터가 필요로 하는 변수가 비활성화 상태로 되어 있을 경우에는, 베일아웃 엔진(414)은 변수의 상태를 비활성화 상태에서 활성화 상태로 변경함으로써 변수를 부활시킬 수 있다. 베일아웃 엔진(414)은 인터프리터(418)의 인스턴스를 인스턴스화할 수 있으며, 인터프리터를 네이티브 코드 및 복원된 활성화 변수들 모두의 값들을 포함하는 새롭게 생성된 인터프리터 프레임에서의 디버그 베일아웃 포인트에 대응하는 소스 코드에서의 위치로 이동시킨다.
도 1d에 도시된 바와 같이, 디버거(416)와 같은 디버거는 디버깅을 위한 네이티브 코드를 수신할 수 있다. 본원에 개시된 바와 같은 디버거는 네이티브 모드에서 가동할 수 있으며, 이는 디버거가 네이티브 코드에 대한 디버그 작업들을 수행할 수 있다는 것을 의미한다. 본원에 개시된 요지의 일부 양태에 따른 디버거는 프로그램 변수들의 현재 값들 및 스택 정보를 디버거 디스플레이 상에 디스플레이하기 위해 제공할 수 있다. 변수들의 검사, 표현 평가 및 값들의 수정을 포함하는 디버깅 작업들은 호출 스택에서 네이티브 프레임을 이용할 수 있다. 변수가 레지스터에 저장될 때마다(예컨대, 변수가 프로그램에서 규정되는 경우), 함수를 위한 스택 위치에 현재값도 저장될 수 있다. 특정한 로컬 변수의 값의 위치의 추적을 유지하기 위해, 본원에 개시된 요지의 양태들에 따라, 로컬 변수가 규정될 때마다(즉, 로컬 변수에 값이 할당되는 경우), 로컬 변수가 스택 위치에 기입될 수 있다. 함수를 위한 로컬 변수들에 사용되는 스택 위치들은, 함수를 위한 로컬 변수들이 발견될 수 있는 하나의 스택 구역이 존재하도록 함께 그룹화될 수 있다. 따라서, 네이티브 코드가 변수를 위해 레지스터를 이용하고 있는 경우에도, 특정 함수를 위한 임의의 로컬 변수의 현재값은 항상 상응하는 스택 위치에 있다. 스택의 동일 영역은 스필링을 위해 사용될 수 있다(즉, 컴퓨팅 장치가 레지스터들을 구비하는 것보다 더 라이브한 변수들이 존재하는 경우에, 변수들은 레지스터들로부터 메모리로 "스필링"될 수 있음). 스택 위치들은 변수들의 값들을 취해서 변경하기 위해 디버거에 의해 이용될 수 있다. 디버거에서 값들의 수정을 지원하기 위해, 인디케이터는 로컬 변수들이 저장되는 스택의 영역에 인접하여 놓일 수 있다. 인디케이터는, 세팅시에, 디버깅되는 함수에서의 로컬 변수가 사용자에 의해 변경되었음을 가리키는 플래그일 수 있다. 디버깅된 함수는 최상위 스택 프레임에 대한 함수 또는 하위의 스택 프레임에서의 함수일 수 있다. 예컨대, 중단 지점과 조우한다고 가정한다. 사용자는, 네이티브 모드에서 함수를 실행하는 동안, 현재의 스택 프레임이 아닌 스택 프레임과 연관된 함수에 속하는 로컬 변수의 값을 변경할 수 있다. 함수에서 로컬 변수가 변경되어 있음을 가리키는 플래그는 사용자에 의해 로컬 변수가 변경된 함수와 연관된 스택 프레임에서 세팅될 것이다.
함수 메타데이터는 얼마나 많은 로컬 변수가 함수에서 사용되는지에 관련된 정보를 포함한다. 본원에 개시된 요지의 일부 양태들에 따라, 로컬 변수의 값을 취하기 위해, 디버거는 로컬 변수의 식별자와 동일한 스택에서의 시작 위치로부터 오프셋된 곳에 상주하는 스택 위치들에서의 값을 판독함으로써 로컬 변수의 값을 판정할 수 있다. 로컬 변수의 값을 변경하기 위해, 디버거는 새로운 값을 상응하는 스택 위치에 기입할 수 있고, 변경된 로컬 변수 플래그(로컬 변수들이 저장될 수 있는 영역 바로 옆의 스택 상에 놓임)를 세팅해서 함수에서의 로컬 변수가 변경되었음을 가리킬 수 있다.
네이티브 모드에서 가동하는 함수로 실행이 리턴할 때, 베일아웃 엔진은 변경된 로컬 변수 플래그를 검사할 수 있다. 실행이 리턴하는 함수에 대응하는 스택 프레임에 대하여 로컬 변수 값이 변경되었을 경우에는, 플래그가 세팅될 것이고, 인터프리티드 모드에 대한 베일아웃이 기동될 것이다. 베일아웃 동안, 로컬 변수들의 값들은 (레지스터들을 대신하여) 스택 위치들로부터 복원될 수 있으며, 인터프리티드 모드에서 가동하는 디버거는 수정된 로컬 변수가 변경된 값을 수신할 것이다.
디버거는 디버그 베일아웃 포인트를 호출한 프로그램에서의 규정된 지점에서 네이티브 모드에서의 실행으로부터 인터프리티드 모드에서의 실행으로 이행할 수 있다. 디버그 베일아웃 포인트는 하기의 지점들, 즉 함수의 시작, 루프의 백 에지(예컨대, 카운터가 증분되고 범위 밖에 있는 것에 대하여 카운터가 검사된 후), 호출로부터 함수로의 리턴시, 호출로부터 라이브러리로의 리턴시, 호출로부터 헬퍼 함수로의 리턴시, 디버거 언어 스테이트먼트와의 조우시 등을 포함하지만, 이들에 한정되는 것은 아니다. 본원에 개시된 바와 같은 디버거는 인터프리티드 모드에서 가동할 수 있다. 인터프리티드 모드에서는, 디버거가 인터프리티드 코드를 디버그할 수 있다. 예컨대, 디버그되는 프로그램의 실행을 컨트롤하는 디버그 작업들은 인터프리티드 모드에서 가동할 수 있다. 실행 컨트롤 작업들은 비동기 중단, 스테핑, 중단 지점, 및/또는 예외 중단 작업들에 의해 구현될 수 있다.
비동기 중단은, 예컨대 디버그 세션에서 사용자가 (예컨대, 디버거 사용자 인터페이스에서 일시정지(pause) 옵션을 활성화함으로써) 실행을 일시정지할 때 발생할 수 있다. 일시정지는 언제라도 발생할 수 있다. 디버거는 사용자 동작 이후의 적당한 시간에 프로그램의 실행을 중단할 것으로 예상되기 때문이다. 사용자 동작에 대하여 시기적절하게 응답을 제공하는 것은, 함수의 시작, 루프 등(이들에 한정되는 것은 아님)을 포함하는 코드에서의 위치들에서 검사를 삽입함으로써 행해질 수 있다. 응답에 있어서, 디버거는 세팅시에 네이티브 모드 디버깅으로부터 인터프리티드 모드 디버깅으로 이행을 강제하는 이행 플래그를 세팅할 수 있다. 프로세스에서 각각의 스레드(thread)에 대하여 하나의 이행 플래그가 제공될 수 있다. 네이티브 코드의 실행이 함수에 진입하거나 또는 루프의 개시로 진행하는 경우에는, 이행 플래그가 검사될 수 있다. 이행 플래그가 세팅되면, 디버그 베일아웃이 기동될 수 있고, 실행이 네이티브 모드 디버깅으로부터 인터프리티드 모드 디버깅으로 이행할 수 있다. 함수와 유사한 소스 코드는 검색되어서 인터프리터에게 전송될 수 있다. 디버거는 비동기 중단을 검출할 수 있으며 이행 플래그를 소거할 수 있다. 비동기 중단은 실행을 중단(중지)하는 것 및 디버거 디스플레이 상에 현재의 프로그램 상태를 디스플레이하는 것에 의해 완료될 수 있다.
스텝 작업은 함수를 스텝 인투하거나, 함수를 스텝 아웃하거나, 또는 함수 또는 명령을 스텝 오버하는 사용자-지향적(user-directed) 동작일 수 있다. 각각의 스텝 디버그 작업의 시작시에, 디버거는 스텝 타입 플래그 및 스텝 프레임 베이스 플래그를 세팅할 수 있다. 스텝 프레임 베이스 플래그는 현재의 함수 스택 프레임 베이스로 세팅될 수 있다. 스텝 프레임 플래그는 스택 깊이를 검사해서 귀환을 검출하는 데 사용될 수 있다. 본원에 개시된 요지의 일부 양태에 따르면, 스텝 작업이 스택 상에서 개시했을 때와 같이, 실행해도 프레임의 상부에서 동일한 함수가 남아 있을 때에는, 인터프리터 모드로의 이동은 행해지지 않는다. 예컨대, 현재 위치가 함수 A에 있는 것을 고려하면, 사용자는 스텝 아웃하려 해서 함수 A의 호출자인 함수 B로 리턴하게 된다. 스텝이 개시될 때 함수 A의 원래의 스택 프레임이 여전히 스택 상에 있는 상태에서, 컨트롤이 함수 A 또는 함수 B로 또는 다른 함수로 복귀할 때, 함수 A가 함수 A 또는 함수 B일 수 있는 다른 함수를 호출하면, 디버그 베일아웃은 기동되지 않는다.
스텝 아웃 작업을 위해, 디버거는 스텝 타입 플래그를 스텝 아웃으로 세팅할 수 있다. 프로그램 실행은 재개할 수 있다. 실행이 현재의 함수로부터 네이티브 모드에서 실행하는 다른 함수로 리턴하는 경우에, 베일아웃 엔진은 스텝 타입 플래그 및 스텝 프레임 플래그가 세팅되는지를 판정할 수 있다. 그런 경우에, 현재의 스택 프레임 베이스는 스텝 프레임 플래그에 저장된 값과 비교될 수 있다. 현재의 스택 프레임 베이스가 스텝 프레임 플래그에 저장된 값보다 큰 경우에는, 어드레스들이 더 적은 쪽으로 스택이 성장한다고 상정하면, 스택 깊이는 감소해 있다. 스택 깊이의 감소에 응답하여, 인터프리터 모드로의 베일아웃이 기동될 수 있다. 디버거는 인터프리티드 코드의 디버깅으로 이행할 수 있다. 실행은 중지할 수 있으며, 현재의 프로그램 상태는 디버거 디스플레이에 디스플레이될 수 있다.
네이티브 코드가 네이티브 모드에서 실행하는 다른 함수에 진입하는 경우이거나, 또는 스텝 인 작업이 결국 함수로부터 리턴하게 되는 함수의 최종 스테이트먼트 상에서 이루어졌으면, 이들 플래그들에 대한 베일아웃 검사가 발생하고, 인터프리터 모드 디버깅으로의 베일아웃이 기동된다. 디버거는 인터프리티드 모드에서 작동하고, 디버거 디스플레이 상에 현재의 프로그램 상태를 디스플레이할 수 있다.
스텝 오버 디버그 작업에 대하여, 스텝 오버로의 함수는 인터프리터 모드에서 가동하도록 강제되지 않고, 통상 네이티브 모드에서 가동한다. 베일아웃은 스텝 작업이 현재의 함수의 최종 스테이트먼트에 대한 것이어서 결국 함수로부터의 리턴으로 되었을 경우에만 기동될 수 있다. 스택 깊이의 감소에 응답하여, 인터프리터 모드 디버깅으로의 베일아웃이 기동된다. 디버거는 디버거 디스플레이 상에 현재의 프로그램 상태를 디스플레이할 수 있다.
사용자가 함수에서 중단 지점을 세팅하는 경우에, 디버거는 함수에서 중단 지점들의 수를 추적하는 카운터를 증분함으로써 함수 메타데이터를 갱신할 수 있다. 함수가 실행되는 경우에(함수가 실행을 개시하거나, 또는 함수가 다른 함수를 호출하고, 호출된 함수가 호출한 함수로 복귀), 디버그 베일아웃을 기동하는 조건들이 검사된다. 현재의 함수에 대한 중단 지점 카운트가 영(0)보다 크면, 디버그 베일아웃이 기동될 수 있으며, 디버거는 인터프리티드 모드에서의 실행으로 이행할 수 있다. 디버거는 중단 지점이 세팅되는 스테이트먼트에서 중지할 수 있으며, 디버거 디스플레이 상에 현재의 실행 지점을 디스플레이할 수 있다.
예외/예외 이후의 지속에 대한 중단 지점과 조우하면, 디버거 하에서 가동하는 프로그램은 예외 이벤트를 디버거에 통신할 수 있으며, 예외를 야기한 스테이트먼트 이후의 다음 스테이트먼트로부터 실행을 지속할 수 있거나, 또는 실행을 특정 스테이트먼트에서 재개해서 그 스테이트먼트로부터 지속하도록 세팅할 수 있다. 디버거에 통지하기 위해, 네이티브 코드는 "스로잉 헬퍼(throwing helper)" 함수를 이용할 수 있기 때문에, 모든 스로우(throw)는 그것을 경유한다. 디버거는 예외를 스로우한 스테이트먼트에서 중지할 수 있으며, 디버거 디스플레이 상에 변수들의 값들을 디스플레이할 수 있다.
다음 스테이트먼트로 지속하기 위해, (예외가 스로우되었을 때 프로그램이 네이티브 모드에서 가동하고 있었을 경우), 컴파일러는 예외가 발생할 수 있는 곳의 프로그램에서 모든 위치를 식별할 수 있다. 예외들은, 헬퍼 함수에 대하여 호출이 이루어지는 경우 또는 라이브러리 함수에 대하여 호출이 이루어지는 경우에, 명시적인 스로우 스테이트먼트에 의해 스로우될 수 있다. 예컨대, 객체로부터 속성을 삭제하는 JavaScript 삭제 스테이트먼트는, 객체가 널(null) 또는 미규정(undefined)인 경우에 예외를 스로우할 수 있다. 예외는, 널 또는 미규정 객체가 어떠한 속성도 갖고 있지 않기 때문에 스로우된다. 여기서, "헬퍼(helper)"는 언어로(예컨대, JavaScript 엔진으로), 통상적으로는 네이티브 코드로 구현되는 함수를 의미하고, 객체로부터 속성을 삭제하는 등의 일부 작업 또는 언어 구성을 수행하는 데 사용된다. "라이브러리 함수(library function)"는 라이브러리 루틴을 수행하는 함수를 의미한다. 예컨대, JavaScript는 "문자열(string)"과 같은 다수의 라이브러리 객체를 갖는다. "문자열" 객체는, 예컨대 string.concat을 포함하는 다수의 작업을 갖는다. string.concat은 순수한 언어 루틴은 아니다. 일부 언어에 있어서, 라이브러리 함수와 헬퍼 함수를 구별하는 것은 적합하지 않을 수 있고, 제한하려는 것은 아니지만 JavaScript와 같은 일부 언어에 있어서는, 양 함수는 하기의 관점에서 상이하다: 즉 라이브러리 호출은 기술적으로 스크립트(즉, 사용자) 함수 호출과 동일하기 때문에 인터셉트될 수 있다. 예컨대, 사용자는 스크립트 함수를 string.concat에 할당할 수 있다. 다음번의 string.concat이 호출되고, 엔진은 원래의 string.concat 함수를 대신하여 재할당된 사용자 함수를 호출할 것이다. 헬퍼 함수는 인터셉트될 수 없으며, 네이티브/컴파일된 코드로 직접 호출되는 것이 보통이다.
네이티브 코드에서 예외가 발생한 후에 지속하기 위해, 각각의 헬퍼 호출 및 각각의 라이브러리 호출을 트라이-캐치(try-catch) 스테이트먼트 블록으로 랩핑할 수 있다. 트라이-캐치의 "트라이(try)" 부분에 있어서는, 헬퍼 함수가 호출될 수 있다. 원래의 헬퍼 함수에 의해 리턴된 값들은 로컬 변수로 저장될 수 있다. 트라이-캐치 블록의 "캐치(catch)" 부분에 있어서는, "예외 후 지속(continue after exception)" 옵션이 인터프리티드 모드 디버거에서 이네이블로 되면, 예외 및 지속 플래그가 세팅될 수 있다. 트라이-캐치 블록의 "캐치" 부분 이후에는, 원래의 헬퍼의 값이 리턴될 수 있다. 예외 이후의 지속에 대한 디버그 베일아웃 검사는 각각의 호출로부터 헬퍼 함수 호출로의 각각의 리턴 이후에 또는 호출로부터 라이브러리로의 각각의 리턴 이후에 삽입될 수 있다. 디버그 베일아웃 검사는 예외 및 지속 플래그를 검사할 수 있으며, 플래그가 세팅되면, 인터프리터 모드에 대한 디버그 베일아웃을 기동할 수 있다. 디버거는 디버거 내부에서 실행 컨트롤을 지속할 수 있게 하는 인터프리터 모드로 이행할 수 있다. 예컨대, "예외 중단(break on exception)"에 대한 사용자 응답이 명령어를 스텝 오버하라는 것이었으면, 디버거는 다음 스테이트먼트로 스테핑하게 된다. "예외 중단"에 대한 사용자 응답이 지속하라는 것이었으면, 디버거는 인터프리티드 모드에서 나머지 함수의 실행을 지속하게 된다.
디버거는 디버그 정보를 디버거 디스플레이(420)와 같은 디버거 디스플레이 디바이스 상에 디스플레이할 수 있다. 디버거는 호출 스택, 로컬 변수 값들 등으로부터의 정보를 디버거 디스플레이 상에 디스플레이할 수 있다.
도 2는 본원에 개시된 요지의 양태들에 따라 네이티브 모드 디버깅으로부터 인터프리티드 모드 디버깅으로 이행할 수 있는 방법(250)을 나타낸다. 도 2에 기술된 방법은 도 1d에 대하여 기술된 것과 같은 시스템에 의해 실시될 수 있지만, 이것에 한정되는 것은 아니다. 방법(250)은 시퀀스대로 수행되는 일련의 작업들을 기술하지만, 방법(250)이 시퀀스의 순서에 한정되지 않음을 이해해야 한다. 예를 들어, 일부 작업들은 기술된 것과는 다른 순서로 발생할 수 있다. 또한, 하나의 작업이 다른 작업과 동시에 발생할 수 있다. 일부 예시에 있어서는, 기술된 모든 작업을 수행하지 않는다.
작업에 있어서, 도 1d에 기술된 시스템과 같은 시스템은 하기와 같이 작동할 수 있다. 작업(251)에서는, 디버그 베일아웃 포인트가 프로그램에 대하여 규정될 수 있다. 디버그 베일아웃 포인트는 네이티브 모드 디버깅으로부터 인터프리티드 모드 디버깅으로의 이행이 발생할 수 있는 프로그램에서의 지점이다. 디버그 베일아웃 포인트는 하기의 지점들, 즉 함수의 시작, 루프의 백 에지(예컨대, 카운터가 증분되고 범위 밖에 있는 것에 대하여 카운터가 검사된 후), 호출로부터 함수로의 리턴시, 호출로부터 라이브러리로의 리턴시, 호출로부터 헬퍼 함수로의 리턴시, 디버거 언어 스테이트먼트와의 조우시 등을 포함하지만, 이들에 한정되는 것은 아니다. 프로그램이 컴파일되는 경우에는, 디버그 베일아웃 포인트에서 디버그 프로세싱이 삽입될 수 있다.
작업(252)에서, 디버그 세션이 개시될 수 있다. 디버그 세션이 개시되는 경우에, 디버거가 부착되는 프로세스에서 가동하는 프로그램에 대하여 미리 발생된 임의의 네이티브 코드는 폐기될 수 있다. 작업(254)에서, 디버그-모드 네이티브 코드는 디버거가 부착되는 프로그램으로부터 발생될 수 있다. 디버그-모드 네이티브 코드는 디버깅 네이티브 코드로부터 디버깅 인터프리티드 코드로의 이행과 연관된 프로세싱을 포함할 수 있다. 디버그-모드 네이티브 코드는 프로세스에 로딩될 수 있다. 함수가 디버그 모드에서 네이티브 코드로 컴파일되는 경우에는, 함수에서의 각각의 베일아웃 포인트에서, 하나 이상의 베일아웃 조건 검사가 네이티브 코드에 삽입될 수 있다. 베일아웃 조건 검사들은 프로그램의 내부 네이티브 표시를 발생시키는 컴파일 단계 도중에 삽입될 수 있다. 베일아웃 조건 검사들은 베일아웃 레코드를 위한 데이터가 캡처될 때 코드에 삽입될 수 있다. 베일아웃 조건 검사들은 디버거에 의해 컨트롤되는 다양한 플래그들 또는 인디케이터들의 스테이터스(세트 또는 언세트) 또는 값들을 검사하는 것을 수반할 수 있다.
디버그 베일아웃 인디케이터들 또는 플래그들은 하기의 것들, 즉 세팅시에 디버거가 네이티브 모드로부터 인터프리티드 모드로 이행하는 것을 가리키는 인디케이터, 세팅시에 함수가 그 안에 중단지점을 갖는 것을 가리키는 인디케이터, 귀환을 검출하기 위해 스택 어드레스를 지정하는 인디케이터, 수행될 스텝 작업의 타입을 가리키는 인디케이터, 세팅시에 디버거가 수행하는 스텝 작업의 타입(스텝 인, 스텝 아웃, 스텝 오버)을 가리키는 인디케이터, 세팅시에 현재의 스택 프레임에서 필드가 변경되었음은 가리키는 스택 상의 인디케이터 및 세팅시에 명시적인 무조건적 베일아웃을 인젝팅하는 데 사용되는 인디케이터를 포함할 수 있지만, 이것들에 한정되는 것은 아니다.
작업(256)에서, 네이티브 코드는 디버그 모드에서 실행될 수 있다. 실행이 디버그 베일아웃 포인트에 도달하는 경우에는, 다양한 베일아웃 조건들이 검사될 수 있다. 한가지 타입의 디버그 베일아웃 시나리오에 대하여 검사된 베일아웃 조건들은 다른 타입들의 베일아웃들에 대하여 검사된 베일아웃 조건들과는 상이할 수 있다. 예컨대, (루프에 대하여 카운터가 증분되고, 범위 내에 있는 것에 대하여 카운터가 검사될 때) 사용자가 함수의 시작 또는 루프의 백 에지에서 디버거 하에서 가동하는 프로그램의 실행을 일시정지한다고 가정한다. 함수의 시작 또는 루프의 백 에지에서 삽입된 네이티브 코드가 인터프리터 모드에 대하여 네이티브 코드를 베일아웃하도록 강제하는 플래그가 세팅되는지를 검사해서 확인하면, 디버거는 인터프리터 모드에 대하여 네이티브 코드를 베일아웃하도록 강제하는 플래그를 세팅할 수 있다. 대신에, 디버거 UI에서 함수에 스텝 인투하는 옵션을 사용자가 선택한다고 가정한다. 디버거는 어떤 타입의 스텝 작업이 요청되었는지를 가리키는 스텝 플래그를 세팅할 수 있다. 네이티브 코드에 의해 수행된 검사는 스텝 플래그의 값이 "스텝 인(step in)"으로 세팅되는지를 판정하는 것에 응답하여 베일아웃할 수 있다. 사용자 동작이 함수에서의 어딘가에 중단지점을 배치한다고 가정한다. 디버거는 함수에서의 중단지점들의 수의 추적을 유지하는 플래그를 증분할 수 있다. 현재의 함수에서의 중단 지점 카운트가 영보다 크면, 베일아웃이 기동되고, 실행이 인터프리티드 모드로 진행한다.
실행이 중단 지점을 갖는 프레임에 도달하는 경우에는, 네이티브 코드에서의 프로그램의 실행이 중지하고, 베일아웃 엔진은 디버그 베일아웃 레코드를 수신하며, 함수는 인터프리터로 전송되고, 인터프리티드 함수의 디버깅은 함수의 시작부터 지속된다. 작업(258)에서 적어도 하나의 베일아웃 조건이 충족되어 있다는 판정에 응답하여, 작업(260)에서는, 네이티브 모드에서의 디버깅이 중지할 수 있고, 디버깅이 인터프리티드 모드로 이행할 수 있다. 네이티브 코드의 디버깅으로부터 상응하는 인터프리티드 코드의 디버깅으로의 이행은 사용자 개시 동작에 의해 기동될 수 있거나, 또는 명시적인 무조건적 베일아웃과 조우할 때 기동될 수 있다.
작업(262)에서, 인터프리터 변수들은 베일아웃 레코드로부터 복원될 수 있다. 임의의 베일아웃 조건이 충족되면, 실행 상태(변수들의 위치 및 값, 일시적 변수들의 위치 및 값, 및 스택 값들)의 스냅샷은 디버그 베일아웃 레코드에서 만들어져서 지속될 수 있다. 디버그 베일아웃 레코드는 베일아웃 엔진에 전송될 수 있다. 베일아웃 엔진은 인터프리터의 인스턴스를 인스턴스화할 수 있으며, 인터프리터에 대하여 인터프리터 스택 프레임을 설정할 수 있다. 작업(264)에서는, 인터프리티드 모드에서 디버깅이 재개할 수 있다. 작업(258)에서 베일아웃 조건이 검출되지 않으면, 작업(266)에서는 네이티브 모드에서 디버깅을 지속할 수 있다.
적절한 컴퓨팅 환경의 예(Example of a Suitable Computing Environment)
본원에 개시된 요지의 다양한 양태들에 대한 맥락을 제공하기 위해, 도 3 및 하기의 논의는 본원에 개시된 요지의 다양한 실시예들이 구현될 수 있는 적절한 컴퓨팅 환경(510)의 간단한 일반적인 기재를 제공하려는 것이다. 본원에 개시된 요지가 하나 이상의 컴퓨터 또는 다른 컴퓨팅 장치들에 의해 실행된 프로그램 모듈들과 같은 컴퓨터-실행 가능 명령어들의 일반적인 맥락에서 기술되어 있지만, 본 기술분야의 숙련자라면, 본원에 개시된 요지의 부분들이 다른 프로그램 모듈들과 조합하여 및/또는 하드웨어와 소프트웨어의 조합으로 구현될 수도 있다는 점을 인식할 것이다. 일반적으로, 프로그램 모듈들은 특정한 태스크들을 수행하거나 또는 특정한 데이터 타입들을 구현하는 루틴, 프로그램, 객체, 물리적인 인공물, 데이터 구조 등을 포함한다. 통상적으로, 프로그램 모듈들의 기능성은 다양한 실시예들에서 바람직하게 결합되거나 또는 분배될 수 있다. 컴퓨팅 환경(510)은 적절한 작업 환경의 일례일 뿐이며, 본원에 개시된 요지의 이용 범위 또는 기능성을 한정하려는 것이 아니다.
도 3을 참조하여, 컴퓨터(512) 형태의 컴퓨팅 장치를 기술한다. 컴퓨터(512)는 적어도 하나의 프로세싱 유닛(514), 시스템 메모리(516), 및 시스템 버스(518)를 포함할 수 있다. 적어도 하나의 프로세싱 유닛(514)은, 한정되는 것은 아니지만, 시스템 메모리(516)와 같은 메모리에 저장되는 명령어들을 실행할 수 있다. 프로세싱 유닛(514)은 다양한 가용 프로세서들 중 어느 하나일 수 있다. 예컨대, 프로세싱 유닛(514)은 그래픽 처리 유닛(GPU)일 수 있다. 명령어들은 상술한 하나 이상의 구성요소들 또는 모듈들에 의해 수행되는 기능성을 구현하는 명령어들이거나 또는 상술한 방법들 중 하나 이상의 방법을 구현하는 명령어들일 수 있다. 듀얼 마이크로프로세서들 및 다른 멀티프로세서 아키텍처들도 프로세싱 유닛(514)으로서 채용될 수 있다. 컴퓨터(512)는 디스플레이 스크린 상에서 그래픽들의 렌더링을 지원하는 시스템에서 사용될 수 있다. 다른 예에 있어서, 컴퓨팅 장치의 적어도 일부는 그래픽 프로세싱 유닛을 포함하는 시스템에서 사용될 수 있다. 시스템 메모리(516)는 휘발성 메모리(520) 및 비휘발성 메모리(522)를 포함할 수 있다. 비휘발성 메모리(522)는 ROM(read only memory), PROM(programmable ROM), EPROM(electrically programmable ROM) 또는 플래시 메모리를 포함할 수 있다. 휘발성 메모리(520)는 외부 캐시 메모리로서 작용할 수 있는 RAM(random access memory)을 포함할 수 있다. 시스템 버스(518)는 시스템 메모리(516)를 포함하는 시스템 물리적 인공물들을 프로세싱 유닛(514)에 결합한다. 시스템 버스(518)는 메모리 버스, 메모리 컨트롤러, 주변 장치 버스, 외부 버스, 또는 로컬 버스를 포함하는 몇 가지 타입들 중 어느 하나일 수 있으며, 임의의 다양한 가용 버스 아키텍처들을 이용할 수 있다. 컴퓨터(512)는 시스템 버스(518)를 거쳐 프로세싱 유닛(514)에 의해 액세스 가능한 데이터 스토어를 포함할 수 있다. 데이터 스토어는 그래픽 렌더링을 위해 실행 가능 명령어, 3D 모델, 재료, 텍스처 등을 포함할 수 있다.
컴퓨터(512)는 휘발성 및 비휘발성 매체, 외장형 및 내장형 매체와 같은 다양한 컴퓨터 판독 가능 매체를 포함하는 것이 보통이다. 컴퓨터 판독 가능 매체는 컴퓨터 판독 가능 명령어, 데이터 구조, 프로그램 모듈 또는 다른 데이터와 같은 정보의 저장을 위해 임의의 방법 또는 기법으로 구현될 수 있다. 컴퓨터 판독 가능 매체는 컴퓨터-판독 가능 스토리지 매체(컴퓨터 스토리지 매체라고도 함) 및 통신 매체를 포함한다. 컴퓨터 스토리지 매체는 원하는 데이터를 저장할 수 있는 한편, 컴퓨터(512)에 의해 액세스될 수 있는 RAM, ROM, EEPROM, 플래시 메모리 또는 다른 메모리 기술, CDROM, DVD(digital versatile disks) 또는 다른 광 디스크 스토리지, 자기 카세트, 자기 테이프, 자기 디스크 스토리지 또는 다른 자기 스토리지 디바이스와 같은 물리적 (유형의) 매체를 포함하지만, 이들에 한정되는 것은 아니다. 통신 매체는 원하는 정보를 통신하는 데 사용될 수 있는 한편, 컴퓨터(512)에 의해 액세스될 수 있는 통신 신호, 변조된 반송파 또는 임의의 다른 무형의 매체와 같은 매체를 포함하지만, 이들에 한정되는 것은 아니다.
도 3은 사용자들과 컴퓨터 리소스들 사이에서 중개자로서 작용할 수 있는 소프트웨어를 기술한다는 점을 인식할 것이다. 이 소프트웨어는 디스크 스토리지(524)에 저장될 수 있으며 컴퓨터(512)의 리소스들을 할당할 수 있는 오퍼레이팅 시스템(528)을 포함할 수 있다. 디스크 스토리지(524)는 인터페이스(526)와 같은 내장형 메모리 인터페이스를 통해 시스템 버스(518)에 접속되는 하드 디스크 드라이브일 수 있다. 시스템 애플리케이션(530)은 시스템 메모리(516) 또는 디스크 스토리지(524)에 저장되는 프로그램 모듈(532) 및 프로그램 데이터(534)를 통해 오퍼레이팅 시스템(528)에 의해 리소스들의 관리의 장점을 취한다. 컴퓨터들이 다양한 오퍼레이팅 시스템들 또는 오퍼레이팅 시스템들의 조합들로 구현될 수 있음을 인식할 것이다.
사용자는 커맨드 또는 정보를 입력 디바이스(들)(536)를 통해 컴퓨터(512)에 입력할 수 있다. 입력 디바이스들(536)은 마우스, 트랙볼, 스타일러스, 터치 패드, 키보드, 마이크로폰, 음성 인식 및 동작 인식 시스템 등과 같은 포인팅 디바이스를 포함하지만, 이들에 한정되는 것은 아니다. 이들 및 다른 입력 디바이스들은 인터페이스 포트(들)(538)를 거쳐서 시스템 버스(518)를 통해 프로세싱 유닛(514)에 접속된다. 인터페이스 포트(들)(538)는 직렬 포트, 병렬 포트, 범용 직렬 버스(USB) 등을 나타낼 수 있다. 출력 디바이스(들)(540)는 입력 디바이스들과 동일한 타입의 포트들을 이용할 수 있다. 출력 어댑터(542)는 특정한 어댑터를 필요로 하는 모니터, 스피커 및 프린터와 같은 몇몇 출력 디바이스(540)가 존재한다는 것을 설명하기 위해 제공된다. 출력 어댑터(542)는 출력 디바이스(540)와 시스템 버스(518) 사이에 접속을 제공하는 비디오 카드 및 사운드 카드를 포함하지만, 이들에 한정되는 것은 아니다. 다른 디바이스들 및/또는 시스템들 또는 원격 컴퓨터(들)(544)과 같은 디바이스들은 입력 및 출력 능력을 제공할 수 있다.
컴퓨터(512)는 원격 컴퓨터(들)(544)와 같은 하나 이상의 원격 컴퓨터에 논리 접속을 이용하여 네트워킹된 환경에서 작동할 수 있다. 원격 컴퓨터(544)는 퍼스널 컴퓨터, 서버, 라우터, 네트워크 PC, 피어(peer) 디바이스 또는 다른 공통 네트워크 노드일 수 있으며, 도 3에서는 메모리 스토리지 디바이스(546)만이 예시되어 있지만, 통상적으로 컴퓨터(512)에 관하여 상술한 다수의 또는 모든 요소를 포함한다. 원격 컴퓨터(들)(544)는 통신 접속부(들)(550)를 거쳐서 논리적으로 접속될 수 있다. 네트워크 인터페이스(548)는 로컬 에어리어 네트워크(LANs) 및 와이드 에어리어 네트워크(WANs)와 같은 통신 네트워크들을 포괄하지만, 다른 네트워크들을 포함할 수도 있다. 통신 접속부(들)(550)는 네트워크 인터페이스(548)를 버스(518)에 접속하는 데 이용되는 하드웨어/소프트웨어를 의미한다. 통신 접속부(들)(550)는 컴퓨터(512)에 대하여 내장으로 또는 외장으로 될 수 있으며, 모뎀(전화, 케이블, DSL 및 무선) 및 ISDN 어댑터, Ethernet(이더넷) 카드 등과 같은 내장 및 외장 기법들을 포함할 수 있다.
도시된 네트워크 접속은 예시일 뿐이며, 컴퓨터들 사이에 통신 링크를 확립하는 다른 수단을 이용할 수 있음을 인식할 것이다. 본 기술분야의 숙련자라면, 컴퓨터(512) 또는 다른 클라이언트 디바이스가 컴퓨터 네트워크의 일부로서 배치될 수 있음을 인식할 수 있다. 이와 관련하여, 본원에 개시된 요지는 임의의 수의 메모리 또는 스토리지 유닛과, 임의의 수의 스토리지 유닛 또는 볼륨에 걸쳐서 발생하는 임의의 수의 애플리케이션 및 프로세스를 갖는 임의의 컴퓨터 시스템에 관련될 수 있다. 본원에 개시된 요지의 양태들은 원격 또는 로컬 스토리지를 갖는, 네트워크 환경에 배치된 서버 컴퓨터들 및 클라이언트 컴퓨터들을 갖춘 환경에 적용할 수 있다. 본원에 개시된 요지의 양태들은 프로그래밍 언어 기능성, 해석 및 실행 성능을 갖는 자립형 컴퓨팅 장치에 적용할 수도 있다.
도 4는 통합 개발 환경(IDE)(600) 및 공통 언어 런타임 환경(Common Language Runtime Environment)(602)을 나타낸다. IDE(600)는 사용자(예컨대, 개발자, 프로그래머, 디자이너, 코더 등)가 컴퓨터 시스템에서 프로그램, 프로그램 세트, 웹 사이트, 웹 애플리케이션, 및 웹 서비스를 디자인, 코딩, 컴파일, 테스트, 가동, 편집, 디버깅 또는 구축할 수 있게 한다. 소프트웨어 프로그램들은 하나 이상의 소스 코드 언어(예컨대, Visual Basic, Visual J#, C++, C#, J#, Java Script, APL, COBOL, Pascal, Eiffel, Haskell, ML, Oberon, Perl, Python, Scheme, Smalltalk 등)에서 생성된 소스 코드(구성요소(610))를 포함할 수 있다. IDE(600)는 네이티브 코드 개발 환경을 제공할 수 있거나, 또는 가상 기계 상에서 가동하는 관리된 코드 개발 환경을 제공할 수 있거나, 또는 그들의 조합을 제공할 수 있다. IDE(600)는 Microsoft사의 닷넷 프레임워크(.NET™ framework)를 이용해서 관리된 코드 개발 환경을 제공할 수 있다. 중간 언어 구성요소(650)는 모델링 툴(652) 및 모델 스토어(653)를 이용하는 언어 지정 소스 컴파일러(620)를 이용해서 소스 코드 구성요소(610) 및 네이티브 코드 구성요소(611)로부터 생성될 수 있고, 네티이브 코드 구성요소(611)(예컨대, 기계 실행 가능 명령어)는 애플리케이션의 실행시에 중간 언어 컴파일러(660)(예컨대, 저스트-인-타임(JIT) 컴파일러)를 이용해서 중간 언어 구성요소(650)로부터 생성된다. 즉, 중간 언어(IL) 애플리케이션이 실행되는 경우에는, 그것이 실행되고 있는 플랫폼에 대하여 적절한 기계 언어로 실행되는 상태로 컴파일되고, 그에 따라 코드를 몇몇 플랫폼에 대하여 휴대할 수 있게 만든다. 대안으로서, 다른 실시예들에 있어서는, 프로그램들이 그 의도된 플랫폼에 대하여 적합한 네이티브 코드 기계 언어(도시되지 않음)로 컴파일될 수 있다.
사용자는 소스 코드 구성요소를 IDE(600)에서 사용자 인터페이스(640) 및 소스 코드 에디터(651)를 거쳐서 특정 소스 언어와 연관된 특정한 논리 및 구문 규칙과 공지의 소프트웨어 프로그래밍 기법에 따라 생성 및/또는 편집할 수 있다. 이후, 소스 코드 구성요소(610)는 소스 컴파일러(620)를 거쳐서 컴파일될 수 있고, 이로써 어셈블리어(630)와 같은 프로그램의 중간 언어 표시가 생성될 수 있다. 어셈블리어(630)는 중간 언어 구성요소(650) 및 메타데이터(642)를 포함할 수 있다. 애플리케이션 디자인들은 배치 전에 인증되게 할 수 있다.
본원에 개시된 다양한 기법들은 하드웨어 또는 소프트웨어와 관련하여, 또는 적합하다면, 하드웨어와 소프트웨어의 조합과 관련하여 구현될 수 있다. 따라서, 본원에 개시된 방법 및 장치, 또는 그 특정 양태 또는 일부는, 플로피 디스켓, CD-ROM, 하드 드라이브, 또는 임의의 다른 기계-판독 가능 스토리지 매체와 같은 유형의 매체에서 실현되는 프로그램 코드(즉, 명령어)의 형태를 취할 수 있고, 여기서 프로그램 코드가 컴퓨터와 같은 기계에 로딩되어 실행되면, 기계는 본원에 개시된 요지의 양태들을 실행하는 장치가 된다. 본원에서 사용되는 용어, "기계-판독 가능 스토리지 매체(machine-readable storage medium)"는 임의의 형태의 전파 신호를 제공(즉, 저장 및/또는 전송)하는 임의의 메커니즘을 배제하도록 취해질 것이다. 프로그래머블 컴퓨터 상에서의 프로그램 코드 실행의 경우에, 컴퓨팅 장치는 일반적으로 프로세서, 프로세서에 의해 판독 가능한 스토리지 매체(휘발성 및 비휘발성 메모리 및/또는 스토리지 요소를 포함), 적어도 하나의 입력 디바이스, 및 적어도 하나의 출력 디바이스를 포함할 것이다. 예컨대, 데이터 프로세싱 API 등의 이용을 통해, 도메인-지정 프로그래밍 모델 양태들의 생성 및/또는 구현을 이용할 수 있는 하나 이상의 프로그램은, 컴퓨터 시스템과의 통신을 위해 고수준 절차 또는 객체 지향 프로그래밍 언어로 구현될 수 있다. 그러나, 프로그램(들)은 필요에 따라 어셈블리어 또는 기계 언어로 구현될 수 있다. 어쨌든, 언어는 컴파일된 또는 해석된 언어일 수 있으며, 하드웨어 구현들과 결합될 수 있다.
구조적인 양태들 및/또는 방법론적 행위들에 대하여 특정된 언어로 요지를 기술하고 있지만, 청구범위에서 규정하는 요지는 상술한 특정 양태들 또는 행위들에 반드시 한정되는 것은 아니라는 점을 이해해야 한다.

Claims (20)

  1. 시스템으로서,
    컴퓨팅 장치의 적어도 하나의 프로세서와,
    상기 컴퓨팅 장치의 메모리와,
    디버거(debugger)를 포함하되,
    상기 디버거는, 상기 적어도 하나의 프로세서로 하여금,
    프로그램의 네이티브 코드(native code)를 실행 - 상기 네이티브 코드는 적어도 하나의 사전결정된 디버그 베일아웃 포인트(debug bailout point)를 포함하고, 상기 적어도 하나의 사전결정된 디버그 베일아웃 포인트는 적어도 하나의 디버그 베일아웃 조건이 충족되는 경우 상기 디버거가 논네이티브(non-native) 코드의 디버깅으로 자동 이행(transition)하는 상기 프로그램 내의 위치를 나타냄 - 하게 하고,
    상기 적어도 하나의 디버그 베일아웃 조건이 충족되었음을 검출한 것에 응답하여,
    상기 디버거 하에서 실행되는 상기 네이티브 코드의 현재 상태를 수신하게 하고,
    인터프리터(interpreter)의 인스턴스(instance)를 인스턴스화하게 하며,
    상기 인터프리터의 인스턴스에 대한 인터프리터 스택 프레임(interpreter stack frame)을 생성하게 하고,
    상기 인스턴스화된 인터프리터에 대한 상기 인터프리터 스택 프레임을 상기 네이티브 코드의 현재 상태로 채우게 하며,
    상기 프로그램을 나타내는 상기 네이티브 코드의 디버깅으로부터 상기 프로그램을 나타내는 상응하는 논네이티브 코드의 디버깅으로 이행하게 하는
    시스템.
  2. 제 1 항에 있어서,
    상기 적어도 하나의 프로세서로 하여금 상기 프로그램의 상기 네이티브 코드를 생성하게 하는 JIT(just-in-time) 컴파일러를 더 포함하는
    시스템.
  3. 제 1 항에 있어서,
    상기 적어도 하나의 프로세서로 하여금, 함수의 시작(at a beginning of a function), 루프의 백 에지(at a back edge of a loop), 함수 리턴시(when a function returns), 헬퍼 함수에 대한 호출 리턴시(when a call to a helper function returns), 라이브러리에 대한 호출 리턴시(when a call to a library returns) 및 디버거 스테이트먼트와의 조우시(when a debugger statement is encountered) 중 적어도 하나를 포함하는 상기 프로그램에 대한 정의된 베일아웃 위치를 수신하게 하는 적어도 하나의 프로그램 모듈을 더 포함하는
    시스템.
  4. 제 1 항에 있어서,
    상기 적어도 하나의 프로세서로 하여금, 적어도 하나의 실행 컨트롤 작업을 이용하여 상기 프로그램을 나타내는 상기 상응하는 논네이티브 코드를 디버깅하게 하는 적어도 하나의 프로그램 모듈을 더 포함하는
    시스템.
  5. 제 4 항에 있어서,
    상기 실행 컨트롤 작업은 비동기 중단 작업(asynchronous break operation), 스테핑 작업(stepping operation), 중단지점(breakpoint) 검출 및 예외 중단(break on exception) 작업 중 하나를 포함하는
    시스템.
  6. 제 1 항에 있어서,
    상기 적어도 하나의 프로세서로 하여금, 네이티브 모드에서 디버그 작업을 실행하게 하는 적어도 하나의 프로그램 모듈을 더 포함하되,
    상기 디버그 작업은 변수의 현재 값을 수정하고, 상기 네이티브 모드는 상기 프로그램을 나타내는 상기 네이티브 코드의 디버깅을 포함하는
    시스템.
  7. 제 1 항에 있어서,
    상기 적어도 하나의 프로세서로 하여금, 상기 프로그램에서 정의된 변수를 레지스터에 저장하는 것에 응답하여, 상기 변수를 스택 위치에 저장하게 하는 적어도 하나의 프로그램 모듈을 더 포함하되,
    상기 스택 위치는 상기 프로그램과 연관된 상기 스택의 특정한 국소 영역을 포함하는
    시스템.
  8. 제 1 항에 있어서,
    상기 적어도 하나의 프로세서로 하여금, 적어도 하나의 런타임 플래그의 상태를 체크함으로써 상기 적어도 하나의 디버그 베일아웃 조건이 충족되었음을 검출하게 하는 적어도 하나의 프로그램 모듈을 더 포함하는
    시스템.
  9. 프로그램에 대한 디버그 세션을 개시하는 단계와,
    상기 프로그램에 대한 이전에 생성된 네이티브 코드를 폐기하는 단계와,
    디버깅할 네이티브 코드를 생성하는 단계 - 상기 생성된 네이티브 코드는 상기 프로그램에 대한 적어도 하나의 사전결정된 디버그 베일아웃 위치를 포함하고, 상기 적어도 하나의 사전결정된 디버그 베일아웃 위치는 디버그 베일아웃 조건이 충족되었으면 디버깅이 네이티브 코드의 디버깅으로부터 상응하는 논네이티브 코드의 디버깅으로 자동 이행하는 상기 생성된 네이티브 코드 내의 위치를 포함하며, 상기 적어도 하나의 사전결정된 디버그 베일아웃 위치는 함수의 시작, 루프의 백 에지, 함수 리턴시, 헬퍼 함수에 대한 호출 리턴시, 라이브러리에 대한 호출 리턴시 및 상기 네이티브 코드에서 디버거 스테이트먼트와의 조우시 중 적어도 하나를 포함함 - 와,
    디버거 하에서 상기 생성된 네이티브 코드를 실행하는 단계와,
    상기 디버그 베일아웃 조건이 충족되었다는 판정에 응답하여, 상기 디버거 하에서 인터프리티드 모드로 상기 생성된 네이티브 코드의 실행을 지속하는 단계와,
    상기 실행된 생성된 네이티브 코드와 연관된 변수에 대응하는 인터프리터 변수를 복원하는 단계와,
    상기 실행된 생성된 네이티브 코드의 디버깅이 중지된 상기 실행된 생성된 네이티브 코드 내의 지점에 대응하는 상기 논네이티브 코드 내의 지점에서 상기 프로그램의 디버깅을 인터프리티드 모드로 재개하는 단계를 포함하는
    방법.
  10. 제 9 항에 있어서,
    JIT(just-in-time) 컴파일러는 디버깅할 상기 네이티브 코드를 생성하는
    방법.
  11. 제 9 항에 있어서,
    상기 프로그램의 디버깅을 인터프리티드 모드로 재개하는 단계는 비동기 중단 작업, 스테핑 작업, 중단지점 및 예외 중단 작업 중 하나를 포함하는 실행 컨트롤 작업을 포함하는 디버그 작업을 수신하는 단계를 포함하는
    방법.
  12. 제 9 항에 있어서,
    인터프리터 모드에서 상기 논네이티브 코드와 연관된 스택의 선택 프레임을 디버깅하고, 네이티브 모드에서 상기 프로그램의 다른 부분을 디버깅하는 단계를 더 포함하는
    방법.
  13. 제 9 항에 있어서,
    예외 중단 작업의 검출에 응답하여, 스택의 선택 프레임을 디버깅하는 단계 - 상기 선택 프레임은 상기 네이티브 코드의 실행과 연관됨 - 와,
    스테핑 또는 지속 작업의 검출에 응답하여, 상기 인터프리티드 모드로 이행하는 단계를 더 포함하는
    방법.
  14. 제 9 항에 있어서,
    상기 프로그램과 연관된 스택의 스택 깊이를 판정함으로써 상기 디버그 베일아웃 조건이 충족되었는지를 판정하는 단계를 더 포함하는
    방법.
  15. 디바이스로서,
    적어도 하나의 프로세서 및 메모리를 포함하되,
    상기 적어도 하나의 프로세서는,
    프로그램의 네이티브 코드를 실행 - 상기 네이티브 코드는 적어도 하나의 사전결정된 디버그 베일아웃 포인트를 포함하고, 상기 적어도 하나의 사전결정된 디버그 베일아웃 포인트는 적어도 하나의 디버그 베일아웃 조건이 충족되는 경우 디버거가 논네이티브 코드의 디버깅으로 자동 이행하는 상기 프로그램 내의 위치를 나타냄 - 하고,
    실행 컨트롤 작업을 수신하는 것을 포함하는 상기 적어도 하나의 디버그 베일아웃 조건이 충족되었음을 검출한 것에 응답하여, 상기 프로그램을 나타내는 네이티브 코드의 디버깅으로부터 상기 프로그램을 나타내는 상응하는 논네이티브 코드의 디버깅으로 이행하되,
    상기 실행 컨트롤 작업은 비동기 중단, 스텝 아웃 작업, 스텝 오버 작업, 중단 지점, 예외 중단 작업 및 스테핑 작업 중 적어도 하나를 포함하는
    디바이스.
  16. 제 15 항에 있어서,
    상기 적어도 하나의 프로세서는, 함수의 시작시에 또는 프로그램 내의 루프에서 비동기 중단에 의해 구현된 실행 컨트롤 작업을 수신한 것에 응답하여, 네이티브 모드 디버깅에서 인터프리티드 모드 디버깅으로의 이행을 강제하는 플래그를 스레드에 설정하는
    디바이스.
  17. 제 15 항에 있어서,
    상기 적어도 하나의 프로세서는,
    함수의 스텝 아웃 작업인 스텝 아웃 작업에 의해 구현된 실행 컨트롤 작업을 수신하는 것에 응답하여, 스택 깊이 또는 귀환 검출을 위해 현재의 스택 프레임 기본 어드레스를 저장하고,
    함수 리턴에 응답하여, 상기 저장된 현재의 스택 프레임 기본 어드레스와 연관된 스택 깊이와 현재의 스택 깊이를 비교하며,
    상기 스택 깊이가 감소했다는 결정에 응답하여, 네이티브 모드 디버깅에서 인터프리티드 모드 디버깅으로 이행하는
    디바이스.
  18. 제 15 항에 있어서,
    상기 적어도 하나의 프로세서는,
    함수의 스텝 오버 작업인 스텝 오버 작업에 의해 구현된 실행 컨트롤 작업을 수신하는 것에 응답하여, 스택 깊이 또는 귀환 검출을 위해 현재의 스택 프레임 기본 어드레스를 저장하고,
    상기 스텝 오버 작업이 상기 함수의 최종 스테이트먼트에서 이루어졌고 상기 함수로부터의 리턴을 초래한다고 결정한 것에 응답하여, 상기 저장된 현재의 스택 프레임 기본 어드레스와 연관된 스택 깊이와 현재의 스택 깊이를 비교하며,
    상기 스택 깊이가 감소했다는 결정에 응답하여, 네이티브 모드 디버깅으로부터 인터프리티드 모드 디버깅으로 이행하는
    디바이스.
  19. 제 15 항에 있어서,
    상기 적어도 하나의 프로세서는,
    함수 내의 중단 지점에 의해 구현된 실행 컨트롤 작업을 수신하는 것에 응답하여, 상기 함수 내의 중단 지점의 수를 추적하는 카운터를 증분시키고,
    상기 함수를 실행하며,
    상기 카운터가 0보다 크다는 결정에 응답하여, 상기 함수에 진입할 때, 네이티브 모드 디버깅으로부터 인터프리티드 모드 디버깅으로 이행하는
    디바이스.
  20. 제 15 항에 있어서,
    상기 적어도 하나의 프로세서는,
    예외가 스로우된(thrown) 후에 지속 작업에 의해 구현된 실행 컨트롤 작업을 수신하는 것에 응답하여, 함수 호출을 트라이-캐치(try-catch) 스테이트먼트 블록으로 랩핑하고,
    실행 컨트롤이 상기 디버거 내에서 지속되게 하는 인터프리터 모드로 이행하는
    디바이스.
KR1020157034649A 2013-06-06 2014-06-03 네이티브 모드에서의 실행으로부터 인터프리티드 모드에서의 실행으로 이행함으로써 네이티브 코드를 디버깅하는 기법 KR102171050B1 (ko)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
US13/911,108 2013-06-06
US13/911,108 US10127138B2 (en) 2013-06-06 2013-06-06 Debugging native code by transitioning from execution in native mode to execution in interpreted mode
PCT/US2014/040581 WO2014197406A1 (en) 2013-06-06 2014-06-03 Debugging native code by transitioning from execution in native mode to execution in interpreted mode

Publications (2)

Publication Number Publication Date
KR20160018522A KR20160018522A (ko) 2016-02-17
KR102171050B1 true KR102171050B1 (ko) 2020-10-28

Family

ID=51033543

Family Applications (1)

Application Number Title Priority Date Filing Date
KR1020157034649A KR102171050B1 (ko) 2013-06-06 2014-06-03 네이티브 모드에서의 실행으로부터 인터프리티드 모드에서의 실행으로 이행함으로써 네이티브 코드를 디버깅하는 기법

Country Status (11)

Country Link
US (1) US10127138B2 (ko)
EP (1) EP3005121B1 (ko)
JP (1) JP6573875B2 (ko)
KR (1) KR102171050B1 (ko)
CN (1) CN105683924B (ko)
AU (1) AU2014275115B9 (ko)
BR (1) BR112015030302B1 (ko)
CA (1) CA2913730A1 (ko)
MX (1) MX2015016740A (ko)
RU (1) RU2668973C2 (ko)
WO (1) WO2014197406A1 (ko)

Families Citing this family (26)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8732670B1 (en) 2010-06-29 2014-05-20 Ca, Inc. Ensuring determinism during programmatic replay in a virtual machine
US8909990B2 (en) 2012-08-04 2014-12-09 Microsoft Corporation Historical software diagnostics using lightweight process snapshots
CN103678340B (zh) * 2012-09-07 2016-09-14 腾讯科技(深圳)有限公司 浏览器引擎的运行方法、装置、浏览器及终端
US10289411B2 (en) * 2013-11-18 2019-05-14 Microsoft Technology Licensing, Llc Diagnosing production applications
US9612939B2 (en) 2014-10-29 2017-04-04 Microsoft Technology Licensing, Llc. Diagnostic workflow for production debugging
US9632915B2 (en) 2014-10-29 2017-04-25 Microsoft Technology Licensing, Llc. Historical control flow visualization in production diagnostics
US10089259B2 (en) * 2015-07-21 2018-10-02 BigStream Solutions, Inc. Precise, efficient, and transparent transfer of execution between an auto-generated in-line accelerator and processor(s)
US9772925B2 (en) * 2015-10-22 2017-09-26 Microsoft Technology Licensing, Llc Storage access debugging with disassembly and symbol entries
KR101769848B1 (ko) * 2015-12-30 2017-08-22 (주)비아이매트릭스 상용 인터프리터를 이용한 스크립트 기반 데이터 처리 시스템
CN107885650A (zh) * 2016-09-30 2018-04-06 联芯科技有限公司 一种程序调试方法及系统
EP3330859A1 (en) * 2016-12-05 2018-06-06 Universiteit Gent Self-debugging
US10169193B2 (en) 2016-12-13 2019-01-01 International Business Machines Corporation Common debug scripting framework for driving hybrid applications consisting of compiled languages and interpreted languages
US10846211B2 (en) * 2018-03-21 2020-11-24 Microsoft Technology Licensing, Llc Testing kernel mode computer code by executing the computer code in user mode
US10747645B2 (en) * 2018-04-27 2020-08-18 Microsoft Technology Licensing, Llc Selectively tracing portions of computer process execution
EP3891613B1 (en) 2019-01-10 2023-01-11 Siemens Industry Software Inc. Software checkpoint-restoration between distinctly compiled executables
US11150926B2 (en) 2019-02-22 2021-10-19 International Business Machines Corporation Native code generation for cloud services
CN110347570B (zh) * 2019-07-02 2021-08-10 昆明理工大学 一种ide环境下代码自动生成工具分析方法
CN112395185B (zh) * 2019-08-15 2024-04-12 腾讯科技(深圳)有限公司 一种程序测试的方法及相关装置
CN110597502B (zh) * 2019-08-20 2023-05-23 北京东方国信科技股份有限公司 一种基于java实现PL/SQL语言的单步调试方法
CN110569039A (zh) * 2019-09-10 2019-12-13 浪潮软件股份有限公司 一种java在平台优化运行的方法
CN110865940B (zh) * 2019-11-11 2022-04-05 腾讯科技(深圳)有限公司 一种程序卡顿定位的方法以及相关装置
US11748233B2 (en) * 2020-04-30 2023-09-05 Red Hat, Inc. Debugging a native compiled application from an integrated development environment
US11226799B1 (en) * 2020-08-31 2022-01-18 International Business Machines Corporation Deriving profile data for compiler optimization
CN114237763B (zh) * 2021-12-23 2023-06-02 建信金融科技有限责任公司 提高组件首次加载速度的方法、装置、设备、介质及产品
CN114327776A (zh) * 2021-12-30 2022-04-12 支付宝(杭州)信息技术有限公司 用于智能合约的调试方法、调试设备和调试系统
CN116775501B (zh) * 2023-08-25 2023-12-12 荣耀终端有限公司 一种软件测试方法、服务器、可读存储介质及芯片系统

Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5058052A (en) 1989-10-16 1991-10-15 Ge Fanuc Automation North America, Inc. Method for checking the syntax of an instruction list program to determine if the program is expressible as a relay ladder diagram by a programmable logic controller
US5339422A (en) 1991-03-07 1994-08-16 Digital Equipment Corporation System and method for jacketing cross-domain calls in a multi-code execution and debugging system within a multi-architecture environment
US5889981A (en) 1996-05-07 1999-03-30 Lucent Technologies Inc. Apparatus and method for decoding instructions marked with breakpoint codes to select breakpoint action from plurality of breakpoint actions
US20050039187A1 (en) 2003-08-12 2005-02-17 Avakian Arra E. Instrumenting java code by modifying bytecodes
US7124407B1 (en) 2000-08-16 2006-10-17 Sun Microsystems, Inc. Method and apparatus for caching native code in a virtual machine interpreter
KR100996807B1 (ko) 2003-04-21 2010-11-25 마이크로소프트 코포레이션 Jmc 디버깅을 위한 시스템, 방법 및 컴퓨터 판독가능 기록 매체

Family Cites Families (41)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH0766342B2 (ja) 1985-11-12 1995-07-19 オムロン株式会社 プログラムテスト装置
JP2926898B2 (ja) 1990-05-30 1999-07-28 横河電機株式会社 デバッグ・サポート装置
EP0490478A2 (en) * 1990-12-14 1992-06-17 Tektronix Inc. Automatic compilation of model equations into a gradient based analog simulator
US5450575A (en) * 1991-03-07 1995-09-12 Digital Equipment Corporation Use of stack depth to identify machine code mistakes
JPH08286896A (ja) 1995-04-14 1996-11-01 Mitsubishi Electric Corp ソフトウェア開発方法及びソフトウェア開発システム
US5956479A (en) * 1995-11-13 1999-09-21 Object Technology Licensing Corporation Demand based generation of symbolic information
US6158045A (en) * 1995-11-13 2000-12-05 Object Technology Licensing Corporation Portable debugging services utilizing a client debugger object and a server debugger object with flexible addressing support
US5732210A (en) * 1996-03-15 1998-03-24 Hewlett-Packard Company Use of dynamic translation to provide fast debug event checks
JP3237554B2 (ja) 1996-12-27 2001-12-10 富士通株式会社 会話型デバッグ装置
US6275868B1 (en) * 1997-03-12 2001-08-14 Microsoft Corporation Script Engine interface for multiple languages
US5901315A (en) * 1997-06-13 1999-05-04 International Business Machines Corporation Method for debugging a Java application having native method dynamic load libraries
US6249907B1 (en) 1998-03-24 2001-06-19 International Business Machines Corporation Method system and article of manufacture for debugging a computer program by encoding user specified breakpoint types at multiple locations in the computer program
US6434741B1 (en) * 1998-04-30 2002-08-13 Hewlett-Packard Company Method and apparatus for debugging of optimized code using emulation
GB9825102D0 (en) 1998-11-16 1999-01-13 Insignia Solutions Plc Computer system
US7020879B1 (en) * 1998-12-16 2006-03-28 Mips Technologies, Inc. Interrupt and exception handling for multi-streaming digital processors
GB2358261B (en) 2000-01-17 2004-06-09 Advanced Risc Mach Ltd Data processing with native and interpreted program instruction words
US7080359B2 (en) * 2002-01-16 2006-07-18 International Business Machines Corporation Stack unique signatures for program procedures and methods
US20020138821A1 (en) * 2001-01-23 2002-09-26 Vadim Furman Method and apparatus for seamless porting of object code between operating system environments
US6826746B2 (en) * 2001-03-08 2004-11-30 International Business Machines Corporation Debugger probe for object oriented programming
US7370320B1 (en) * 2001-07-24 2008-05-06 Adobe Systems Incorporated System and method for debugging programs run in a variety of environments
US6996814B2 (en) 2001-11-14 2006-02-07 Sun Microsystems, Inc. Method and apparatus for dynamically compiling byte codes into native code
US20030204838A1 (en) * 2002-04-30 2003-10-30 Eric Caspole Debugging platform-independent software applications and related code components
US7299454B2 (en) * 2003-02-26 2007-11-20 Bea Systems, Inc. Method for multi-language debugging
US20040267766A1 (en) * 2003-06-26 2004-12-30 Andreas Marek Defining user-defined data types and/or user-defined methods using an interpreted programming language
US7882492B2 (en) * 2004-09-17 2011-02-01 Oracle America, Inc. Intelligent computer program debugger, and system and method for implementing the same
US20060161896A1 (en) * 2005-01-14 2006-07-20 International Business Machines Corporation Performing debug requests that are within the debug domain of a class loader
DE102005045852A1 (de) * 2005-09-26 2007-04-05 Siemens Ag Verfahren und System zum Schutz von Quellcode
US8091071B2 (en) * 2006-08-21 2012-01-03 Sap, Ag Method and system for template-based code generation
CN101515248A (zh) 2008-02-21 2009-08-26 国际商业机器公司 面向对象程序的跟踪方法和系统
JP2009252113A (ja) 2008-04-09 2009-10-29 Canon Inc 情報処理装置、その制御方法及びコンピュータプログラム
US8291389B2 (en) * 2008-08-21 2012-10-16 International Business Machines Corporation Automatically detecting non-modifying transforms when profiling source code
RU2390821C1 (ru) 2008-10-23 2010-05-27 Корпорация "САМСУНГ ЭЛЕКТРОНИКС Ко., Лтд." Способ динамической инструментации
US8756570B2 (en) * 2008-12-30 2014-06-17 Sap Ag Defining a conditional breakpoint
US8359584B2 (en) * 2009-12-18 2013-01-22 Microsoft Corporation Debugging from a call graph
US8997049B1 (en) * 2010-05-21 2015-03-31 Cadence Design Systems, Inc. Method and system for debugging of compiled code using an interpreter
US8484641B2 (en) * 2010-07-12 2013-07-09 International Business Machines Corporation Implementing a versioned virtualized application runtime environment
US20120117041A1 (en) 2010-11-08 2012-05-10 Verisign, Inc. Debugging a stored procedure in a database
US8572438B2 (en) * 2011-06-24 2013-10-29 Microsoft Corporation N-way runtime interoperative debugging
CN102855179A (zh) * 2011-06-30 2013-01-02 国际商业机器公司 虚拟机环境下的程序调试方法和系统
US8539463B2 (en) 2011-07-28 2013-09-17 Qualcomm Innovation Center, Inc. Apparatus and method for improving the performance of compilers and interpreters of high level programming languages
US20130132063A1 (en) * 2011-11-18 2013-05-23 Michael J. Rieschl Systems and methods for debugging just-in-time static translation in an emulated system

Patent Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5058052A (en) 1989-10-16 1991-10-15 Ge Fanuc Automation North America, Inc. Method for checking the syntax of an instruction list program to determine if the program is expressible as a relay ladder diagram by a programmable logic controller
US5339422A (en) 1991-03-07 1994-08-16 Digital Equipment Corporation System and method for jacketing cross-domain calls in a multi-code execution and debugging system within a multi-architecture environment
US5889981A (en) 1996-05-07 1999-03-30 Lucent Technologies Inc. Apparatus and method for decoding instructions marked with breakpoint codes to select breakpoint action from plurality of breakpoint actions
US7124407B1 (en) 2000-08-16 2006-10-17 Sun Microsystems, Inc. Method and apparatus for caching native code in a virtual machine interpreter
KR100996807B1 (ko) 2003-04-21 2010-11-25 마이크로소프트 코포레이션 Jmc 디버깅을 위한 시스템, 방법 및 컴퓨터 판독가능 기록 매체
US20050039187A1 (en) 2003-08-12 2005-02-17 Avakian Arra E. Instrumenting java code by modifying bytecodes

Also Published As

Publication number Publication date
AU2014275115A1 (en) 2015-12-10
MX2015016740A (es) 2016-08-03
BR112015030302A2 (pt) 2017-07-25
RU2015152048A3 (ko) 2018-05-17
CN105683924B (zh) 2019-03-19
AU2014275115B2 (en) 2019-07-11
JP6573875B2 (ja) 2019-09-11
CN105683924A (zh) 2016-06-15
RU2668973C2 (ru) 2018-10-05
EP3005121B1 (en) 2019-03-06
EP3005121A1 (en) 2016-04-13
WO2014197406A1 (en) 2014-12-11
KR20160018522A (ko) 2016-02-17
US10127138B2 (en) 2018-11-13
US20140366007A1 (en) 2014-12-11
BR112015030302B1 (pt) 2022-04-19
JP2016529582A (ja) 2016-09-23
CA2913730A1 (en) 2014-12-11
RU2015152048A (ru) 2017-06-07
AU2014275115B9 (en) 2019-07-25

Similar Documents

Publication Publication Date Title
KR102171050B1 (ko) 네이티브 모드에서의 실행으로부터 인터프리티드 모드에서의 실행으로 이행함으로써 네이티브 코드를 디버깅하는 기법
US8819649B2 (en) Profile guided just-in-time (JIT) compiler and byte code generation
CN107077414B (zh) 用于生产调试的诊断工作流程
US8621435B2 (en) Time debugging
US20130205282A1 (en) Transferring program execution from compiled code to interpreted code
EP2359247B1 (en) Transforming user script code for debugging
US8972955B2 (en) Reducing network trips for remote expression evaluation
US8924437B2 (en) Memory usage data collection and analysis for dynamic objects
US20140181591A1 (en) Test strategy for profile-guided code execution optimizers
US20170116109A1 (en) Missing include suggestions for external files
US9336128B2 (en) Method and system for code analysis using symbolic types
US8875089B2 (en) Workspace model for interrelated projects
Risberg Alaküla et al. Property Probes: Source Code Based Exploration of Program Analysis Results
US10255160B2 (en) Data breakpoint with compacting garbage collection
Alaküla et al. Property Probes

Legal Events

Date Code Title Description
E701 Decision to grant or registration of patent right
GRNT Written decision to grant