추가 DBH 예제
다음은 DBH 프롬프트에서 실행할 수 있는 명령의 추가 예제입니다.
프라이빗 기호 및 공용 기호 표시
대상이 전체 기호 파일인 경우 각 공용 기호가 파일에 두 번 표시됩니다. 공용 기호 테이블 및 프라이빗 기호 데이터에 표시됩니다. 공용 기호 테이블의 복사본에는 종종 다양한 장식(접두사 및 접미사)이 포함되어 있습니다. 자세한 내용은 공용 및 프라이빗 기호를 참조하세요.
DBH는 개인 기호 데이터, 장식이 없는 공용 기호 테이블 및 장식이 있는 공용 기호 테이블에서 이 기호에 대한 정보를 표시할 수 있습니다. 다음은 매번 명령 addr 414fe0 을 사용하여 이 세 가지가 모두 표시되는 예제입니다.
이 예제에 이 명령이 처음 표시되면 DBH는 기본 기호 옵션을 사용하므로 결과 정보는 프라이빗 기호 데이터에서 가져옵니다. 이 정보에는 함수 fgets의 주소, 크기 및 데이터 형식이 포함됩니다. 그런 다음 symopt +4000 명령을 사용하여 SYMOPT_PUBLICS_ONLY 옵션을 설정합니다. 이로 인해 DBH는 프라이빗 기호 데이터를 무시하므로 addr 414fe0 명령을 두 번째로 실행할 때 DBH는 공용 기호 테이블을 사용하고 함수 fgets에 대한 크기 또는 데이터 형식 정보가 표시되지 않습니다. 마지막으로 명령 symopt -2가 사용되어 SYMOPT_UNDNAME 옵션을 끄고 DBH에 장식이 포함됩니다. addr 414fe0이 마지막 시간에 실행되면 데코레이트된 버전의 함수 이름이 _fgets 표시됩니다.
pid:4308 mod:TimeTest[400000]: addr 414fe0
fgets
name : fgets
addr : 414fe0
size : 113
flags : 0
type : 7e
modbase : 400000
value : 0
reg : 0
scope : SymTagNull (0)
tag : SymTagFunction (5)
index : 7d
pid:4308 mod:TimeTest[400000]: symopt +4000
Symbol Options: 0x10c13
Symbol Options: 0x14c13
pid:4308 mod:TimeTest[400000]: addr 414fe0
fgets
name : fgets
addr : 414fe0
size : 0
flags : 0
type : 0
modbase : 400000
value : 0
reg : 0
scope : SymTagNull (0)
tag : SymTagPublicSymbol (a)
index : 7f
pid:4308 mod:TimeTest[400000]: symopt -2
Symbol Options: 0x14c13
Symbol Options: 0x14c11
pid:4308 mod:TimeTest[400000]: addr 414fe0
_fgets
name : _fgets
addr : 414fe0
size : 0
flags : 0
type : 0
modbase : 400000
value : 0
reg : 0
scope : SymTagNull (0)
tag : SymTagPublicSymbol (a)
index : 7f
-d 명령줄 옵션을 사용한 경우 결과는 처음부터 데코레이트된 공용 이름을 표시했을 것입니다.
특정 기호의 장식 확인
DBH는 특정 기호의 장식을 확인할 수 있습니다. PDBCopy와 같은 장식으로 기호를 지정해야 하는 프로그램과 함께 사용할 때 유용할 수 있습니다.
예를 들어 기호 파일 mysymbols.pdb에 이름이 MyFunction1인 기호가 포함되어 있다고 가정해 보겠습니다. 데코레이트된 이름을 찾으려면 다음 절차를 사용합니다.
먼저 -d 명령줄 옵션 없이 DBH를 시작한 다음, 모든 정보가 공용 기호 테이블에서 제공되도록 symopt +4000 명령을 사용합니다.
C:\> dbh c:\mydir\mysymbols.pdb
mysymbols [1000000]: symopt +4000
Symbol Options: 0x10c13
Symbol Options: 0x14c13
다음으로 이름 명령 또는 열거형 명령을 사용하여 원하는 기호의 주소를 표시합니다.
mysymbols [1000000]: enum myfunction1
index address name
2ab 102cb4e : MyFunction1
이제 symopt -2를 사용하여 기호 장식을 표시한 다음, 이 기호의 주소와 함께 addr 명령을 사용합니다.
mysymbols [1000000]: symopt -2
Symbol Options: 0x14c13
Symbol Options: 0x14c11
mysymbols [1000000]: addr 102cb4e
_MyFunction1@4
name : _InterlockedIncrement@4
addr : 102cb4e
size : 0
flags : 0
type : 0
modbase : 1000000
value : 0
reg : 0
scope : SymTagNull (0)
tag : SymTagPublicSymbol (a)
index : 2ab
그러면 기호의 데코레이트된 이름이 _MyFunction1@4.
기호 장식 디코딩
undec 명령을 사용하여 C++ 기호 장식의 의미를 표시할 수 있습니다. 다음 예제에서 장식은 ?? _C@_03GGCAPAJC@Sep?$AA@은 문자열임을 나타내기 위해 디코딩됩니다.
dbh: undec ??_C@_03GGCAPAJC@Sep?$AA@
??_C@_03GGCAPAJC@Sep?$AA@ =
`string'
다음 예제에서는 세 개의 함수 이름에 연결된 장식을 디코딩하여 프로토타입을 표시합니다.
dbh: undec ?gcontext@@3_KA
?gcontext@@3_KA =
unsigned __int64 gcontext
dbh: undec ?pathcpy@@YGXPAGPBG1K@Z
?pathcpy@@YGXPAGPBG1K@Z =
void __stdcall pathcpy(unsigned short *,unsigned short const *,unsigned short const *,unsigned long)
dbh: undec ?_set_new_handler@@YAP6AHI@ZP6AHI@Z@Z
?_set_new_handler@@YAP6AHI@ZP6AHI@Z@Z =
int (__cdecl*__cdecl _set_new_handler(int (__cdecl*)(unsigned int)))(unsigned int)
undec 명령은 함수 이름에 일반적으로 연결되는 초기 밑줄, 접두사 __imp_ 또는 후행 "@주소" 장식에 대한 정보를 표시하지 않습니다.
현재 로드된 모듈의 기호 이름뿐만 아니라 문자열과 함께 undec 명령을 사용할 수 있습니다.
주소별로 기호 목록 정렬
주소 순서로 정렬된 기호 목록을 원하는 경우 일괄 처리 모드에서 DBH를 실행하고 결과를 정렬 명령으로 파이프할 수 있습니다. 주소 값은 일반적으로 각 줄의 18번째 열에서 시작되므로 다음 명령은 결과를 주소별로 정렬합니다.
dbh -p:4672 enum mymodule!* | sort /+18
원본 줄 정보 표시
전체 기호 파일을 사용하는 경우 DBH는 원본 줄 정보를 표시할 수 있습니다. 이 정보는 기호 파일 자체에 저장되므로 원본 파일에 액세스할 필요가 없습니다.
여기서 줄 명령은 지정된 소스 줄 에 해당하는 이진 명령의 16진수 주소를 표시하고 해당 줄과 연결된 기호를 표시합니다. (이 예제에서는 선과 연결된 기호가 없습니다.)
dbh [1000000]: line myprogram.cpp#767
file : e:\mydirectory\src\myprogram.cpp
line : 767
addr : 1006191
key : 0000000000000000
disp : 0
여기서 srclines 명령은 지정된 소스 줄과 연결된 개체 파일을 표시합니다.
dbh [1000000]: srclines myprogram.cpp 767
0x1006191: e:\mydirectory\objchk\amd64\myprogram.obj
line 767 e:\mydirectory\src\myprogram.cpp
srclines의 출력은 ln(가장 가까운 기호 나열) 디버거 명령의 출력과 비슷합니다.
데이터 형식 표시
형식 명령을 사용하여 데이터 형식에 대한 정보를 표시할 수 있습니다. 여기서는 CMDPROC 형식에 대한 데이터를 표시합니다.
dbh [1000000]: type CMDPROC
name : CMDPROC
addr : 0
size : 8
flags : 0
type : c
modbase : 1000000
value : 0
reg : 0
scope : SymTagNull (0)
tag : SymTagTypedef (11)
index : c
"태그" 다음에 나열된 값은 이 데이터 형식의 특성을 지정합니다. 이 경우 SymTagTypedef 는 이 형식이 typedef 문을 사용하여 정의되었음을 나타냅니다.
가상 기호 사용
add 명령은 로드된 모듈에 가상 기호를 추가할 수 있습니다. 실제 기호 파일은 변경되지 않습니다. DBH의 메모리에 있는 해당 파일의 이미지만 변경됩니다.
add 명령은 지정된 주소 범위와 연결된 기호를 일시적으로 재정의하려는 경우에 유용할 수 있습니다. 다음 예제에서는 MyModule!기본 연결된 주소 범위의 일부가 가상 기호 MyModule!magic으로 재정의됩니다.
가상 기호가 추가되기 전에 모듈이 표시되는 방법은 다음과 같습니다. 기본 함수는 0x0042CC56 시작하며 크기가 0x42B. 따라서 addr 명령을 주소 0x0042CD10 사용하면 이 주소가 기본 함수의 경계 내에 있는 것으로 인식됩니다.
pid:6040 mod:MyModule[400000]: enum timetest!ma*
index address name
1 42cc56 : main
3 415810 : malloc
5 415450 : mainCRTStartup
pid:6040 mod:MyModule[400000]: addr 42cc56
main
name : main
addr : 42cc56
size : 42b
flags : 0
type : 2
modbase : 400000
value : 0
reg : 0
scope : SymTagNull (0)
tag : SymTagFunction (5)
index : 1
pid:6040 mod:MyModule[400000]: addr 42cd10
main+ba
name : main
addr : 42cc56
size : 42b
flags : 0
type : 2
modbase : 400000
value : 0
reg : 0
scope : SymTagNull (0)
tag : SymTagFunction (5)
index : 1
이제 기호 매직 은 크기가 0x10 바이트인 주소 0x0042CD00 추가됩니다. 열거형 명령을 사용하면 인덱스에서 상위 비트가 설정되어 가상 기호임을 보여 줌:
pid:6040 mod:MyModule[400000]: add magic 42cd00 10
pid:6040 mod:MyModule[400000]: enum timetest!ma*
index address name
1 42cc56 : main
3 415810 : malloc
5 415450 : mainCRTStartup
80000001 42cd00 : magic
addr 명령을 사용하면 범위가 지정된 주소를 포함하는 기호를 찾습니다. 이 검색은 지정된 주소로 시작하고 뒤로 실행되므로 이제 0x004CD10 주소가 매직과 연결됩니다. 반면에 0x004CD40 주소는 매직 기호의 범위 밖에 있기 때문에 여전히 기본 연결됩니다. 또한 SymTagCustom 태그는 가상 기호를 나타냅니다.
pid:6040 mod:MyModule[400000]: addr 42cd10
magic+10
name : magic
addr : 42cd00
size : 10
flags : 1000
type : 0
modbase : 400000
value : 0
reg : 0
scope : SymTagNull (0)
tag : SymTagCustom (1a)
index : 80000001
pid:6040 mod:MyModule[400000]: addr 42cd40
main+ea
name : main
addr : 42cc56
size : 42b
flags : 0
type : 2
modbase : 400000
value : 0
reg : 0
scope : SymTagNull (0)
tag : SymTagFunction (5)
index : 1
마지막으로 del 명령은 기호 매직을 삭제하여 모든 기호를 원래 범위로 반환할 수 있습니다.
pid:6040 mod:MyModule[400000]: del magic
pid:6040 mod:MyModule[400000]: enum timetest!ma*
index address name
1 42cc56 : main
3 415810 : malloc
5 415450 : mainCRTStartup
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기