KR101247062B1 - 제한적인 호출 규칙을 갖춘 코드의 검사 방법 - Google Patents

제한적인 호출 규칙을 갖춘 코드의 검사 방법 Download PDF

Info

Publication number
KR101247062B1
KR101247062B1 KR1020060018161A KR20060018161A KR101247062B1 KR 101247062 B1 KR101247062 B1 KR 101247062B1 KR 1020060018161 A KR1020060018161 A KR 1020060018161A KR 20060018161 A KR20060018161 A KR 20060018161A KR 101247062 B1 KR101247062 B1 KR 101247062B1
Authority
KR
South Korea
Prior art keywords
function
wrapper
instruction
probe
software program
Prior art date
Application number
KR1020060018161A
Other languages
English (en)
Other versions
KR20060103103A (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 KR20060103103A publication Critical patent/KR20060103103A/ko
Application granted granted Critical
Publication of KR101247062B1 publication Critical patent/KR101247062B1/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/3668Software testing
    • G06F11/3672Test management
    • G06F11/3688Test management for test execution, e.g. scheduling of test suites
    • 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
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/447Target code generation

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)
  • Debugging And Monitoring (AREA)
  • Test And Diagnosis Of Digital Computers (AREA)

Abstract

컴퓨터 프로그램 개발 환경에서 테스트를 받는 프로그램이 프로브(probe) 함수로 검사된다. 상기 프로브 함수는 컴퓨터 프로그램이 개발되는 플랫폼의 제한적인 호출 규칙에 맞추어 구성된 래퍼(wrapper) 함수를 통해 호출된다. 호출 규칙에 따름으로써, 심지어 예외 처리기, 또는 호출 규칙에 의존하는 다른 프로그램 요소가 실행되더라도 테스트 동안 컴퓨터 프로그램의 적절한 작업을 성취한다. 일단 검사되면, 컴퓨터 프로그램이 프로그램의 성능을 판정하기 위한, 또는 다른 테스트 함수를 위한, 바람직한 논리 함수를 실행하는지를 판정하도록 컴퓨터 프로그램이 테스트될 수 있다.
프로브 함수, 래퍼 함수, 호출 규칙, 휘발성 레지스터, 비휘발성 레지스터, 스택 프레임, 매개변수

Description

