Udostępnij za pośrednictwem


[Debugging Toolbox]Digging the Call Stack

https://blogs.msdn.com/debuggingtoolbox/archive/2007/03/18/windbg-script-digging-the-call-stack.aspx

글 : Roberto Alexis Farah
번역 : 이태화

안녕하세요 오랜만에 글을 번역해 보는군요 정말 많은 글들이 있는데 시간이 부족하여 많은 정보를 전달해 드리지 못해서 죄송 ^^;

--------------------------------------------------------------------------------

Windbg 는 많은 command 와 command 변형을 가지고 있어서 command 을 잊어 버리기도 합니다. 예를 들어 call stack 에서 보다 많은 정보를 얻고자 하는데 command 가 기억나지 않을때 call stack 정보를 자세히 보는 command 는 기억하고 있는데 전체 stack 을 보고자 할때 stack 정보, local 변수 정보등을 command 를 type 하지 않고 빠르게 보고자 할때..

이런 시나리오에 적합한 script 를 제공하고자 합니다.

이 script 는 call stack 에서 아래의 정보를 빠르게 볼 수 있게 해줍니다.
-      ANSI strings.
-      Unicode strings.
-      Symbols.
-      Pointer 참조.
-      해당 frame 의 Local 변수variables by frames.  (symbol 이 있어야 합니다.)

Interface 는 매우 간단하나 멋집니다.. 저는 GUI 팀에 있지 않습니다.

아래에는 두개의 screenshot 이 있습니다.

코드 설명 :
d 명령과 k 명령을 사용하여 현재의 stack 부터 stackbase 까지 메모리와 stack 보여주는 예제입니다.

참고

d - memory 를 보여주는 명령
dp - computer 의 pointer-size 에 맞게 메모리를 보여주는 명령 32Bit 에서는 4byte 64Bit 에서는 8Byte
du - Unicode 로 보여주기
da - ASCII 로 보여주기
s - Symbol 보여주기

k - stack frame 을 보여주는 명령
kp - stack 의 모든 parameter 를 보여줍니다.
M - 이것에 대한 설명은 Windbg Help 에 없네요

$csp  현재 call stack pointer.
x86-based processors: The same as esp.
Itanium-based processors: The same as bsp.
x64-based processors: The same as rsp. 
$teb  The address of the thread environment block (TEB) of the current thread.

ad : 별명 삭제 이 예제에서는 ScriptName 을 삭제

@$teb+0x4 는 StackBase 값이다.
1: kd> dt _TEB
ntdll!_TEB
   +0x000 NtTib            : _NT_TIB
1: kd> dt _nt_tib
BTScan!_NT_TIB
   +0x000 ExceptionList    : Ptr32 _EXCEPTION_REGISTRATION_RECORD
   +0x004 StackBase        : Ptr32 Void
Source code - DIG_STACK.TXT:
$$
$$ =============================================================================
$$ Dig information from the current call stack: 
$$ - Unicode Strings
$$ - ANSI Strings
$$ - Symbols
$$ - Pointer references
$$ - Local variables by frames
$$
$$ Compatibility: Win32, should work on Win64.
$$
$$ Usage: $$>< to run the script.
$$
$$ If necessary change the filename below to include your path and filename.
$$ By default it uses the WinDbg path and the default file name is DIG_STACK.TXT
$$
$$ Roberto Alexis Farah
$$ Blog: https://blogs.msdn.com/debuggingtoolbox/
$$
$$ All my scripts are provided "AS IS" with no warranties, and confer no rights.
$$ =============================================================================
$$
ad /q *
.block
{
    as ScriptName MYSCRIPTS\\DIG_STACK.txt
}
.block
{
    .printf /D "<link cmd=\"dpu @$csp poi(@$teb+0x4);ad /q *; $$><${ScriptName}\"><b>Unicode Strings</b></link>\n\n"
    .printf /D "<link cmd=\"dpa @$csp poi(@$teb+0x4);ad /q *; $$><${ScriptName}\"><b>ANSI Strings</b></link>\n\n"
    .printf /D "<link cmd=\"dps @$csp poi(@$teb+0x4);ad /q *; $$><${ScriptName}\"><b>Symbols</b></link>\n\n"   
    .printf /D "<link cmd=\"dpp @$csp poi(@$teb+0x4);ad /q *; $$><${ScriptName}\"><b>Pointer References</b></link>\n\n"
    .printf /D "<link cmd=\"kpM 2000;ad /q *; $$><${ScriptName}\"><b>Local Variables by Frames</b></link>\n"      
}
$$ ===========================================================================