WinDbg를 사용하여 함수의 인수 및 반환 값을 디버거에 출력

WinDbg를 사용하여 함수의 인수 및 반환 값을 디버거에 출력하는 방법



WinDbg에서는 브레이크 포인트 히트시에 새로운 브레이크 포인트를 작성할 수 있습니다.
또, 함수의 리턴 어드레스에 브레이크 포인트를 설치하는 것으로, 함수로부터 복귀한 직후에 브레이크시킬 수 있습니다.
이 기능을 사용하여 C 언어 함수의 인수와 반환 값을 디버거에 출력해 보겠습니다.

디버깅 대상 코드



계승을 요구하는 프로그램(factorial.exe)입니다.

factorial.c
#include <stdio.h>

// 階乗を求める
int factorial(int n)
{
    return n > 0 ? n * factorial(n - 1) : 1;
};

int main()
{
    int n = 6;
    int m = factorial(n);
    printf("%d!=%d\n", n, m);
    return 0;
}


브레이크 포인트 설정 방식



factorial.exe의 factorial 함수에 아래와 같은 브레이크 포인트를 설정해, 히트시에 함수의 리턴 어드레스에 브레이크 포인트를 작성하도록 하고 있습니다.
첫 번째 인수의 값은 esp + 4이고 반환 값은 eax로 가져옵니다.
 bp factorial!factorial "bp poi(esp) \" .printf /D \\\"[factorial]\\\\t%p\\\\t終了\\\\t%p\\\\n\\\", esp, eax;g\"; .printf /D \"[factorial]\\t%p\\t開始\\t%p\\n\", esp+4, poi(esp+4); g"

x64 빌드의 경우 rsp, ecx 등의 레지스터를 사용합니다.
bp factorial!factorial "bp poi(rsp) \" .printf /D \\\"[factorial]\\\\t%p\\\\t終了\\\\t%p\\\\n\\\", rsp, eax;g\"; .printf /D \"[factorial]\\t%p\\t開始\\t%p\\n\", rsp+8, ecx; g"

디버거 출력 결과



디버깅 대상 코드를 Visual Studio 2013에서 디버그 빌드하고 WinDbg에서 중단점을 설정하고 실행합니다.
CommandLine: "C:\Users\r\Documents\Visual Studio 2013\Projects\factorial\Debug\factorial.exe"
************* Symbol Path validation summary **************
Response                         Time (ms)     Location
Deferred                                       srv*c:\symbols*http://msdl.microsoft.com/downloads/symbols
Symbol search path is: srv*c:\symbols*http://msdl.microsoft.com/downloads/symbols
Executable search path is: 
ModLoad: 01180000 0119c000   factorial.exe
ModLoad: 77090000 771fe000   ntdll.dll
ModLoad: 76e70000 76fb0000   C:\Windows\SysWOW64\KERNEL32.DLL
ModLoad: 75170000 75247000   C:\Windows\SysWOW64\KERNELBASE.dll
ModLoad: 77620000 777df000   C:\Windows\SysWOW64\MSVCR120D.dll
(c48.1a64): Break instruction exception - code 80000003 (first chance)
eax=00000000 ebx=00000000 ecx=cb780000 edx=00000000 esi=7f29f000 edi=00000000
eip=77143bad esp=0046f428 ebp=0046f454 iopl=0         nv up ei pl zr na pe nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000246
ntdll!LdrpDoDebuggerBreak+0x2b:
77143bad cc              int     3
0:000> bp factorial!factorial "bp poi(esp) \" .printf /D \\\"[factorial]\\\\t%p\\\\t終了\\\\t%p\\\\n\\\", esp, eax;g\"; .printf /D \"[factorial]\\t%p\\t開始\\t%p\\n\", esp+4, poi(esp+4); g"
*** WARNING: Unable to verify checksum for factorial.exe
0:000> g
[factorial] 0046f77c    開始  00000006
[factorial] 0046f6a0    開始  00000005
breakpoint 2 redefined
[factorial] 0046f5c4    開始  00000004
breakpoint 2 redefined
[factorial] 0046f4e8    開始  00000003
breakpoint 2 redefined
[factorial] 0046f40c    開始  00000002
breakpoint 2 redefined
[factorial] 0046f330    開始  00000001
breakpoint 2 redefined
[factorial] 0046f254    開始  00000000
[factorial] 0046f254    終了  00000001
[factorial] 0046f330    終了  00000001
[factorial] 0046f40c    終了  00000002
[factorial] 0046f4e8    終了  00000006
[factorial] 0046f5c4    終了  00000018
[factorial] 0046f6a0    終了  00000078
[factorial] 0046f77c    終了  000002d0
eax=00000000 ebx=7718f820 ecx=00000000 edx=00000000 esi=00000000 edi=01191109
eip=770cc73c esp=0046f71c ebp=0046f7e8 iopl=0         nv up ei pl nz na po nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000202
ntdll!NtTerminateProcess+0xc:
770cc73c c20800          ret     8

factorial 함수의 인수 및 반환 값이 디버거에 출력되었습니다.
본 출력 결과는 아래와 같은 표로 정리할 수 있습니다.

좋은 웹페이지 즐겨찾기