제한적인 호출 규칙을 갖춘 코드의 검사 방법{METHOD OF INSTRUMENTING CODE HAVING RESTRICTIVE CALLING CONVENTIONS}
도 1은 검사될 프로그램의 일부분을 도시.
도 2a는 본 발명의 실시예에 의거하여 프로브 함수를 통합한 수정된 프로그램을 도시.
도 2b는 본 발명의 다른 실시예에 의거하여 프로브 함수를 통합한 수정된 프로그램을 도시.
도 3은 본 발명의 또 다른 실시예에 의거하여 프로브 함수를 통합한 수정된 프로그램을 도시.
도 4는 본 발명에 의거하여 프로그램을 구현하는 과정의 흐름도를 도시.
<도면의 주요 부분에 대한 부호의 설명>
110 : 호출 프로그램
150 : 피호출 함수
본 발명은 주로, 소프트웨어 개발에 관한 것이며, 특히 소프트웨어 테스트 툴에 관한 것이다.
소프트웨어 프로그램이 개발되면, 프로그램이 의도되는 대로 동작하는지를 판정하기 위해 프로그램을 테스트하는 것이 바람직하다. 소프트웨어 프로그램이 크고 복잡해 질수록, 프로그램은 더 느리게 실행되고, 더 많은 메모리를 소비하게 되거나, 심지어 프로그램의 모든 부분이 바라던 결과를 산출할 때에도 요구된 수준의 성능을 수행하지 못하게 된다.
종종, 프로그램이 바라는 수준의 성능을 수행하는지를 판정하기 위해 프로그램을 테스트하는 것이 바람직하다. 소프트웨어 프로그램이 바라던 수준의 성능을 수행하지 않으면, 성능 엔지니어는 프로그램이 실행될 때 프로그램을 분석하여 성능을 향상하기 위해 수정할 수 있는 부분을 식별한다.
성능 엔지니어의 일을 용이하게 하기 위해, 소프트웨어 개발 시스템은 프로그램을 "검사"(instrument)할 수 있는 툴을 포함한다. 프로그램을 "검사하는 것"(instrumenting)은 일반적으로 "프로브(probe)"라 일컫는 특별한 함수의 호출을 삽입하는 것을 수반한다. 각 프로브는 매번 실행될 때마다 프로브가 삽입된 프로그램의 동작 상태에 관한 정보를 기록한다. 예를 들어, 프로브는 프로그램이 어느 특정 함수를 호출하기 전에 프로그램에 삽입될 수 있고, 제2 프로브는 그 함수로의 호출 이후에 그 프로그램에 삽입될 수 있다. 이들 프로브가 실행되면, 각 프로브는 실행될 때 로그(log) 파일을 작성할 수 있다. 로그 파일을 분석하여, 성능 엔지니어는 함수를 실행하는 데 필요한 시간의 양을 판정할 수 있다.
다른 예로서, 프로브는 각 함수의 시작과 종결 부분에 삽입될 수 있다. 이 들 프로브에 의해 수집된 정보는 각 함수가 실행된 횟수, 또는 각 함수 호출의 실행 시간을 분석하는 데 사용될 수 있다. 이런 성능 정보는 비교적 복잡한 프로그램을 분석할 때 중요하다.
피검사 프로그램을 분석하여 얻어진 결과가 실제 동작에서 믿을 수 있는 프로그램 성능 지표가 되기 위해서, 프로브를 추가하는 것은 가능한 한 프로그램의 동작을 방해하지 말아야 한다. 따라서, 프로브는 일반적으로 분석해야 할 프로그램을 포함한 바이너리 또는 실행 파일에 삽입된다. 바이너리 파일은 완전히 최적화되고 컴파일된 후에 프로그램을 포함한다. 그러므로, 프로브를 삽입하는 것은 최적화 또는 컴파일 프로세스를 변경시키지 않는다.
프로브를 바이너리 파일에 삽입하기 위해서는, 바이너리 파일을 디스어셈블하여 프로브가 요구되는 프로그램 내의 특정 위치를 식별한다. 예를 들어, 함수 테이블은 종종 바이너리 파일의 일부분으로서 포함되어 각 함수를 나타내는 명령어의 시작 부분을 지정한다.
또한, 프로브는 예컨대 변수의 저장소를 변경하거나, 실행 프로그램이 의존하는 정보가 저장되는 포맷을 붕괴시킴으로써 실행 프로그램에 오류를 초래해서는 안된다. 애플리케이션 프로그램이 작성되는 소프트웨어 시스템은 다양한 프로그래밍 규칙, 특히 함수의 레지스터 값을 변경하는 것에 관한 규칙을 부과할 수 있다.
예를 들어, 다수의 광범위하게 이용가능한 애플리케이션은 특정 호출 규칙이 있는 X86 프로세서 계열에 맞추어 개발되었다. 이 호출 규칙에 따르기 위해, X86 프로세서에서 실행되는 프로그램을 처리하는 컴파일러는 프롤로그(prologue)와 에필로그(epilogue) 부분을 이용하여 각 함수를 구현할 수 있다. 프롤로그에서, 함수는 함수가 변경하는 각 레지스터의 값을 스택에 푸시(push)하고, 에필로그 부분에서, 함수는 스택에서 상기 값들을 팝(pop)하여 이들 레지스터의 값을 복원한다. 그러한 함수와 상호 작용하도록 작성된 어떤 다른 루틴 또는 툴이든 호출 규칙에 따라 정보가 저장된다고 가정할 수 있다. 호출 규칙에 따라 정보가 저장되지 않으면 오류가 발생할 수 있다.
특정 호출 규칙은 프로그램이 동작하도록 의도되는 프로세서에 커스터마이즈될 수 있다. 예를 들어, 호출 규칙은 프로세서가 빨리 실행하는 명령어를 사용하도록 설계될 수 있다. 따라서, 소프트웨어 시스템과 소프트웨어 시스템이 동작하도록 의도되는 프로세서의 결합으로 형성된 각각의 플랫폼은 서로 다른 호출 규칙을 가질 수 있다. 예를 들어, 어떤 플랫폼은 X86 프로세서 계열의 64비트 확장(extension)을 포함하는 프로세서를 통합한다. 그러한 프로세서는 AMD64 또는 EMT64T와 같은 이름으로 이용가능하다. 이들 프로세서는 집합적으로 X64 확장을 가진 것으로 나타난다. X64 확장을 가진 프로세서에 기초한 플랫폼은 상기 확장이 없는 X86 프로세서에 기초한 유사한 플랫폼과는 다른 호출 규칙을 사용할 수 있다.
X64 플랫폼에 맞추어 개발된 프로그램, 또는 기타 애플리케이션을, 종래의 검사 방식으로는 오류가 발생할 수 있는 호출 규칙을 사용하여 검사하는 것은 바람직할 것이다.
본 발명은, 종래의 검사 방식으로는 오류가 발생할 수 있는 플랫폼에 맞추어 개발된 프로그램을 검사하는 방법에 관한 것이다. 프로세스에 따르면, 프로브(probe)는 래퍼 함수(wrapper function) 안에서 호출된다. 상기 래퍼 함수는 프로브 함수가 플랫폼의 호출 규칙을 위반하지 않고서 호출되게 한다.
한 관점에서, 본 발명은 적어도 하나의 프로브 함수가 소프트웨어 프로그램 내의 한 위치에서 동작에 관한 정보를 기록하도록 적응되어 있는 소프트웨어 프로그램 검사 방법에 관련된다. 이 방법은 프로브 함수를 호출하는 적어도 하나의 컴퓨터 실행가능 명령어를 포함하는 래퍼 함수에게 컨트롤을 넘겨주도록 소프트웨어 프로그램을 수정하는 단계를 포함한다.
다른 관점에서, 본 발명은 값들을 지닌 레지스터들과 함수 호출 시에 레지스터들 중 적어도 하나의 값들이 보존되는 호출 규칙(calling convention)을 갖는 플랫폼 상에서 소프트웨어 프로그램을 테스트하는 방법에 관련된다. 본 발명은 프로그램 내의 피검사 위치에서 적어도 하나의 프로브 함수를 실행하는 단계를 포함한다. 본 방법에 따라, 소프트웨어 프로그램은 실행되고, 피검사 위치에서, 래퍼 함수에게 컨트롤을 넘겨준다. 상기 래퍼 함수 내에서, 플랫폼의 상태는 보존되고, 프로브 함수는 호출되고, 플랫폼의 상태는 복원된다.
다른 관점에서, 본 발명은 소프트웨어 프로그램의 개발 환경을 구현하는 컴퓨터 실행가능 명령어들을 가진 컴퓨터 판독가능 매체에 관련된다. 컴퓨터 실행가능 명령어들은 프로브 함수, 및 상기 프로브 함수를 호출하는 래퍼 함수를 포함하도록, 소프트웨어 프로그램의 실행 버전을 포함하는 바이너리 파일을 수정하며; 프로브 함수가 실행될 바이너리 파일 내의 한 피식별 위치를 식별하며; 피식별 위치에서 래퍼 함수에게 컨트롤을 넘겨주는 컨트롤 전송 명령어를 제공한다.
첨부된 도면은 일정한 비율에 맞추어 그려진 것이 아니다. 도면에서, 여러 도면에 도시된 동일하거나 거의 동일한 각 구성 요소는 같은 숫자로 표기하였다. 명확성을 위해, 모든 도면에서 모든 구성 요소에 대해 라벨로 표기하지는 않았다.
본 발명자는 제한적인 호출 규칙을 사용하는 플랫폼을 위해 작성된 컴퓨터 프로그램을 검사하는 문제를 인식하였다. 이러한 호출 규칙의 한 예는 X64 확장을 갖는 프로세서용의 마이크로소프트 윈도우즈 운영시스템(Microsoft? Windows? Operating System)을 포함하는 플랫폼에서 사용된다.
도 1은 이러한 플랫폼을 위해 생성된 어셈블리 레벨 버전의 코드의 한 예를 제공한다. 예를 들어, 도 1은 실행 파일의 일부분을 디스어셈블함으로써 생성된 디스플레이를 도시한다. 호출 프로그램(110)의 일부분을 설명한다. 호출 프로그램(110)은 함수를 호출하는 명령어(112)를 포함하며, 여기에서 함수는 "OriginalFunction"로 표기된다.
이 예에서 피호출 함수(150)는 "OriginalFunction"을 나타낸다. 피호출 함수(150)는 반환 명령어(156)로 종결한다. 반환 명령어(156)는 함수 호출(112)에 후속하는 명령어에서 프로그램 컨트롤을 호출 함수(110)에 반환한다. 이 예에서 사용한 호출 규칙에 따르면, 프로세서 내의 레지스터들 중 특정 레지스터는 피호출 함수에게 매개변수를 전달하는 데 사용된다. 피호출 함수는 호출 규칙을 위반하지 않고서 이들 레지스터 내의 값을 수정할 수 있다. 더 일반적으로는, 수정된 값과 함께 피호출 함수로부터 호출 프로그램으로 반환될 수 있는 레지스터를 "volatile registers"(휘발성 레지스터)로 표기한다.
함수 호출 부분으로서, 함수가 사용할 매개변수의 값은 호출 프로그램(110)에 의해 휘발성 레지스터에 로드(load)된다. 이 예에서, 사전-호출(pre-call) 명령어(114)는 함수에게 보낼 매개변수의 값을 휘발성 레지스터 내에 저장한다.
휘발성 레지스터 내에 저장될 수 있는 것 보다 많은 매개변수가 필요하면, 호출 프로그램(110)과 관련된 스택 프레임(stack frame) 내의 지정된 위치에 추가 매개변수가 저장될 수 있다. 사전-호출 명령어(115)는 매개변수를 스택 상에 저장하는 명령어를 나타낸다. 호출 프로그램(110)은 함수 호출(112) 이후 휘발성 레지스터로부터 함수의 결과를 나타내는 값을 언로드(unload)하는 사후-호출(post-call) 명령어(116)도 포함한다. 휘발성 레지스터에서 허용하는 것 보다 많은 결과가 반환되면, 그것들은 호출 프로그램(110)과 관련된 스택 프레임 내의 이미 지정된 위치에 저장된다.
이 규칙에 의거하여, 피호출 함수(150)는 호출 프로그래밍(110) 작업을 방해하지 않고서 휘발성 레지스터를 수정할 수 있다. 기타 레지스터는 비휘발성 레지스터로 간주된다. 피호출 함수(150)가 어떤 비휘발성 레지스터를 수정한다면, 피호출 함수(150)는 이들 레지스터 내에 값을 저장하고 호출 프로그램(110)에 반환하기 전에 이들 값을 복원해야 한다. 따라서, 피호출 함수(150)는 피호출 함수(150)에서 수정될 수 있는 어느 비휘발성 레지스터의 상태도 저장하는 프롤로그 부분 (152)을 포함한다. 피호출 함수(150) 또한 프롤로그(152) 내에 저장된 어느 비휘발성 레지스터의 상태도 복원하는 에필로그 부분(154)도 포함한다. 피호출 함수(150)가 컴파일될 때, 모든 필요한 비휘발성 레지스터를 저장할 충분한 메모리 공간이 할당되어야 한다.
많은 예에서, 각 함수는 스택으로서 구현된 메모리 구조에서 실행되기 때문에, 각 함수에 대해 저장 공간이 할당된다. 함수를 호출할 때 마다, 새로운 스택 프레임이 생성된다. 스택 프레임을 생성하는 것은 함수가 사용할 수 있는 저장소를 동적으로 할당한다. 함수가 실행을 종결하면, 스택 프레임은 스택으로부터 팝 되어, 저장 공간이 프로그램의 다른 부분에 의해 재사용되는 것을 허용할 수 있다.
몇몇 예에서, 스택 프레임의 시작 부분을 식별하기 위해 프레임 포인터가 사용된다. 이러한 실시예에서, 하나의 스택 프레임을 팝하기 위해 스택으로부터 제거할 정보량은 프레임 포인터로부터 식별될 수 있다. 다른 예에서, 함수의 스택 프레임 크기는 컴파일 시간에 고정된다. 스택 포인터는 스택 프레임의 밑바닥을 가리킨다. 그러므로, 하나의 스택 프레임을 팝하기 위해 스택으로부터 제거할 정보량은 스택 포인터를 스택 프레임의 크기 만큼 오프셋(offset)함으로써 식별될 수 있다. 호출 규칙이 둘 중 어느 한 접근법으로 하여금 스택 프레임 크기를 식별하는데 사용되도록 하는 상황에서, 프로그램에 프로브를 추가하는 것은 둘 중 어느 접근법에 대해서든 오류를 발생시키지 말아야 한다.
프로그램의 다른 함수 또는 부분은 호출 규칙에 의해 규정된 포맷을 갖는 스택에 의존할 수 있다. 예를 들어, 예외 처리에서, 메모리를 소정의 포맷으로 배열시키는 것은 중요하다. 예외가 발생할 때, 종종, 정상적인 함수 프롤로그를 통해 처리하지 않고서 실행 함수를 종결시키는 것이 필요하다. 예외 조건에 반응하는 프로그램은 종종 "예외 처리기"(exception handler)라고 일컫는데, 스택을 언와이드(unwind)하고 처리 시스템을 예외 조건이 발생한 곳 다음의 위치에서 호출 프로그램에서의 실행을 다시 시작하는 상태에 놓기 위해, 스택 프레임 크기와 같은 함수에 관한 정보에 의존한다.
예외 처리기가 적절하게 스택을 언와인드(unwind)하기 위해서, 예외 처리기는 피호출 함수에 할당된 스택 프레임의 크기와 같은 상세한 정보를 포함하여, 각 스택 프레임이 설립된 방법을 정의하는 정보에 액세스해야 한다. 본 명세서에서 설명된 실시예에서, 이 정보는 컴파일된 프로그램의 부분으로서 저장된 함수 테이블 내에 저장된다. 컴파일 시간에, 함수 테이블에, 각 함수의 스택 프레임 크기를 가리키는 항목(entry)이 생성되고, 이것은 런타임에 스택 프레임 크기를 설정하는 데 사용된다. 스택을 언와인드(unwind)하는 데 필요한 어떤 추가 정보든 또한 함수 테이블 내에 저장된다.
설명된 실시예에서, 프레임 포인터는 스택 프레임의 시작 부분을 식별하는 데 사용되지 않는다. 오히려, 스택 포인터는 스택 프레임의 밑바닥을 가리키도록 설정된다. 특정 함수에 대한 스택 프레임 내의 저장 위치는 스택 포인터에 상대적인 인덱싱에 의해 위치가 정해진다. 스택 포인터가 프레임의 끝을 가리키도록 설정되면 스택에 대한 푸시와 팝은 사용되지 않는다. 스택 프레임의 시작 부분은 스택 포인터로부터 현재 함수의 소정의 프레임 크기를 뺌으로써 식별될 수 있다.
본 호출 규칙에 의하면, 단지 프로브 함수 호출을 실행 파일에 삽입하는 것만으로는 의도된 결과를 산출할 수 없다. 전달될 매개변수를 저장하는 데 필요한 저장 위치는 호출 프로그램의 스택 프레임에서 얻을 수 없다. 게다가, 호출 규칙의 어느 부분이든지 정적(static) 정보(스택 프레임 크기와 같은 정보)에 의존하는 상황에서, 피호출 함수는 프로세서의 비휘발성 상태를 저장할 수 있는 스택 프레임을 가질 수 없다. 비휘발성 레지스터의 값을 스택에 푸시하는 것은 몇몇 호출 규칙으로 실행될 수 있는 바와 같이, 호출 규칙을 위반하여 스택 구조를 변경할 수 있다.
프로그램에 프로브를 삽입할 때 호출 규칙을 위반하여 야기된 문제는 설명된 실시예에서 "래퍼 함수"를 사용함으로써 예방된다. 여기에서 사용된 바와 같이, 용어 "래퍼 함수"는 다른 함수를 호출하는 함수를 나타낸다. 래퍼 함수는 특히 그런 목적으로 따로 추가된 함수일 수도 있고, 다른 함수를 지원할 수도 있다. 실행 파일에 래퍼 함수 호출을 삽입하는 것이 호출 규칙을 방해하지 않도록 래퍼 함수를 구성한다. 플랫폼의 호출 규칙에 따라 래퍼 함수가 프로브 함수를 호출할 수 있도록 래퍼 함수를 구성한다. 다음에 설명되는 실시예에서, 래퍼 함수는 프로브 함수가 실행되어야 할 피검사 프로그램 내의 한 위치에서 래퍼 함수를 타겟으로 한 컨트롤 전송 명령어를 통해 실행 파일에 삽입된다. 게다가, 피검사 프로그램에 관한 실행 파일 내의 함수 테이블은 래퍼 함수에 대한 참조를 포함도록 확대된다.
한 실시예에서, 래퍼 함수의 실행은 프로브 함수의 적절한 작업을 위해 저장 되어야 하는 매개변수들의 저장 공간을 포함하는 스택 프레임을 생성한다. 프로브의 실행 동안, 호출 프로그램, 래퍼 함수 및 프로브의 스택 프레임은 플랫폼의 호출 규칙을 준수할 것이다.
프로브 함수가 삽입되는 호출 프로그램 내의 위치에 기초하여 특정 실시예가 채용될 수 있다. 도 2a는 피호출 함수의 시작 부분에 프로브 함수가 삽입되는 본 발명의 일 실시예를 도시한다. 호출 프로그램(210)은 도 1에 도시된 호출 프로그램(110)의 동일한 부분을 나타낼 수 있다. 그러나, 함수 호출(112)(도 1)은 수정되어 "NewFunction"으로서 식별된 함수를 타겟으로 하는 함수 호출(212)을 만들었다.
이러한 수정은 예를 들어, 자동화, 반 자동화, 또는 수동 방식의 실행 코드 편집을 허용하는 종래의 개발 툴을 사용하여 행해질 수 있다. NewFunction은 래퍼 함수(220)로서 구현된다. NewFunction은 프로브 함수에 대한 함수 호출(226)을 포함한다. 함수 호출(226)에서 호출된 프로브 함수는, 실행 시간을 저장하는 것, 레지스터 값을 저장하는 것, 호출 스택을 저장하는 것 등과 같이, 피호출 함수의 시작 부분에서 실행되는 프로브 함수에 대해 본 기술분야에 알려져 있는 작업을 수행할 수 있다.
래퍼 함수(220)는 플랫폼의 상태를 보존하고, 스택 포인터를 래퍼 함수(220)에 할당된 스택 프레임의 밑바닥을 가리키도록 설정하는 프롤로그(222)를 포함한다. 래퍼 함수(220)는 플랫폼의 상태를 복원하고, 스택 포인터를 조정하여 래퍼 함수(220)에 할당된 스택 프레임을 할당해제하는 대응 에필로그(224)를 포함한다. 플랫폼의 상태는 프로세서의 레지스터 내의 값에 의해 반영될 수 있다. 플랫폼의 상태를 보존하기 위해 저장되어야 하는 특정 레지스터는 호출 규칙에 의존하며, 래퍼 함수(220)의 작업, 또는 래퍼 함수(220)가 호출할 수 있는 다른 함수에 의존할 수 있다. 여기에 일례로서 사용된 호출 규칙에서, 프롤로그(222)는 래퍼 함수(220)에 의해 수정된 휘발성 및 비휘발성 레지스터의 값, 및 래퍼 함수(220)에 의해 호출된 프로브 함수에서 수정되지만 보존되지는 않는 휘발성 레지스터의 값을 저장한다. 본 명세서의 특정 예에서는, 레지스터 RCX 및 RDX가 저장된다.
피검사 프로그램이 컴파일된 후에 래퍼 함수(220)에 대한 호출이 추가된다는 사실에도 불구하고, 래퍼 함수(220)는 플랫폼에 대한 호출 규칙에 준수한다. 따라서, 명령어(226)에서 호출된 프로브 함수 또는 래퍼 함수(220)의 실행 동안 예외가 발생하면, 예외 처리기의 작업은 호출 규칙을 벗어남으로써 방해 받지 않는다.
래퍼 함수(220)는 컨트롤 전송 명령어로 종결하는데, 여기에서는 jump 명령어(230)로 도시하였다. jump 명령어(230)의 타겟은 OriginalFunction이며, 이 예에서 OriginalFunction은 도 1에 도시된 피호출 프로그램(150)이다. 결과로서, 함수 호출(226)에서 지정한 프로브 함수가 초기의 피호출 프로그램(150)보다 먼저 실행된다는 것을 제외하고는, 함수 호출(212)을 실행한 최종 효과는 피검사 프로그램에서 함수 호출(112)의 실행과 동일하다.
도 2b는 피호출 프로그램 종결 부분에 프로브 함수가 삽입되는 일실시예를 도시한다. 이 실시예에서, 피호출 프로그램(250)은 피호출 프로그램(150)의 수정된 버전이다. 반환(return) 명령어(156)(도 1)가 수정된다는 것을 제외하고는, 피 호출 프로그램(250)은 피호출 프로그램(150)의 모든 명령어를 포함한다. 반환 명령어(156)는 jump 명령어(256)로 대체된다.
도 2a의 실시예에서와 같이, 도 2b에 제시된 실시예는 피검사 프로그램 내의 요구된 위치에서 프로브 함수를 호출하는 래퍼 함수의 실행을 도출한다. 이 실시예에서, 피호출 프로그램은 컨트롤 전송 명령어로 종결하는데, 여기에서는, "NewFunction2"로서 식별된, 래퍼 함수(260)에 컨트롤을 전송하는 jump 명령어(256)이다.
래퍼 함수(260)의 실행은 새로운 스택 프레임의 할당을 도출한다. 스택 프레임은 래퍼 함수(260)가 호출될 때에 프로그램의 상태를 보존하는 데 필요한 정보를 저장할 충분한 공간을 포함한다. 본 실시예에서, 래퍼 함수(260)는 스택 프레임을 설립하고 호출 규칙에 따라 상태를 보존하는 프롤로그(264)를 포함한다. 래퍼 함수(260)는 또한, 상태를 복원하고 스택 프레임을 언와인드(unwind)하는 에필로그(266)를 포함한다. 래퍼 함수(260)는 함수 호출(262)에서 호출된 프로브 함수를 초기화하는 데 사용될 수 있는 사전-호출 명령어(268)도 포함한다. 이 예에서, 사전-호출 명령어(268)는 프로브 함수에 전달될 매개변수를 호출 규칙에 따라 함수에 인수를 전달하는 데 사용되는 레지스터에 저장한다.
래퍼 함수(260)는 반환 명령어(270)로 종결한다. 래퍼 함수(260)는 call보다는 jump 명령어(256)에 의해 호출되었기 때문에, 래퍼 함수(260)의 종결 부분에서 실행되는 반환 명령어(270)는 종래기술에서와 같이, 피호출 프로그램(150)의 종결 부분에서 실행된 반환 명령어와 동일한 효과를 갖는다. 그러나, 도 2b에 도시된 명령어들을 실행하는 것의 최종 효과는, 피호출 프로그램(250)으로부터의 반환 이전에, 명령어(262)에서 호출된 프로브 함수가 실행되는 것이다. 이제 도 3을 참조하면, 다른 실시예의 일례가 제공된다. 도 3은 호출 프로그램(310)의 일부분을 도시한다. 이 실시예에서, 호출 프로그램(310)은 함수 호출(312) 직전과 직후에 프로브로 검사된다. 앞에 예에서와 같이, 각 프로브는 래퍼 함수에 대한 함수 호출을 추가함으로써 삽입된다. 함수 호출(317)은 함수 호출(312) 이전에 프로브를 추가하는 효과를 갖는다. 함수 호출(319)은 함수 호출에 의해 호출된 함수의 실행 이후에 프로브를 추가하는 효과를 갖는다. 이 예에서, 피호출 함수는 수정되지 않으며, 예를 들어, 도 1에서 도시되 함수(150)일 수 있다.
함수 호출(317)은 래퍼 함수(320)를 호출한다. 래퍼 함수(320)는 프롤로그 부분(322)과 에필로그 부분(324)을 포함한다. 프롤로그(322)는 스택 프레임을 설립하고, 래퍼 함수(320) 또는 래퍼 함수(320)가 호출한 프로브 함수에 의해 변경되는 휘발성 레지스터의 상태를 저장한다. 설명한 실시예에서, 래퍼 함수(320)는 직접 변경하지 않는 비휘발성 레지스터의 상태를 저장할 필요가 없다. 왜냐하면, 그러한 레지스터의 상태는 프로브 함수에 의해 보존되기 때문이다. 에필로그(324)는 스택 프레임을 언와인드(unwind)하고, 프롤로그(322) 내에 저장된 휘발성 레지스터의 값을 복원한다. 함수 호출(326)은 프로브 함수를 호출하는데, 프로브 함수는 종래기술의 프로브 함수일 수 있다. 사전-호출 명령어(328)는 플랫폼의 함수 호출 규칙에 따라 프로브 함수에 매개변수를 전달한다.
래퍼 함수(320)는 컨트롤 전송 명령어로 종결하는데, 여기에서는, 반환 명령 어(330)이다. 반환 명령어(330)는 함수 호출(312)이 실행되는 피호출 함수(310)에 컨트롤을 반환한다. 함수 호출(317)을 실행하는 최종 효과는, 함수 호출(312) 이전에 프로브 함수가 실행되는 것이지만, 호출 규칙이 충족된다는 것이다.
함수 호출(319)은 래퍼 함수(360)을 호출한다. 실행 시, 래퍼 함수(360)는 래퍼 함수 또는 래퍼 함수(360)에 의해 호출된 프로브 함수의 실행을 통해 변경될 수 있는 휘발성 레지스터에 대해 저장소를 제공하는 스택 프레임을 생성한다. 래퍼 함수(360)는 스택 프레임을 설립하고, 래퍼 함수(360) 또는 래퍼 함수(360) 내에 포함된 프로브 함수의 결과로서 변경될 수 있는 휘발성 레지스터의 상태를 저장하는 프롤로그(362)를 포함한다. 사전-호출 명령어(368)는 함수 호출(366)에서 호출된 프로브 함수에게 전달된 매개변수의 값을 설정한다. 에필로그(364)는 스택 프레임을 언와인드(unwind)하고, 프롤로그(362) 내에 저장된 휘발성 레지스터의 상태를 복원한다.
래퍼 함수(360)는 호출 프로그램(310)에 프로그램 실행을 반환하는 반환 명령어로 종결한다. 호출 프로그램(310)에서 실행되는 다음 명령어는 사후-호출 명령어(116)이다. 도 3에 도시된 호출 프로그램(310) 부분을 실행하는 최종 효과는, 설계된 함수 "Original Function"에 대한 함수 호출 전후에 프로브 함수가 호출되는 것을 제외하고는, 도 1에 도시된 호출 프로그램(110) 부분의 실행과 동일하다.
도 4에서, 프로그램이 검사될 수 있는 프로세스의 예를 도시한다. 도 4는 프로그램을 검사하는 프로세스(410)의 흐름도이다. 이 실시예에서, 프로그램은 이미 컴파일되어 있거나 그렇지 않으면 "바이너리" 또는 DLL 모듈과 같은 실행 파일로 변환되어 있다. 실행 파일은 프로그램을 실행하는 프로세서가 실행될 수 있는 각각의 명령어를 나타내는 바이너리 코드를 포함한다. 예를 들어, 도 4는 소프트웨어 개발 환경에서 인간 개발자가 성능 분석기 툴을 사용하여 산출한 프로세스를 나타낼 수 있다. 프로세스는 컴퓨터 실행가능 명령어로서, 또는 인간의 입력과 컴퓨터 실행가능 명령어의 결합된 액션에 의해 인코딩될 수 있다. 예를 들어, 도 4는 소프트웨어 개발 환경에서 인간 개발자가 성능 분석기 툴을 사용하여 산출한 프로세스를 도시한다.
실행 파일은 또한, 각 함수가 파일 내의 어느 곳에 위치하고 있는지를 나타내는 함수 테이블을 포함한다. 함수 테이블은 예외를 처리하거나 프로그램의 작업을 수행하는 데 필요한 정보를 포함한다. 예를 들어, 이 정보는 함수에 대해 생성된 스택 프레임 크기를 포함한다.
프로세스(410)는 프로세스 블럭(412)에서 시작한다. 프로세스 블럭(412)에서, 바이너리 파일은 디스어셈블된다. 파일은 전체가 디스어셈블될 수도 있고, 선택된 부분이 디스어셈블될 수도 있다. 설명된 실시예에서, 프로브 삽입 위치가 식별되게 하기 위해 바이너리의 충분한 부분이 디스어셈블된다.
현재의 프로그램 개발 환경은 종종, 인간 프로그램 개발자가 바이너리 파일이 생성된 후에 프로그램을 분석 또는 조작할 수 있도록 하는 디스어셈블리 툴을 포함한다. 종래의 통상적인 디스어셈블러가 사용될 수 있다. 인간 사용자를 위해 코드가 디스플레이되는 실시예에서, 전체 바이너리는 디스어셈블될 수 있고, 각 명령어에 대하여, 인간이 인식할 수 있는 연상기호(mnemonic)가 생성될 수 있다. 프로브 위치가 자동으로 식별되는 상황에서, 프로브가 삽입될 위치에 선행하고/하거나 후속하는 명령어의 시작 또는 종결을 인식하게 하는 위치까지만 코드를 디스어셈블하는 것이 충분할 수 있다.
프로세스는 프로세스 블럭(414)에서 계속된다. 프로세스 블럭(414)에서, 프로브가 삽입될 위치가 식별된다. 설명된 실시예에서, 프로브의 위치는 개발 환경이 제공한 사용자 인터페이스를 통해 인간 사용자가 한 위치를 지적함으로써 식별된다.
인간 사용자는 하나 이상의 프로브 위치를 지적한다. 도 4의 예에서, 단일 프로브에 대한 프로세스를 설명하였다. 예를 들어, 사용자는 사용자 인터페이스에 디스플레이된 코드 내의 한 위치를 가리킴으로써 프로브의 위치를 지적할 수 있다. 다르게, 사용자는 프로브가 삽입되는 위치의 특징을 지정함으로써 하나 이상의 프로브의 위치를 지적할 수 있다. 예를 들어, 사용자 인터페이스는, 인간 사용자가 프로브는 프로그램의 특정 영역에서 각 함수 호출의 앞과 뒤에, 또는 특정 모듈로부터 호출된 각 함수의 시작과 종결 부분에 삽입되어야 한다고 지정하게 할 수 있다. 프로브의 위치를 지정하는 특정 방법은 본 발명에 대한 제한이 아니다.
설명된 실시예에서, 프로브를 삽입하기 위해 취한 특정 처리 단계는 프로브가 삽입되는 위치에 의존한다. 함수 진입 부분에 삽입되는 프로브는 도 2a에 도시된 바와 같이 처리될 수 있다. 함수 종결 분분에 삽입되는 프로브는 도 2b에 도시된 바와 같이 처리될 수 있다. 호출 프로그램에서 함수 호출의 앞과 뒤와 같은 다른 위치에 삽입되는 프로브는 도 3에 도시된 바와 같이 처리될 수 있다. 판정 블 럭(416)은 프로브에 대한 지정된 위치가 함수의 진입 부분에로의 프로브의 배치를 요구하는지를 판정한다. 요구한다면, 처리는 프로세스 블럭(420)으로 진입한다.
프로세스 블럭(420)에서, 추가될 프로브를 나타내는 함수 및 래퍼 함수가 바이너리 파일에 추가된다. 이들 함수는 바이너리 파일 끝 부분에 실행 코드를 첨부함으로써 또는 임의의 다른 편리한 방법으로 추가될 수 있다. 프로브는 코드를 검사하는 데 통상적으로 사용된 프로브 함수일 수 있다. 래퍼 함수는 도 2a와 관련되어 설명된 바와 같이, 실행가능한 컴퓨터 명령어를 나타내는 바이너리 코드로 변환될 수 있다.
프로세스 블럭(422)에서, 함수 테이블은 추가된 함수를 나타내도록 갱신된다. 특히, 프로브 및 래퍼 함수가 함수 테이블에 추가되었다. 확장하여, 함수 테이블은 예외를 처리하는 데 필요한 함수에 관한 정보를 보유한다. 예를 들어, 함수 테이블 내의 항목은 함수에 할당된 스택 프레임 크기를 지정할 수 있다.
프로세스 블럭(424)에서, 바이너리 코드는 피검사 함수에 대한 임의의 호출을 새로이 추가된 래퍼 함수에 방향변경(redirection)하도록 수정된다. 도 2a의 설명된 실시예에서, 이러한 변경은 피검사 함수에 대한 함수 호출의 타겟을 래퍼 함수로 대체함으로써 이루어진다. 디스어셈블된 코드는 타겟 함수를 나타내는 바이너리 파일 내의 특정 바이트를 식별하는 데 사용되고, 따라서 수정이 필요하다. 이러한 대체는 디스어셈블된 프로그램에서 또는 직접, 바이너리 파일에서 이루어질 수 있다. 래퍼 함수는 코드에 추가될 때, 피검사 함수의 시작 부분으로의 컨트롤 명령어의 전송으로 종결한다.
판정 블럭(416)에서, 프로브의 위치가 함수의 진입 부분이 아니라고 판정하면, 처리는 판정 블럭(430)으로 진입한다. 판정 블럭(430)은 프로브가 함수 종결 부분에 삽입되는지를 판정한다.
프로브가 함수 종결 부분에 삽입된다면, 처리는 프로세스 블럭(440)으로 진입한다. 프로세스 블럭(440)에서, 래퍼 함수와 프로브 함수는 바이너리에 추가된다. 프로세스 블럭(420)에서와 같이, 이들 함수는 바이너리 파일 끝 부분에 실행 코드를 첨부함으로써, 또는 임의의 다른 편리한 방법으로 추가될 수 있다. 프로브 함수는 종해기술에서와 같은 프로브 함수일 수 있다. 래퍼 함수는 도 2b에 설명된 바와 같이, 실행가능한 컴퓨터 명령어를 나타내는 바이너리 코드로 변환될 수 있다.
블럭(442)에서, 바이너리 파일의 함수 테이블은 코드에 추가된 래퍼와 프로브 함수를 반영하도록 갱신된다. 블럭(422)에서와 같이, 함수 테이블을 갱신하는 것은, 추가된 함수를 식별하는 것 뿐만 아니라, 함수에 할당된 스택 프레임의 크기와 같은 예외 처리에 필요한 다른 정보도 포함한다.
프로세스 블럭(444)에서, 피검사 함수의 종료 명령어는 래퍼 함수로 방향변경된다. 도 2b에 도시하였듯이, 이러한 방향변경은 피검사 함수의 종결 부분에 있는 반환 명령어를 래퍼 함수에 점프하는 명령어로 대체하여 수행될 수 있다. 본 실시예에서, 단계(440)에서 추가된 래퍼 함수는 호출 프로그램으로의 적절한 반환을 제공하는 반환 명령어로 종결한다.
판정 블럭(430)은 프로브 위치가 함수의 종결 부분에 있지 않다고 판정하면, 프로세스는 프로세스 블럭(450)으로 진입한다. 설명된 실시예에서, 프로브 위치는 함수 진입 부분, 함수 종료 부분, 또는 함수 호출 직전 또는 직후로 제한되어 있다. 프로세스가 프로세스 블럭(450)에 진입하면, 프로브 위치는 함수 진입 또는 종결 부분에 있지 않고, 따라서 함수 호출 직전 또는 직후에 있는 것으로서 다루어진다.
프로세스 블럭(450)에서, 래퍼 함수와 프로브 함수는 바이너리에 추가된다. 프로세스 블럭(420)에서와 같이, 이들 함수는 바이너리 파일 끝 부분에 실행 코드를 첨부함으로써, 또는 임의의 다른 편리한 방법으로 추가될 수 있다.
블럭(452)에서, 바이너리 파일의 함수 테이블은 코드에 추가된 래퍼와 프로브 함수를 반영하도록 갱신된다. 블럭(422)에서와 같이, 함수 테이블을 갱신하는 것은 추가된 함수를 식별하는 것 뿐만 아니라, 함수에 할당된 스택 프레임의 크기와 같은 예외 처리에 필요한 다른 정보도 포함한다.
프로세스 블럭(454)에서, 래퍼 함수에 대한 호출은 검사될 코드 내의 적절한 위치에 삽입된다. 호출 명령어를 추가하는 것은 검사될 함수를 나타내는 바이너리 파일 부분 길이를 변경한다. 피검사 함수의 길이를 변경하는 것이 바이너리 파일에 저장되어 있는 피검사 함수 또는 다른 함수에 관한 정보의 어느 것에라도 영향을 주는 경우, 그 정보 또한 갱신된다. 이러한 방식으로, 바이너리 파일은 프로브를 추가한 후에도 여전히 적절하게 실행될 수 있다.
도 4에서 도시한 프로세스는 프로그램에 하나의 프로브를 추가하는 데 필요한 단계를 나타낸다. 하나의 프로그램을 테스트하기 위해, 일반적으로 다수의 프 로브가 추가된다. 도 4에서 도시한 프로세스는 삽입되는 각 프로브에 대해 반복될 수 있다. 프로세스 단계를 중복할 때, 몇몇 액션들이 결합도리 수 있다. 예를 들어, 함수 테이블은 추가된 함수 모두에 대해 동시에 갱신될 수 있다. 또는, 동일한 프로브 또는 래퍼 함수를 복수의 프로브 삽입에 사용하여, 함수 테이블에 추가되거나 바이너리 파일에 첨부해야 되는 함수의 총 갯수를 감소시킨다.
모든 요구된 프로브를 추가한 프로세스의 완료시, 피검사 프로그램이 실행될 수 있다. 프로브 함수는 호출 시, 예를 들어 로그 파일에 기록함으로써 피검사 프로그램에 관한 동작 정보를 캡처할 수 있다. 그리고, 이 정보는 기계에 의해 분석되거나 인간 운영자에게 디스플레이되기 위해 처리될 수 있다. 그리고, 이러한 정보는 피검사 프로그램을 디버그하거나 피검사 프로그램의 성능을 분석하기 위해 사용될 수 있다.
이와 같이 본 발명의 적어도 한 실시예의 여러 관점을 설명하였지만, 다양한 변경, 수정, 및 개선은 본 기술 영역의 기술자에게 쉽게 생각이 나는 것임을 인식하여야 한다.
예를 들어, 작업이 수행되는 특정 순서는 본 발명에 중요하지 않다. 프로브를 호출하는 새로운 함수에 대한 호출로 대체되는 초기 함수에 대한 호출 명령어를 식별하기 위해 바이너리 파일을 디스어셈블하는 것을 설명하였다. 새로운 함수를 호출하기 위해 바이너리 파일에 바이너리 코드를 삽입함으로써, 또는 디스어셈블된 코드를 수정하고, 수정된 코드를 실행 코드로 재변환함으로써 대체가 이루어지는지는 중요하지 않다.
또한, 본 발명은 바이너리 파일로서 저장된 실행 코드와 관련하여 설명되었다. 그 정보를 저장하기 위해 사용되는 파일 구조는 본 발명에 대한 제한이 아니다. 실행가능 프로그램으로서 컴퓨터에 의해 처리될 수 있는 정보의 임의의 배열은 실행 파일로 간주될 수 있다. 게다가, 실행 파일을 포함하는 파일은 명령어 및 함수 테이블로 제한될 필요가 없다. 실행 파일은 다른 정보를 포함할 수 있다. 더욱이, 실행 파일은 함수 테이블을 포함할 필요가 없다. 예외 처리 또는 코드 실행에 필요한 정보는 어떤 방법으로든 저장될 수 있다. 플랫폼에 대해 설립된 규칙에 따라 파일을 처리함으로써 정보는 명확하게 저장되거나 확정될 수 있다.
본 발명의 상기 설명된 실시예는 다양한 방법으로 구현될 수 있다. 예를 들어, 실시예는 하드웨어, 소프트웨어 또는 이들의 결합으로 구현될 수 있다. 소프트웨어로 구현될 때, 소프트웨어 코드는 단일 컴퓨터가 제공하거나 다수 컴퓨터에 분산된 적당한 프로세서 또는 프로세서 군집에서 실행된다. 위에 설명된 함수를 수행하는 컴포넌트 또는 컴포넌트 군집은 일반적으로 위에 논의된 함수를 제어하는 하나 이상의 컨트롤러로 간주될 수 있다는 것을 인식하여야 한다. 하나 이상의 컨트롤러는 위에 서술한 함수를 수행하기 위해 마이크로코드 또는 소프트웨어를 사용하여 프로그램된 전용 하드웨어 또는 범용 하드웨어(예를 들어, 하나 이상의 프로세서)에 의한 것와 같은 다수의 방법으로 구현된다.
또한, 여기에서 간략하게 설명된 다양한 방법 또는 프로세스는 다양한 운영시스템 또는 플랫폼 중 어느 하나를 사용하는 하나 이상의 프로세서에서 실행될 수 있는 소프트웨어로서 코딩될 수 있다. 게다가, 이런 소프트웨어는 많은 적당한 프 로그래밍 언어 및/또는 전통적인 프로그래밍 또는 스크립트 툴 중 어느 것이든 사용하여 작성될 수 있고, 또한 실행 기계 언어 코드로서 컴파일될 수 있다.
본 관점에서, 본 발명의 한 실시예는 위에 토론한 본 발명의 다양한 실시예를 구현하는 방법을 수행하는 - 하나 이상의 컴퓨터 또는 다른 프로세서에서 실행될 때 - 하나 이상의 프로그램과 함께 인코드된 컴퓨터 판독가능 매체(또는 다수의 컴퓨터 판독가능 매체)(예, 컴퓨터 메모리, 하나 이상의 플로피 디스크, 광 디스크, 자기 테이프, 등)를 지향한다. 컴퓨터 판독 가능 매체 또는 미디어는 수송할 수 있어, 프로그램 또는 매체에 저장된 프로그램은 위에 토론된 본 발명의 다양한 관점을 구현하기 위해 하나 이상의 상이 컴퓨터 또는 다른 프로세서에 로드될 수 있다.
여기에서, 용어 "프로그램"(program)은 위에 토론된 본 발명의 다양한 관점을 구현하기 위해 하나 이상의 컴퓨터 또는 다른 프로세서가 사용하는 프로그램 코드 또는 명령어 집합의 어떤 형식이든지 참조하기 위해 포괄적인 의식으로 사용되었다. 게다가, 본 실시예의 관점에 의거하여, 실행될 때 본 발명의 방법을 수행하는 하나 이상의 프로그램은 단일 컴퓨터 또는 프로세서에 상주할 필요는 없으며, 그러나 본 발명의 다양한 관점을 구현하기 위해 다수의 상이 컴퓨터 또는 프로세서 중에 모듈 방식으로 분산되는 것을 인식하여야 한다. 마찬가지로, 용어 "함수"(function)는 컨트롤을 전송 받는 프로그램의 부분을 참조하기 위해 포괄적인 의식으로 사용되었다. 몇몇 프로그래밍 언어는 함수라 일컫는 특정 구조를 제공한다. 여기에서 상기 용어의 사용은 그리 제한되지 않는다. 상기 용어는 서브 프로 그램, 방법, 프로시저 또는 다른 이름으로 지정된 프로그램의 부분을 포함하도록 의도되었다.
본 발명의 다양한 관점은 단독으로, 결합으로, 또는 앞에 설명한 실시예에서 명확히 토론하지 않은 다양한 배치로 사용하고, 그러므로 앞에 설명에서 서술된 또는 도면에서 도시된 컴포넌트의 기술 및 배치에 대한 애플리케이션에서 제한되지 않는다. 예를 들어, 한 실시예에서 설명된 관점은 다른 실시예에서 설명된 관점과 함께 어떤 방식으로든 결합한다.
청구 범위 요소를 수식하기 위해 청구 범위에서 "제1"(first), "제2"(second), "제3"(third), 등과 같은 서수 용어의 사용은 자체적으로 한 청구 범위 요소가 다른 청구 범위 요소에 대해 그 어떤 우선, 선행, 또는 순서 또는 방법의 동작이 수행되는 일시적인 순서도 의미하지 않으며, 청구 범위의 요소를 구분하기 위해 특정 이름의 한 청구 범위 요소를 똑 같은 이름(단지 서수 용어의 사용 목적으로)의 다른 요소와 구분하는 라벨로 사용되었다.
또한, 여기에서 사용한 어법 및 전문 용어는 설명의 목적으로 사용한 것이며, 제한으로 간주하려는 것이 아니다. 여기에서 "포함하여"(including), "구성하는"(comprising), 또는 "갖춘"(having), "포함하는"(containing), "수반하는"(involving), 및 그 것들의 변화의 사용은 구 후에 열거된 항목 및 추가된 항목뿐만 아니라 그것의 동등한 것도 포함한다.
상기의 변경, 수정 및 개선은 본 설명서 부분에 해당하며, 그리고 본 발명의 사상과 범위에 속한다. 따라서, 앞에 설명과 도면은 단지 예일 뿐이다.
본 발명은, 오류가 발생하는 플랫폼에 맞추어 개발된 프로그램을 검사하여, 프로브 함수가 플랫폼의 호출 규칙을 위반하지 않고 호출되게 한다.

