StackWalk 함수(dbghelp.h)

스택 추적을 가져옵니다.

구문

BOOL IMAGEAPI StackWalk(
  [in]           DWORD                          MachineType,
  [in]           HANDLE                         hProcess,
  [in]           HANDLE                         hThread,
  [in, out]      LPSTACKFRAME                   StackFrame,
  [in, out]      PVOID                          ContextRecord,
  [in, optional] PREAD_PROCESS_MEMORY_ROUTINE   ReadMemoryRoutine,
  [in, optional] PFUNCTION_TABLE_ACCESS_ROUTINE FunctionTableAccessRoutine,
  [in, optional] PGET_MODULE_BASE_ROUTINE       GetModuleBaseRoutine,
  [in, optional] PTRANSLATE_ADDRESS_ROUTINE     TranslateAddress
);

매개 변수

[in] MachineType

스택 추적이 생성되는 컴퓨터의 아키텍처 유형입니다. 이 매개 변수는 다음 값 중 하나일 수 있습니다.

의미
IMAGE_FILE_MACHINE_I386
0x014c
Intel x86
IMAGE_FILE_MACHINE_IA64
0x0200
Intel Itanium
IMAGE_FILE_MACHINE_AMD64
0x8664
x64(AMD64 또는 EM64T)

[in] hProcess

스택 추적이 생성되는 프로세스에 대한 핸들입니다. 호출자가 ReadMemoryRoutine 매개 변수에 유효한 콜백 포인터를 제공하는 경우 이 값은 유효한 프로세스 핸들일 필요가 없습니다. StackWalk64 함수에 대한 모든 호출에 대해 고유하고 일관되게 동일한 토큰일 수 있습니다. 기호 처리기를 StackWalk64와 함께 사용하는 경우 각 함수에 대한 호출에 대해 동일한 프로세스 핸들을 사용합니다.

[in] hThread

스택 추적이 생성되는 스레드에 대한 핸들입니다. 호출자가 ReadMemoryRoutine 매개 변수에 유효한 콜백 포인터를 제공하는 경우 이 값은 유효한 스레드 핸들일 필요가 없습니다. StackWalk64 함수에 대한 모든 호출에 대해 고유하고 일관되게 동일한 토큰일 수 있습니다.

[in, out] StackFrame

STACKFRAME64 구조체에 대한 포인터입니다. 이 구조체는 함수 호출이 성공하면 다음 프레임에 대한 정보를 받습니다.

[in, out] ContextRecord

CONTEXT 구조체에 대한 포인터입니다. 이 매개 변수는 MachineType 매개 변수가 IMAGE_FILE_MACHINE_I386 않은 경우에만 필요합니다. 그러나 이 매개 변수에는 유효한 컨텍스트 레코드가 포함되어 있는 것이 좋습니다. 이를 통해 StackWalk64 는 더 다양한 상황을 처리할 수 있습니다.

이 컨텍스트는 수정될 수 있으므로 수정해서는 안 되는 컨텍스트 레코드를 전달하지 마세요.

[in, optional] ReadMemoryRoutine

메모리 읽기 서비스를 제공하는 콜백 루틴입니다. StackWalk64 함수가 프로세스의 주소 공간에서 메모리를 읽어야 하는 경우 ReadProcessMemoryProc64 콜백이 사용됩니다.

이 매개 변수가 NULL이면 함수는 기본 루틴을 사용합니다. 이 경우 hProcess 매개 변수는 유효한 프로세스 핸들이어야 합니다.

이 매개 변수가 NULL이 아닌 경우 애플리케이션은 CBA_READ_MEMORY 처리하는 기호 처리기 콜백 함수를 구현하고 등록해야 합니다.

[in, optional] FunctionTableAccessRoutine

프로세스에 대한 런타임 함수 테이블에 대한 액세스를 제공하는 콜백 루틴입니다. StackWalk64 함수는 프로세스의 런타임 함수 테이블에 액세스할 수 없기 때문에 이 매개 변수가 필요합니다. 자세한 내용은 FunctionTableAccessProc64를 참조하세요.

