공용, 전역 및 로컬 기호

DbgHelp API의 기호 처리 기능은 수년에 걸쳐 발전해 왔습니다. 코드가 다양한 시나리오에서 작동하고 기호에 대한 전체 세부 정보를 제공하는지 확인하려면 가능할 때마다 최신 함수를 사용합니다. 예를 들어, SymEnumSymbolsSymEnumerateSymbols64를 대체하고 SymFromNameSymGetSymFromName64를 대체합니다. SymFromAddrSymGetSymFromAddr64를 대체합니다.

공용 기호

DbgHelp.dll의 초기 버전은 공용 기호만 검사하도록 지원했습니다. 이러한 기호는 서로 다른 원본 파일 간에 노출되어야 하는 코드의 모든 항목에 대해 생성됩니다. 또한 모듈에서 내보낸 모든 항목도 포함됩니다.

기호는 이미지에 포함되거나 .dbg 또는 .pdb 파일에 별도로 저장됩니다. 저장된 유일한 정보는 기호 이름과 주소입니다. 이름은 데코레이트된 이름으로 사용할 수 있습니다. 데코레이트되지 않은 이름을 보려면 SYMOPT_UNDNAME으로 SymSetOptions 함수를 호출하거나 UnDecorateSymbolName 함수를 사용합니다.

DbgHelp API는 처음에 모듈 내에서 동일한 기호의 여러 인스턴스를 지원하도록 설계되지 않았습니다. 이는 공용 기호가 모듈 내에서 고유한 이름으로 제한되기 때문입니다. 따라서 SymGetSymFromName64는 일치하는 첫 번째 기호만 반환합니다. 일치하는 모든 기호를 검색하려면 SymEnumSymbols를 호출합니다.

글로벌 및 로컬 기호

최신 버전의 DbgHelp.dll은 .pdb 파일을 사용할 때 전역 및 로컬 기호를 지원합니다. 이러한 새 버전에는 정적 함수, 원본 파일 내에서 범위가 지정된 함수, 함수 매개 변수 및 지역 변수가 포함됩니다. DbgHelp는 기호를 검색할 때 공용 기호 테이블을 확인하기 전에 전역 및 로컬 기호 테이블을 확인합니다. 공용 기호에 사용할 수 있는 것보다 이러한 형식의 기호에 사용할 수 있는 정보가 더 많기 때문입니다.

전역 및 지역 기호는 데코레이트되지 않은 이름으로 저장됩니다. 따라서 SYMOPT_UNDNAME 플래그는 효과가 없습니다. 데코레이트된 기호 이름을 가져오려면 SYMOPT_PUBLICS_ONLY 플래그를 사용해야 합니다. 이로 인해 DbgHelp는 공용 기호만 검색합니다.

로컬 기호 또는 함수 매개 변수를 보려면 IMAGEHLP_STACK_FRAME 구조체의 InstructionOffset 멤버와 함께 SymSetContext 함수를 호출합니다. 모든 함수 기호의 주소로 설정됩니다. SymFromNameSymEnumSymbols에 대한 후속 호출은 이 주소의 컨텍스트 내에서 작동할 수 있습니다. 이렇게 하려면 BaseOfDll 매개 변수를 NULL로 설정하고 Name 또는 Mask 매개 변수에서 모듈 지정자를 생략합니다. 이렇게 하면 DbgHelp가 SymSetContext로 표시된 범위 내에서 일치하는 기호를 검색하게 됩니다.

기호가 매개 변수인지 확인하려면 SYMBOL_INFO 구조체의 Flags 멤버를 확인합니다. 기호가 매개 변수인 경우 멤버에 SYMFLAG_PARAMETER가 포함됩니다. 로컬 기호인 경우 멤버에 SYMFLAG_LOCAL이 포함됩니다.