Claims (20)

  1. 소프트웨어 프로그램을 검사(instrumenting)하는 방법으로서 - 상기 소프트웨어 프로그램은 실행될 때 동작 상태(operating state)와 복수의 위치(location)를 가지며, 적어도 하나의 프로브 함수(probe function)가 상기 소프트웨어 프로그램 내의 한 위치에서 상기 동작 상태에 관한 정보를 기록하도록 구성되어 있음 -,
    래퍼 함수(wrapper function)를 실행시키기 위해 상기 소프트웨어 프로그램을 수정하는 단계 - 상기 래퍼 함수는 상기 프로브 함수를 실행시키는 적어도 하나의 컴퓨터 실행가능 명령어를 포함함 -
    를 포함하고,
    상기 소프트웨어 프로그램을 수정하는 단계는,
    상기 소프트웨어 프로그램 내의 검사될 제1 함수 내의 제1 위치를 식별하는 단계 - 상기 제1 함수는 상기 프로브 함수 및 상기 래퍼 함수와 별개임 -;
    상기 제1 위치가 상기 제1 함수의 진입점(entry point)인지의 여부를 결정하는 단계;
    상기 제1 위치가 상기 제1 함수의 진입점인 경우:
    상기 소프트웨어 프로그램에서 상기 제1 함수를 실행시키는 명령어를 식별하는 단계,
    상기 소프트웨어 프로그램에서, 상기 제1 함수를 실행시키는 상기 명령어를 상기 래퍼 함수를 실행시키는 명령어로 대체하는 단계, 및
    상기 래퍼 함수 내에, 상기 제1 함수를 실행시키는 명령어를 포함시키는 단계;
    상기 제1 위치가 상기 제1 함수의 종료점(exit point)인지의 여부를 결정하는 단계; 및
    상기 제1 위치가 상기 제1 함수의 종료점인 경우:
    상기 소프트웨어 프로그램에서 타겟 위치에 있는 명령어를 실행시키는, 상기 제1 함수 내의 명령어를 식별하는 단계,
    상기 소프트웨어 프로그램에서, 상기 식별된 명령어를 상기 래퍼 함수를 실행시키는 명령어로 대체하는 단계, 및
    상기 래퍼 함수 내에, 상기 타겟 위치에 있는 명령어를 실행시키는 명령어를 포함시키는 단계를 포함하는
    방법.
  2. 제1항에 있어서,
    상기 프로브 함수는 상기 소프트웨어 프로그램의 동작 상태에 관한 정보를 로그 파일(log file)에 작성하는 적어도 하나의 컴퓨터 실행가능 명령어를 포함하고, 상기 래퍼 함수는 상기 소프트웨어 프로그램의 동작 상태를 나타내는 정보를 저장하는 래퍼 함수를 포함하는
    방법.
  3. 제1항에 있어서,
    상기 소프트웨어 프로그램은 적어도 하나의 실행 파일로 표현되고,
    상기 소프트웨어 프로그램을 수정하는 단계는, 상기 제1 위치를 식별하는 단계 전에 상기 적어도 하나의 실행 파일의 적어도 한 부분을 디스어셈블(disassemble)하는 단계를 더 포함하고,
    상기 제1 위치가 상기 제1 함수의 진입점인 경우에 있어서, 상기 식별하는 단계, 상기 대체하는 단계 및 상기 포함시키는 단계가 상기 적어도 하나의 실행 파일의 디스어셈블된 부분에 대해 수행되고, 상기 제1 위치가 상기 제1 함수의 종료점인 경우에 있어서, 상기 식별하는 단계, 상기 대체하는 단계 및 상기 포함시키는 단계가 상기 적어도 하나의 실행 파일의 디스어셈블된 부분에 대해 수행되는
    방법.
  4. 제3항에 있어서,
    상기 적어도 하나의 실행 파일에서 상기 제1 함수를 실행시키는 명령어를 상기 래퍼 함수를 실행시키는 명령어로 대체하는 것은 상기 제1 함수에 대한 호출을 상기 래퍼 함수에 대한 호출로 대체하는 것을 포함하는
    방법.
  5. 제4항에 있어서,
    상기 래퍼 함수 내에 상기 제1 함수를 실행시키는 명령어를 포함시키는 것은 상기 래퍼 함수 내에 상기 제1 함수를 타겟으로 하는 점프 명령어를 포함시키는 것을 포함하는
    방법.
  6. 제1항에 있어서,
    상기 소프트웨어 프로그램은 적어도 하나의 실행 파일로 표현되고,
    상기 소프트웨어 프로그램을 수정하는 단계는,
    상기 제1 위치가 상기 제1 함수의 진입점이 아니며 상기 제1 위치가 상기 제1 함수의 종료점이 아닌지의 여부를 결정하는 단계;
    상기 제1 위치가 상기 제1 함수의 진입점이 아니며 상기 제1 위치가 상기 제1 함수의 종료점이 아닌 경우:
    상기 제1 위치에서 상기 적어도 하나의 실행 파일 내에, 상기 래퍼 함수를 실행시키는 실행될 명령어를 삽입하는 단계; 및
    상기 제1 위치의 다음 위치에 있는 상기 소프트웨어 프로그램 내의 명령어를 실행시키는 명령어를 상기 래퍼 함수 내에 포함시키는 단계를 더 포함하는
    방법.
  7. 제1항에 있어서,
    상기 소프트웨어 프로그램은, X64 확장(extension)이 있는 프로세서에 의해 처리될 수 있는 명령어들을 포함하는 적어도 하나의 실행 파일로 표현되는
    방법.
  8. 제1항에 있어서,
    상기 래퍼 함수는 상기 프로브 함수가 호출된 후에 저장된 정보로부터 상기 소프트웨어 프로그램의 동작 상태를 복원하는 적어도 하나의 컴퓨터 실행가능 명령어를 포함하는
    방법.
  9. 제1항에 있어서,
    상기 타겟 위치에 있는 명령어를 실행시키는 명령어는 반환(return) 명령어를 포함하는
    방법.
  10. 값들을 지닌 레지스터들과 함수 호출 시에 상기 레지스터들 중 적어도 하나의 레지스터 내의 값들이 보존되는 호출 규칙(calling convention)을 갖는 플랫폼 상에 복수의 위치를 갖는 소프트웨어 프로그램을 테스트하는 방법으로서,
    상기 방법은, 래퍼 함수로부터 적어도 하나의 프로브 함수를 실행하여 상기 프로그램 내의 제1 함수 내의 피검사 위치를 검사하는 것을 포함하는 유형이며 - 상기 제1 함수는 상기 래퍼 함수와 별개이고 상기 프로브 함수와 별개임 -,
    상기 방법은,
    상기 피검사 위치가 상기 제1 함수의 진입점인 경우:
    상기 제1 함수를 실행시키는 명령어 대신에, 상기 래퍼 함수를 실행시키는 명령어를 실행하고,
    상기 래퍼 함수 내로부터, 상기 플랫폼의 상태를 보존하고 상기 프로브 함수를 호출하고 상기 플랫폼의 상태를 복원하고 상기 제1 함수를 실행시키는 명령어를 실행하며,
    상기 피검사 위치가 상기 제1 함수의 종료점인 경우:
    상기 제1 함수 내로부터, 상기 래퍼 함수를 타겟으로 하는 점프 명령어를 실행하고,
    상기 래퍼 함수 내로부터, 상기 플랫폼의 상태를 보존하고 상기 프로브 함수를 호출하고 상기 플랫폼의 상태를 복원하고 반환 명령어를 실행함으로써,
    상기 소프트웨어 프로그램을 실행하는 단계를 더 포함하는
    방법.
  11. 제10항에 있어서,
    상기 래퍼 함수를 실행시키는 명령어를 실행하는 것은, 상기 래퍼 함수의 스택 프레임(stack frame)을 형성하는 것을 더 포함하는
    방법.
  12. 제11항에 있어서,
    상기 플랫폼의 상태를 보존하는 것은, 상기 래퍼 함수의 스택 프레임에 적어도 하나의 레지스터의 값을 저장하는 것을 포함하는
    방법.
  13. 제10항에 있어서,
    상기 래퍼 함수를 실행시키는 명령어를 실행하는 것은, 상기 래퍼 함수를 타겟으로 하는 호출 명령어를 실행하는 것을 포함하며,
    상기 제1 함수를 실행시키는 명령어를 실행하는 것은, 상기 제1 함수를 타겟으로 하는 점프 명령어를 실행하는 것을 포함하는
    방법.
  14. 제10항에 있어서,
    상기 피검사 위치가 상기 제1 함수의 진입점이 아니며 상기 제1 함수의 종료점이 아닌 경우:
    상기 래퍼 함수를 타겟으로 하는 호출 명령어를 실행하고,
    상기 래퍼 함수 내로부터, 상기 플랫폼의 상태를 보존하고 상기 프로브 함수를 호출하고 상기 플랫폼의 상태를 복원하고 반환 명령어를 실행하는 단계를 더 포함하는
    방법.
  15. 소프트웨어 프로그램의 개발 환경을 구현하는 컴퓨터 실행가능 명령어를 갖는 컴퓨터 판독가능 기록 매체로서,
    상기 소프트웨어 프로그램의 개발 환경을 구현하는 컴퓨터 실행가능 명령어는,
    a) 프로브 함수 및 상기 프로브 함수를 호출하는 래퍼 함수를 포함하도록, 상기 소프트웨어 프로그램의 실행가능 버전을 포함하는 바이너리 파일을 수정하는 것을 수행하는 컴퓨터 실행가능 명령어;
    b) 상기 바이너리 파일에서 프로브 함수가 실행될 제1 함수를 식별하는 것을 수행하는 컴퓨터 실행가능 명령어 - 상기 제1 함수는 상기 래퍼 함수와 별개이고 상기 프로브 함수와 별개임 -; 및
    c) 상기 제1 함수 내의 반환 명령어를 상기 래퍼 함수를 타겟으로 하는 점프 명령어로 대체하는 것을 수행하는 컴퓨터 실행가능 명령어를 포함하는
    컴퓨터 판독가능 기록 매체.
  16. 제15항에 있어서,
    상기 소프트웨어 프로그램의 개발 환경을 구현하는 컴퓨터 실행가능 명령어는 상기 바이너리 파일에서 피식별 위치를 식별하는 것을 수행하는 컴퓨터 실행가능 명령어를 또한 포함하고, 상기 바이너리 파일에서 피식별 위치를 식별하는 것을 수행하는 컴퓨터 실행가능 명령어는 사람으로부터 입력을 받는 것을 수행하는 컴퓨터 실행가능 명령어를 포함하는
    컴퓨터 판독가능 기록 매체.
  17. 제15항에 있어서,
    상기 바이너리 파일을 수정하는 것을 수행하는 컴퓨터 실행가능 명령어는 상기 바이너리 파일에 상기 프로브 함수 및 상기 래퍼 함수의 실행가능 버전을 첨부하는 것을 수행하는 컴퓨터 실행가능 명령어를 포함하는
    컴퓨터 판독가능 기록 매체.
  18. 제17항에 있어서,
    상기 바이너리 파일을 수정하는 것을 수행하는 컴퓨터 실행가능 명령어는 상기 래퍼 함수에 관련된 식별 정보를 포함하도록 함수 테이블을 수정하는 것을 수행하는 컴퓨터 실행가능 명령어를 더 포함하는
    컴퓨터 판독가능 기록 매체.
  19. 제17항에 있어서,
    상기 소프트웨어 프로그램의 개발 환경을 구현하는 컴퓨터 실행가능 명령어는 상기 래퍼 함수를 실행시키는 명령어를 피식별 위치에서 제공하는 것을 수행하는 컴퓨터 실행가능 명령어를 또한 포함하고, 상기 래퍼 함수를 실행시키는 명령어를 피식별 위치에서 제공하는 것을 수행하는 컴퓨터 실행가능 명령어는 상기 소프트웨어 프로그램의 명령어를 나타내는 상기 바이너리 파일의 일부분을 변경하는 것을 수행하는 컴퓨터 실행가능 명령어를 포함하는
    컴퓨터 판독가능 기록 매체.
  20. 삭제
