다음을 통해 공유


.call(호출 함수)

.call 명령을 사용하면 대상 프로세스가 함수를 실행합니다.

.call [/v] Function( Arguments ) 
.call /s Prototype Function( Arguments ) 
.call /c 
.call /C 

매개 변수

/V
호출 및 해당 인수에 대한 자세한 정보가 표시됩니다.

/s프로토타입
올바른 기호가 없더라도 함수로 지정된 함수 를 호출할 수 있습니다. 이 경우 호출하려는 함수와 동일한 호출 프로토타입을 가진 다른 함수에 대한 기호가 있어야 합니다. Prototype 매개 변수는 이 프로토타입 함수의 이름입니다.

함수
호출되는 함수를 지정합니다. 함수의 이름(모듈 이름으로 정규화됨) 또는 함수 주소로 계산되는 다른 식일 수 있습니다. 생성자 또는 소멸자를 호출해야 하는 경우 주소를 제공해야 합니다. 그렇지 않으면 C++ 식을 사용하여 연산자에 대한 명명된 구문을 평가해야 합니다(자세한 내용은 숫자 식 구문 참조).

인수
함수에 전달된 인수를 지정합니다. 메서드를 호출하는 경우 첫 번째 인수는 인수여야 하며 다른 모든 인수는 메서드를 따릅니다. 인수는 쉼표로 구분해야 하며 일반적인 인수 구문과 일치해야 합니다. 가변 길이 인수 목록이 지원됩니다. 인수 내의 식은 C++ 식 계산기에서 구문 분석됩니다. 자세한 내용은 C++ 숫자 및 연산자를 참조하세요. 리터럴 문자열을 인수로 입력할 수는 없지만 문자열에 대한 포인터 또는 대상 프로세스에 액세스할 수 있는 다른 메모리를 사용할 수 있습니다.

/C
현재 스레드에서 기존 호출을 지웁니다.

/C
현재 스레드의 기존 호출을 지우고 현재 스레드의 컨텍스트를 미해결 호출에 의해 저장된 컨텍스트로 다시 설정합니다.

Environment

모드

사용자 모드만

대상

라이브 디버깅만

플랫폼

x86 및 x64만

설명

지정된 함수는 현재 프로세스의 현재 스레드에 의해 호출됩니다.

cdecl, stdcall, fastcallthiscall 호출 규칙만 지원됩니다. 이 명령은 관리 코드를 호출할 수 없습니다.

.call을 사용한 후 디버거는 스택을 업데이트하고 명령 포인터를 호출된 함수의 시작을 가리키도록 변경한 다음 중지합니다. g(Go)를 사용하여 실행을 다시 시작하거나 ~. g를 사용하여 호출하는 스레드만 실행합니다.

함수가 반환되면 중단이 발생하고 디버거가 함수의 반환 값을 표시합니다. 반환 값은 반환 값의 형식을 획득하는 $callret 의사 레지스터에도 저장됩니다.

Ctrl+C 또는 Ctrl+BREAK를 사용하여 대상에 침입한 경우 현재 스레드는 브레이크인을 처리하기 위해 만든 추가 스레드입니다. 이 시점에서 .call 명령을 실행하면 호출된 함수에 추가 스레드가 사용됩니다.

미리 정의된 중단점에 도달한 경우 추가 중단 스레드가 없습니다. 사용자 모드의 중단점에서 .call 을 사용하는 경우 g 를 사용하여 전체 프로세스를 실행하거나 ~. g 를 사용하여 현재 스레드만 실행할 수 있습니다. g를 사용하면 하나의 스레드를 가져와서 이 새 함수로 전환했기 때문에 프로그램의 동작이 왜곡될 수 있습니다. 반면에 이 스레드에는 여전히 잠금 및 기타 특성이 있으므로 ~. g 는 교착 상태를 위험에 빠뜨릴 수 있습니다.

.call을 사용하는 가장 안전한 방법은 특정 함수를 안전하게 호출할 수 있는 위치에서 코드에 중단점을 설정하는 것입니다. 해당 중단점이 적중되면 해당 함수를 실행하려는 경우 .call 을 사용할 수 있습니다. 이 함수를 일반적으로 호출할 수 없는 지점에서 .call 을 사용하는 경우 교착 상태 또는 대상 손상이 발생할 수 있습니다.

기존 코드에서 호출되지 않지만 디버거에서 호출하기 위한 추가 함수를 소스 코드에 추가하는 것이 유용할 수 있습니다. 예를 들어 코드 및 해당 환경의 현재 상태를 조사하고 알려진 메모리 위치에 상태에 대한 정보를 저장하는 데 사용되는 함수를 추가할 수 있습니다. 코드를 최적화하지 마세요. 그렇지 않으면 컴파일러에서 이러한 함수를 제거할 수 있습니다. 애플리케이션이 충돌하는 경우 덤프 파일을 디버깅할 때 .call 을 사용할 수 없으므로 이 기술을 최후의 수단으로만 사용합니다.

.call /c.call /C 명령은 .call을 사용하지 못했거나 g 명령을 입력하기 전에 마음이 변경된 경우에만 사용해야 합니다. 완료되지 않은 호출을 중단하면 대상 상태가 손상될 수 있으므로 이러한 항목을 자연스럽게 사용하면 안 됩니다.

다음 코드 예제에서는 .call /s 명령을 사용하는 방법을 보여 있습니다.

.call /s KnownFunction UnknownFunction( 1 )

이 예제에서는 정수만 인수로 사용하고 배열에 대한 포인터를 반환하는 KnownFunction에 대한 프라이빗 기호가 있습니다. 기호가 없거나 UnknownFunction에 대한 공용 기호만 있을 수 있지만 정수는 유일한 인수로 사용하고 배열에 대한 포인터를 반환한다는 것을 알고 있습니다. /s 옵션을 사용하여 UnknownFunctionKnownFunction과 동일한 방식으로 작동되도록 지정할 수 있습니다. 따라서 UnknownFunction에 대한 호출을 성공적으로 생성할 수 있습니다.