기호 처리기는 런타임 테이블을 로드하고 액세스하는 함수를 제공합니다. 이러한 함수를 사용하는 경우 SymFunctionTableAccess64 를 유효한 매개 변수로 전달할 수 있습니다.

[in, optional] GetModuleBaseRoutine

지정된 가상 주소에 대한 모듈 베이스를 제공하는 콜백 루틴입니다. 이 매개 변수는 필수입니다. 자세한 내용은 GetModuleBaseProc64를 참조하세요.

기호 처리기는 모듈 정보를 로드하고 유지 관리하는 함수를 제공합니다. 이러한 함수를 사용하는 경우 SymGetModuleBase64 를 유효한 매개 변수로 전달할 수 있습니다.

[in, optional] TranslateAddress

16비트 주소에 대한 주소 변환을 제공하는 콜백 루틴입니다. 자세한 내용은 TranslateAddressProc64를 참조하세요.

StackWalk64의 대부분의 호출자는 이 매개 변수에 대해 NULL을 안전하게 전달할 수 있습니다.

반환 값

함수가 성공하면 반환 값은 TRUE입니다.

함수가 실패하면 반환 값은 FALSE입니다. StackWalk64는 일반적으로 마지막 오류 코드를 설정하지 않습니다.

설명

StackWalk64 함수는 스택 추적을 가져오기 위한 이식 가능한 메서드를 제공합니다. 플랫폼에서 스택 걷기와 관련된 모든 복잡성 때문에 StackWalk64 함수를 사용하는 것이 좋습니다. 또한 모듈이 컴파일되는 방법에 따라 스택이 다르게 표시되도록 하는 컴파일러 옵션이 있습니다. 이 함수를 사용하면 애플리케이션에 컴파일러 및 운영 체제 변경으로 계속 작동하는 이식 가능한 스택 추적이 있습니다.

StackFrame 매개 변수에 전달된 STACKFRAME64 구조체의 AddrPC, AddrFrameAddrStack 멤버가 초기화되지 않으면 이 함수에 대한 첫 번째 호출이 실패합니다.

이 함수와 같은 모든 DbgHelp 함수는 단일 스레드입니다. 따라서 둘 이상의 스레드에서 이 함수로 호출하면 예기치 않은 동작이나 메모리 손상이 발생할 수 있습니다. 이를 방지하려면 둘 이상의 스레드에서 이 함수로의 모든 동시 호출을 동기화해야 합니다.

이 함수는 StackWalk 함수를 대체합니다. 자세한 내용은 업데이트된 플랫폼 지원을 참조하세요. StackWalk 는 DbgHelp.h에서 다음과 같이 정의됩니다.

#if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
#define StackWalk StackWalk64
#else
BOOL
IMAGEAPI
StackWalk(
    DWORD MachineType,
    __in HANDLE hProcess,
    __in HANDLE hThread,
    __inout LPSTACKFRAME StackFrame,
    __inout PVOID ContextRecord,
    __in_opt PREAD_PROCESS_MEMORY_ROUTINE ReadMemoryRoutine,
    __in_opt PFUNCTION_TABLE_ACCESS_ROUTINE FunctionTableAccessRoutine,
    __in_opt PGET_MODULE_BASE_ROUTINE GetModuleBaseRoutine,
    __in_opt PTRANSLATE_ADDRESS_ROUTINE TranslateAddress
    );

#endif

요구 사항

요구 사항
대상 플랫폼 Windows
헤더 dbghelp.h
라이브러리 DbgHelp.lib
DLL DbgHelp.dll
재배포 가능 파일 DbgHelp.dll 5.1 이상

추가 정보

CONTEXT

DbgHelp 함수

FunctionTableAccessProc64

GetModuleBaseProc64

ReadProcessMemoryProc64

STACKFRAME64

TranslateAddressProc64