KR1020060018161A 2005-03-24 2006-02-24 제한적인 호출 규칙을 갖춘 코드의 검사 방법 KR101247062B1 (ko)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
US11/088,452 US7757218B2 (en) 2005-03-24 2005-03-24 Method of instrumenting code having restrictive calling conventions
US11/088,452 2005-03-24

Publications (2)

Publication Number Publication Date
KR20060103103A KR20060103103A (ko) 2006-09-28
KR101247062B1 true KR101247062B1 (ko) 2013-03-26

Family

ID=36847828

Family Applications (1)

Application Number Title Priority Date Filing Date
KR1020060018161A KR101247062B1 (ko) 2005-03-24 2006-02-24 제한적인 호출 규칙을 갖춘 코드의 검사 방법

Country Status (5)

Country Link
US (1) US7757218B2 (ko)
EP (2) EP2565785B1 (ko)
JP (1) JP5129929B2 (ko)
KR (1) KR101247062B1 (ko)
CN (1) CN1838088B (ko)

Families Citing this family (26)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7568186B2 (en) * 2005-06-07 2009-07-28 International Business Machines Corporation Employing a mirror probe handler for seamless access to arguments of a probed function
US7870542B1 (en) * 2006-04-05 2011-01-11 Mcafee, Inc. Calling system, method and computer program product
US7814465B2 (en) * 2006-05-12 2010-10-12 Oracle America, Inc. Method and apparatus for application verification
US8959647B2 (en) * 2007-02-27 2015-02-17 Microsoft Corporation Runtime security and exception handler protection
US20090217241A1 (en) * 2008-02-22 2009-08-27 Tetsuro Motoyama Graceful termination of a web enabled client
US8291399B2 (en) * 2008-03-26 2012-10-16 Avaya Inc. Off-line program analysis and run-time instrumentation
US8752007B2 (en) * 2008-03-26 2014-06-10 Avaya Inc. Automatic generation of run-time instrumenter
US8739145B2 (en) * 2008-03-26 2014-05-27 Avaya Inc. Super nested block method to minimize coverage testing overhead
US8484623B2 (en) * 2008-03-26 2013-07-09 Avaya, Inc. Efficient program instrumentation
US8271958B2 (en) * 2008-12-12 2012-09-18 Microsoft Corporation Remapping debuggable code
US20110214106A1 (en) * 2010-02-26 2011-09-01 International Business Machines Corporation Indicating the effect of program modifications on program performance in an integrated development environment
CN102169450A (zh) * 2010-02-26 2011-08-31 国际商业机器公司 在ide中提示程序修改对程序性能的影响的方法和装置
US8713540B2 (en) 2010-07-29 2014-04-29 National Instruments Corporation Generating and modifying textual code interfaces from graphical programs
US9116717B2 (en) * 2011-05-27 2015-08-25 Cylance Inc. Run-time interception of software methods
US8615745B2 (en) 2011-10-03 2013-12-24 International Business Machines Corporation Compiling code for an enhanced application binary interface (ABI) with decode time instruction optimization
US8612959B2 (en) 2011-10-03 2013-12-17 International Business Machines Corporation Linking code for an enhanced application binary interface (ABI) with decode time instruction optimization
US8756591B2 (en) 2011-10-03 2014-06-17 International Business Machines Corporation Generating compiled code that indicates register liveness
US9003379B2 (en) * 2011-12-12 2015-04-07 Zynga Inc. Methods and systems for generating test information from a source code
IN2013MU01201A (ko) * 2013-03-28 2015-04-10 Tata Consultancy Services Ltd
US20150033209A1 (en) * 2013-07-26 2015-01-29 Netapp, Inc. Dynamic Cluster Wide Subsystem Engagement Using a Tracing Schema
EP3289446A1 (en) * 2015-04-30 2018-03-07 Entit Software LLC Classification of application events using call stacks
US9858109B2 (en) * 2016-02-26 2018-01-02 Red Hat Israel, Ltd. Module management in a protected kernel environment
US10346293B2 (en) * 2017-10-04 2019-07-09 International Business Machines Corporation Testing pre and post system call exits
US10671363B2 (en) 2018-10-31 2020-06-02 International Business Machines Corporation Generating code for function calls that use multiple addressing modes
US10671362B2 (en) 2018-10-31 2020-06-02 International Business Machines Corporation Generating code for function calls that use multiple addressing modes
US11599342B2 (en) * 2020-09-28 2023-03-07 Red Hat, Inc. Pathname independent probing of binaries

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO1997014096A1 (en) 1995-10-13 1997-04-17 Sevone Software, Inc. System and method for debugging computer software
JP2004164554A (ja) 2002-09-24 2004-06-10 Hitachi Ltd プログラム実行監視装置および方法

Family Cites Families (21)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5732273A (en) * 1995-08-11 1998-03-24 Digital Equipment Corporation System for monitoring compute system performance
JPH09319617A (ja) * 1996-05-30 1997-12-12 Mitsubishi Electric Corp ソフトウエア開発システム、プログラム実行方法、プログラム作成方法、トレース装置および方法、計算機装置、ならびにプログラムの評価方法
US6721941B1 (en) * 1996-08-27 2004-04-13 Compuware Corporation Collection of timing and coverage data through a debugging interface
US6771381B1 (en) * 1998-11-13 2004-08-03 Laurence C. Klein Distributed computer architecture and process for virtual copying
US6481008B1 (en) 1999-06-30 2002-11-12 Microsoft Corporation Instrumentation and optimization tools for heterogeneous programs
US20020066081A1 (en) * 2000-02-09 2002-05-30 Evelyn Duesterwald Speculative caching scheme for fast emulation through statically predicted execution traces in a caching dynamic translator
JP2001222447A (ja) * 2000-02-09 2001-08-17 Hitachi Ltd 実動作環境下のデバッグ方法及びデバッグ対象装置
US7017154B2 (en) 2001-03-23 2006-03-21 International Business Machines Corporation Eliminating store/restores within hot function prolog/epilogs using volatile registers
US6918110B2 (en) * 2001-04-11 2005-07-12 Hewlett-Packard Development Company, L.P. Dynamic instrumentation of an executable program by means of causing a breakpoint at the entry point of a function and providing instrumentation code
US6857119B1 (en) * 2001-09-25 2005-02-15 Oracle International Corporation Techniques for modifying a compiled application
JP2003140921A (ja) * 2001-10-29 2003-05-16 Sony Corp データ処理システム及びデータ処理方法、並びに記憶媒体
US6907519B2 (en) * 2001-11-29 2005-06-14 Hewlett-Packard Development Company, L.P. Systems and methods for integrating emulated and native code
US7281242B2 (en) * 2002-01-18 2007-10-09 Bea Systems, Inc. Flexible and extensible Java bytecode instrumentation system
US7107579B2 (en) * 2002-05-09 2006-09-12 Hewlett-Packard Development Company, L.P. Preserving program context when adding probe routine calls for program instrumentation
US20030216960A1 (en) * 2002-05-16 2003-11-20 Richard Postrel System and method for offering geocentric-based incentives and executing a commercial transaction via a wireless device
US7353501B2 (en) * 2002-11-18 2008-04-01 Microsoft Corporation Generic wrapper scheme
US20040168156A1 (en) * 2003-01-22 2004-08-26 Robert Hundt Dynamic instrumentation of related programming functions
US20050039171A1 (en) * 2003-08-12 2005-02-17 Avakian Arra E. Using interceptors and out-of-band data to monitor the performance of Java 2 enterprise edition (J2EE) applications
US7475394B2 (en) * 2003-12-05 2009-01-06 Arm Limited System and method of analyzing interpreted programs
KR100617698B1 (ko) * 2004-06-07 2006-08-28 삼성전자주식회사 기능별 데이터 저장을 위한 바이너리 파일 생성 장치 및방법과 그 방법이 저장된 컴퓨터 판독 가능한 저장 매체
US7519944B2 (en) * 2004-11-05 2009-04-14 International Business Machines Corporation Computer method and system for executing post-processing logic depending on function exit type

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO1997014096A1 (en) 1995-10-13 1997-04-17 Sevone Software, Inc. System and method for debugging computer software
JP2004164554A (ja) 2002-09-24 2004-06-10 Hitachi Ltd プログラム実行監視装置および方法

Also Published As

Publication number Publication date
KR20060103103A (ko) 2006-09-28
EP2565785A1 (en) 2013-03-06
CN1838088B (zh) 2012-03-21
JP5129929B2 (ja) 2013-01-30
US20060218537A1 (en) 2006-09-28
CN1838088A (zh) 2006-09-27
US7757218B2 (en) 2010-07-13
JP2006268833A (ja) 2006-10-05
EP2565785B1 (en) 2017-11-29
EP1705568A2 (en) 2006-09-27
EP1705568B1 (en) 2017-09-27
EP1705568A3 (en) 2010-03-24

Similar Documents

Publication Publication Date Title
KR101247062B1 (ko) 제한적인 호출 규칙을 갖춘 코드의 검사 방법
US5987250A (en) Transparent instrumentation for computer program behavior analysis
US9274923B2 (en) System and method for stack crawl testing and caching
US5528753A (en) System and method for enabling stripped object software monitoring in a computer system
US5778233A (en) Method and apparatus for enabling global compiler optimizations in the presence of exception handlers within a computer program
US6311324B1 (en) Software profiler which has the ability to display performance data on a computer screen
JP4901075B2 (ja) コンピュータ読取可能な媒体、方法及びコンピューティングデバイス
US6490721B1 (en) Software debugging method and apparatus
US7698697B2 (en) Transforming code to expose glacial constants to a compiler
US20060259830A1 (en) Real-time software diagnostic tracing
US20120317551A1 (en) Post-compile instrumentation of object code for generating execution trace data
US8161465B2 (en) Method and apparatus for performing conditional compilation
US7016807B2 (en) Device and method for monitoring a program execution
US20130318504A1 (en) Execution Breakpoints in an Integrated Development Environment for Debugging Dataflow Progrrams
US8843899B2 (en) Implementing a step-type operation during debugging of code using internal breakpoints
JP2000181725A (ja) 実行可能なコ―ドを改変し、追加機能を付与するための方法およびシステム
US6901583B1 (en) Method for testing of a software emulator while executing the software emulator on a target machine architecture
US20110126179A1 (en) Method and System for Dynamic Patching Software Using Source Code
US7877738B2 (en) Speculative compilation
CN111796831A (zh) 一种多芯片兼容的编译方法和装置
KR20100106409A (ko) 다중 언어 소프트웨어 코드 분석
US7493604B2 (en) Conditional compilation of intermediate language code based on current environment
US20080127118A1 (en) Method and system for dynamic patching of software
US20050114847A1 (en) Method, apparatus and computer program for automatically determining compile-time module dependencies
US5812828A (en) Function simulation

Legal Events

Date Code Title Description
A201 Request for examination
E701 Decision to grant or registration of patent right
GRNT Written decision to grant
FPAY Annual fee payment

Payment date: 20160218

Year of fee payment: 4

FPAY Annual fee payment

Payment date: 20170220

Year of fee payment: 5

FPAY Annual fee payment

Payment date: 20180219

Year of fee payment: 6

FPAY Annual fee payment

Payment date: 20200218

Year of fee payment: 8